buildframework/helium/sf/python/blockspackager/lib/blockspackagertests/test_packager_datasources.py
changeset 645 b8d81fa19e7d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/blockspackagertests/test_packager_datasources.py	Sun Oct 10 15:22:15 2010 +0300
@@ -0,0 +1,377 @@
+#============================================================================ 
+#Name        : test_packager_datasources.py 
+#Part of     : Helium 
+
+#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+#All rights reserved.
+#This component and the accompanying materials are made available
+#under the terms of the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+import unittest
+from unittestadditions import skip
+skipTest = False
+try:
+    import packager.datasources
+except ImportError:
+    skipTest = True
+import os
+from StringIO import StringIO
+import tempfile
+import xml.sax
+import logging
+import sys
+
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('nokiatest.datasources')
+
+class DataSourceInterfaceTest(unittest.TestCase):
+    """ Verifying the datasource interface. """
+    
+    @skip(skipTest)
+    def test_datasource_getComponent(self):
+        """ Check that getComponent is not implemented. """
+        ds = packager.datasources.DataSource('/')
+        self.assertRaises(NotImplementedError, ds.getComponents)
+
+    @skip(skipTest)
+    def test_datasource_getHelp(self):
+        """ Check that no help is defined. """
+        ds = packager.datasources.DataSource('/')
+        self.assertEqual(None, ds.getHelp())
+        self.assertEqual(ds.help, ds.getHelp())       
+    
+class CMakerDataSourceTest(unittest.TestCase):
+    """ Unit test for CMakerDataSource """
+    @skip(skipTest)
+    def test_whatlog_missing(self):
+        """ getComponent should fail if whatlog is missing. """
+        data = {}
+        ds = packager.datasources.CMakerDataSource('/', data)
+        self.assertRaises(packager.datasources.MissingProperty, ds.getComponents)
+        
+    @skip(skipTest)
+    def test_configdir_missing(self):
+        """ getComponent should fail if configdir is missing. """
+        data = {'whatlog': 'somevalue'}
+        ds = packager.datasources.CMakerDataSource('/', data)
+        self.assertRaises(packager.datasources.MissingProperty, ds.getComponents)
+    
+    @skip(skipTest)
+    def test_invalid_whatlog_invalid_configdir(self):
+        """ getComponent should fail because whatlog doesn't exists. """
+        data = {'whatlog': 'somevalue', 'configdir': 'somevalue'}
+        ds = packager.datasources.CMakerDataSource('/', data)
+        self.assertRaises(Exception, ds.getComponents)
+
+    @skip(skipTest)
+    def test_valid_whatlog_invalid_configdir(self):
+        """ getComponent should fail because configdir doesn't exists. """
+        data = {'whatlog': __file__, 'configdir': 'somevalue'}
+        ds = packager.datasources.CMakerDataSource('/', data)
+        self.assertRaises(Exception, ds.getComponents)
+        
+    @skip(skipTest)
+    def test_install_log_parsing(self):
+        """ Test the parsing of a regular cmaker install log. """
+        log = r"""C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/env.mk),q(/epoc32/tools/cmaker/env.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/functions.mk),q(/epoc32/tools/cmaker/functions.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/include_template.mk),q(/epoc32/tools/cmaker/include_template.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/settings.mk),q(/epoc32/tools/cmaker/settings.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/tools.mk),q(/epoc32/tools/cmaker/tools.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/utils.mk),q(/epoc32/tools/cmaker/utils.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(bin/mingw_make.exe),q(/epoc32/tools/rom/mingw_make.exe))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/cmaker.cmd),q(/epoc32/tools/cmaker.cmd))'
+"""
+        (handle, filename) = tempfile.mkstemp()
+        os.write(handle, log)
+        os.close(handle)
+        
+        data = {'whatlog': filename, 'configdir': os.path.dirname(__file__)}
+        ds = packager.datasources.CMakerDataSource('/', data)
+        components = ds.getComponents()
+        assert len(components) == 1
+        assert len(components[0].getTargetFiles()) == 8
+        assert 'epoc32/tools/rom/mingw_make.exe' in components[0].getTargetFiles()
+        
+        os.remove(filename)
+        
+        
+    @skip(skipTest)
+    def test_what_log_parsing_windows(self):
+        """ Test the parsing of a regular cmaker what log (windows). """
+        if sys.platform == 'win32':
+            log = r"""\epoc32\tools\rom\image.txt
+\CreateImage.cmd
+cd \config\overlay && xcopy *.* \ /F /R /Y /S
+0 File(s) copied
+cd \tools\toolsmodTB92 && xcopy *.* \ /F /R /Y /S
+Y:\tools\toolsmodTB92\epoc32\tools\abld.pl -> Y:\epoc32\tools\abld.pl
+Y:\tools\toolsmodTB92\epoc32\tools\bldmake.pl -> Y:\epoc32\tools\bldmake.pl
+"""
+            (handle, filename) = tempfile.mkstemp()
+            os.write(handle, log)
+            os.close(handle)
+            
+            data = {'whatlog': filename, 'configdir': os.path.dirname(__file__)}
+            ds = packager.datasources.CMakerDataSource('/', data)
+            components = ds.getComponents()
+            assert len(components) == 1
+            assert len(components[0].getTargetFiles()) == 2
+            print components[0].getTargetFiles()
+            assert 'CreateImage.cmd' in components[0].getTargetFiles()
+            assert 'epoc32/tools/rom/image.txt' in components[0].getTargetFiles()
+            assert 'epoc32/tools/abld.pl' not in components[0].getTargetFiles()
+            assert 'epoc32/tools/bldmake.pl' not in components[0].getTargetFiles()
+        
+            os.remove(filename)
+
+    @skip(skipTest)
+    def test_what_log_parsing_linux(self):
+        """ Test the parsing of a regular cmaker what log (linux). """
+        if sys.platform != 'win32':
+            log = r"""/epoc32/tools/rom/image.txt
/CreateImage.cmd
+"""
+            (handle, filename) = tempfile.mkstemp()
+            os.write(handle, log)
+            os.close(handle)
+        
+            data = {'whatlog': filename, 'configdir': os.path.dirname(__file__)}
+            ds = packager.datasources.CMakerDataSource('/', data)
+            components = ds.getComponents()
+            assert len(components) == 1
+            assert len(components[0].getTargetFiles()) == 2
+            print components[0].getTargetFiles()
+            assert 'CreateImage.cmd' in components[0].getTargetFiles()
+            assert 'epoc32/tools/rom/image.txt' in components[0].getTargetFiles()
+        
+            os.remove(filename)
+
+        
+    @skip(skipTest)
+    def test_getHelp(self):
+        """ Check that help is defined for CMakerDataSource. """
+        ds = packager.datasources.CMakerDataSource('/', {})
+        self.assertNotEqual(None, ds.getHelp())
+        self.assertEqual(ds.help, ds.getHelp())       
+
+
+class SBSDataSourceTest(unittest.TestCase):
+    """ Unit test case for SBSDataSource """
+    @skip(skipTest)
+    def test_getHelp(self):
+        """ Check that help is defined for SBSDataSource. """
+        ds = packager.datasources.SBSDataSource('/', {})
+        self.assertNotEqual(None, ds.getHelp())
+        self.assertEqual(ds.help, ds.getHelp())       
+
+
+class SysdefComponentListTest(unittest.TestCase):
+    """ Unit test case for packager.datasources.sbs.SysdefComponentList """
+    sysdef = None
+        
+    def setUp(self):
+        self.sysdef = StringIO("""<?xml version=\"1.0\" encoding=\"UTF-8\"?>
+<SystemDefinition name="main" schema="1.4.0">
+    <systemModel>
+    <layer name="layer1">
+        <module name="module1">
+            <component name="cmp1">
+                <unit unitID="unit1" name="unit1.name" mrp="" filter="" bldFile="path/to/component1"/>
+            </component>
+        </module>
+    </layer>
+    <layer name="layer2">
+        <module name="module2">
+            <component name="cmp2">
+                <unit unitID="unit2" name="unit2.name" mrp="" filter="" bldFile="path\\to\\Component2"/>
+            </component>
+        </module>
+    </layer>
+    </systemModel>
+</SystemDefinition>
+""")
+
+    @skip(skipTest)
+    def test_unit_parsing(self):
+        """ SysdefComponentList extract correctly the units... """
+        cl = packager.datasources.sbs.SysdefComponentList('/')
+        p = xml.sax.make_parser()
+        p.setContentHandler(cl)
+        p.parse(self.sysdef)
+        assert len(cl) == 2
+        assert cl['unit1_name']['path'] == os.path.normpath('/path/to/component1')
+        assert cl['unit2_name']['path'] == os.path.normpath('/path/to/Component2')
+        assert cl['unit2_name']['name'] == 'unit2_name'
+
+    @skip(skipTest)
+    def test_get_component_name_by_path(self):
+        """ Check if get_component_name_by_path is case unsensitive. """ 
+        cl = packager.datasources.sbs.SysdefComponentList('/')
+        p = xml.sax.make_parser()
+        p.setContentHandler(cl)
+        p.parse(self.sysdef)
+
+        # reading path should be case independent.
+        assert cl.get_component_name_by_path(os.path.normpath('/path/to/Component2')) == 'unit2_name'
+        assert cl.get_component_name_by_path(os.path.normpath('/path/to/component2')) == 'unit2_name'
+
+    @skip(skipTest)
+    def test_get_component_name_by_path_invalid(self):
+        """ Check that get_component_name_by_path is raising an exception if """
+        cl = packager.datasources.sbs.SysdefComponentList('/')
+        p = xml.sax.make_parser()
+        p.setContentHandler(cl)
+        p.parse(self.sysdef)
+
+        # reading path should be case independent.
+        try:
+            cl.get_component_name_by_path(os.path.normpath('/path/to/invalid'))
+        except packager.datasources.sbs.ComponentNotFound:
+            pass
+        else:
+            self.fail("Expected get_component_name_by_path to raise an exception in case of non-existing component definition.")
+
+
+class SysdefComponentListSysdef3ParsingTest(unittest.TestCase):
+    """ Unit test case for packager.datasources.sbs.SysdefComponentList """
+    sysdef = None
+        
+    def setUp(self):
+        self.sysdef = StringIO("""<?xml version="1.0" encoding="UTF-8"?>
+<SystemDefinition schema="3.0.0" id-namespace="http://www.symbian.org/system-definition">
+<systemModel name="sf_">
+<layer id="app" name="app">
+<package id="helloworldcons" name="helloworldcons" levels="demo">
+<collection id="helloworldcons_apps" name="helloworldcons_apps" level="demo">
+<component id="helloworldcons_app" name="helloworldcons app" purpose="development">
+<unit bldFile="/sf/app/helloworldcons/group" mrp="/sf/app/helloworldcons/"/>
+</component>
+</collection>
+</package>
+</layer>
+<layer id="mw" name="mw">
+<package id="helloworldapi" name="helloworldapi" levels="demo">
+<collection id="helloworld_apis" name="helloworlds APIs" level="demo">
+<component id="helloworld_api" name="Hello World API" purpose="development">
+<unit bldFile="/sf/mw/helloworldapi/group" mrp="/sf/mw/helloworldapi/"/>
+</component>
+</collection>
+</package>
+</layer>
+</systemModel>
+</SystemDefinition>
+""")
+
+    @skip(skipTest)
+    def test_unit_parsing(self):
+        """ SysdefComponentList extract correctly the units... """
+        cl = packager.datasources.sbs.SysdefComponentList('/')
+        p = xml.sax.make_parser()
+        p.setContentHandler(cl)
+        p.parse(self.sysdef)
+        assert len(cl) == 2
+        print cl
+        assert cl['helloworldcons_app_sf_app_helloworldcons_group']['path'] == os.path.normpath('/sf/app/helloworldcons/group')
+        assert cl['helloworld_api_sf_mw_helloworldapi_group']['path'] == os.path.normpath('/sf/mw/helloworldapi/group')
+        assert cl['helloworld_api_sf_mw_helloworldapi_group']['name'] == 'helloworld_api'
+
+    @skip(skipTest)
+    def test_get_component_name_by_path(self):
+        """ Check if get_component_name_by_path is case unsensitive. """ 
+        cl = packager.datasources.sbs.SysdefComponentList('/')
+        p = xml.sax.make_parser()
+        p.setContentHandler(cl)
+        p.parse(self.sysdef)
+
+        # reading path should be case independent.
+        assert cl.get_component_name_by_path(os.path.normpath('/sf/app/helloworldcons/group')) == 'helloworldcons_app_sf_app_helloworldcons_group'
+        assert cl.get_component_name_by_path(os.path.normpath('/sf/mw/helloworldapi/group')) == 'helloworld_api_sf_mw_helloworldapi_group'
+
+    @skip(skipTest)
+    def test_get_component_name_by_path_invalid(self):
+        """ Check that get_component_name_by_path is raising an exception if """
+        cl = packager.datasources.sbs.SysdefComponentList('/')
+        p = xml.sax.make_parser()
+        p.setContentHandler(cl)
+        p.parse(self.sysdef)
+
+        # reading path should be case independent.
+        try:
+            cl.get_component_name_by_path(os.path.normpath('/path/to/invalid'))
+        except packager.datasources.sbs.ComponentNotFound:
+            pass
+        else:
+            self.fail("Expected get_component_name_by_path to raise an exception in case of non-existing component definition.")
+
+
+class ObyParserTest(unittest.TestCase):
+    """ Unit test case for packager.datasources.imaker.ObyParser """
+    oby = None
+    
+    def setUp(self):
+        (hld, filename) = tempfile.mkstemp(".oby", "datasource_test")
+        os.write(hld, """
+rofssize=0x10000000
+# file=\\epoc32\\release\\ARMV5\\urel\\COMMENT.DLL       "Sys\\Bin\\EDISP.DLL"
+file=\\epoc32\\release\\ARMV5\\urel\\edisp.dll       "Sys\\Bin\\EDISP.DLL"
+data=\\epoc32\\data\\Z\\Private\\10202BE9\\20000585.txt       "Private\\10202BE9\\20000585.txt"
+extension[0x09080004]=\\epoc32\\release\ARMV5\urel\power_resources.dll      "Sys\\Bin\\power_resources.dll"
+variant[0x09080004]=\\epoc32\\release\\ARMV5\\urel\\ecust.b23b7726cf4b5801b0dc14102b245fb8.dll         "Sys\\Bin\\ecust.dll"
+# file="\\epoc32\\release\\ARMV5\\urel\\edisp.dll"       "Sys\\Bin\\EDISP.DLL"
+data="/output/release_flash_images/langpack_01/rofs2/variant/private/10202be9/10281872.txt"  "private\10202be9\10281872.txt"
+""")
+        os.close(hld)
+        self.oby = filename
+        
+    def tearDown(self):
+        os.remove(self.oby)
+        
+    @skip(skipTest)
+    def test_oby(self):
+        """ Testing the extraction of source files from an processed Oby file. """
+        print self.oby
+        p = packager.datasources.imaker.ObyParser('/', self.oby)
+        files = p.getSourceFiles()
+        print files
+        assert len(files) == 5
+        assert os.path.normpath(r'\epoc32\release\ARMV5\urel\edisp.dll'.replace('\\', os.sep).replace('/', os.sep)) in files
+        assert os.path.normpath(r'\epoc32\data\Z\Private\10202BE9\20000585.txt'.replace('\\', os.sep).replace('/', os.sep)) in files
+        assert os.path.normpath(r'\epoc32\release\ARMV5\urel\power_resources.dll'.replace('\\', os.sep).replace('/', os.sep)) in files
+        assert os.path.normpath(r'\epoc32\release\ARMV5\urel\ecust.b23b7726cf4b5801b0dc14102b245fb8.dll'.replace('\\', os.sep).replace('/', os.sep)) in files
+        assert os.path.normpath(r'/output/release_flash_images/langpack_01/rofs2/variant/private/10202be9/10281872.txt'.replace('\\', os.sep).replace('/', os.sep)) in files
+        
+
+class ConEDataSourceTest(unittest.TestCase):
+    """ ConfToolDataSource unittest. """
+    
+    @skip(skipTest)
+    def test_cone_input(self):
+        """ Testing ConE output log parsing. """
+        log = """  Generating file '\\epoc32\\release\\winscw\\urel\\z\\private\\10202BE9\\10208dd7.txt'...
+DEBUG   : cone.crml(assets/symbianos/implml/usbmanager_10285c46.crml)
+  Generating file '\\epoc32\\release\\winscw\\urel\\z\\private\\10202BE9\\10285c46.txt'...
+DEBUG   : cone.crml(assets/symbianos/implml/usbmanager_10286a43.crml)
+  Generating file '\\epoc32\\release\\winscw\\urel\\z\\private\\10202BE9\\10286a43.txt'...
+INFO    : cone
+  Adding impl CrmlImpl(ref='assets/symbianos/implml/apputils_100048aa.crml', type='crml', index=0)
+INFO    : cone
+"""
+        (handle, filename) = tempfile.mkstemp()
+        os.write(handle, log)
+        os.close(handle)
+        data = {'filename': filename, 'name': 'cone', 'version': '1.0'}
+        ds = packager.datasources.ConEDataSource('/', data)
+        components = ds.getComponents()
+        assert len(components) == 1
+        print components[0].getTargetFiles()
+        assert len(components[0].getTargetFiles()) == 3
+