diff -r 360bd6b35136 -r 22486c9c7b15 sbsv2/raptor/test/unit_suite/raptor_data_unit.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv2/raptor/test/unit_suite/raptor_data_unit.py Wed Jun 23 17:27:59 2010 +0800 @@ -0,0 +1,622 @@ +# +# Copyright (c) 2006-2010 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: +# raptor_data_unit module +# This module tests the classes that make up the Raptor Data Model. +# + +import generic_path +import os +import raptor +import raptor_cache +import raptor_data +import sys +import unittest + +class TestRaptorData(unittest.TestCase): + + def setUp(self): + self.envStack = {} + + + def SetEnv(self, name, value): + # set environment variable and remember the old value (if there is one) + if os.environ.has_key(name): + self.envStack[name] = os.environ[name] + os.environ[name] = value + + def isWin(self): + return 'win' in raptor.hostplatform + + def RestoreEnv(self, name): + # put environment back to its state before SetEnv + if self.envStack.has_key(name): + os.environ[name] = self.envStack[name] + else: + del os.environ[name] # was not defined + + + def testSimpleSpecification(self): + spec = raptor_data.Specification("myProject") + + spec.SetInterface("Symbian.EXE") + + var = raptor_data.Variant("X") + + var.AddOperation(raptor_data.Set("SOURCES", "a.cpp")) + var.AddOperation(raptor_data.Append("LIBS", "all.dll")) + var.AddOperation(raptor_data.Append("INC", "/C/include")) + var.AddOperation(raptor_data.Prepend("INC", "/B/include")) + + spec.AddVariant(var) + spec.AddVariant("AlwaysBuildAsArm") + + self.failUnless(spec) + self.failUnless(spec.Valid()) + self.failUnless(var.Valid()) + self.assertEqual(spec.name, "myProject") + + + def testSimpleFilter(self): + filter = raptor_data.Filter("filtered") + filter.SetConfigCondition("ARMV5") + + filter.SetInterface(raptor_data.Interface("True.EXE")) + filter.Else.SetInterface(raptor_data.Interface("False.EXE")) + + filter.AddVariant(raptor_data.Variant("True_var")) + filter.Else.AddVariant(raptor_data.Variant("False_var")) + + filter.AddChildSpecification(raptor_data.Specification("TrueSpec")) + filter.Else.AddChildSpecification(raptor_data.Specification("FalseSpec")) + + filter.Configure( raptor_data.BuildUnit("ARMV5",[]), cache=None ) + # check a positive test + iface = filter.GetInterface(cache=None) + self.assertEqual(iface.name, "True.EXE") + vars = filter.GetVariants(cache = None) + self.assertEqual(vars[0].name, "True_var") + kids = filter.GetChildSpecs() + self.assertEqual(kids[0].name, "TrueSpec") + + filter.Configure( raptor_data.BuildUnit("NOT_ARMV5",[]) , cache = None) + # check a negative test + iface = filter.GetInterface(cache = None) + self.assertEqual(iface.name, "False.EXE") + vars = filter.GetVariants(cache = None) + self.assertEqual(vars[0].name, "False_var") + kids = filter.GetChildSpecs() + self.assertEqual(kids[0].name, "FalseSpec") + + + def testSimpleVariant(self): + var = raptor_data.Variant() + self.failUnless(var) + self.failIf( var.Valid() ) + + var.SetProperty("name", "ABC") + var.SetProperty("extends", "DEF") + var.SetProperty("host", "GHI") + + self.assertEqual(var.name, "ABC") + self.assertEqual(var.extends, "DEF") + self.assertEqual(var.host, None) + + var.SetProperty("host", "win32") + self.assertEqual(var.host, "win32") + + self.failUnless( var.Valid() ) + + var.AddOperation( raptor_data.Set("CC", "armcc") ) + var.AddOperation( raptor_data.Set("LN", "armlink") ) + + self.failUnless( var.Valid() ) + + var.SetProperty("extends", "") + ops = var.GetAllOperationsRecursively(None) + + self.assertEqual( len(ops), 1 ) + self.assertEqual( len(ops[0]), 2 ) + + def testExtendedVariant(self): + r = raptor.Raptor() + + varA = raptor_data.Variant("A") + varA.SetProperty("extends", None) + varA.AddOperation( raptor_data.Set("V1", "1A") ) + varA.AddOperation( raptor_data.Set("V2", "2A") ) + + varB = raptor_data.Variant("B") + varB.SetProperty("extends", "A") + varB.AddOperation( raptor_data.Set("V2", "2B") ) + varB.AddOperation( raptor_data.Set("V3", "3B") ) + + varC = raptor_data.Variant("C") + varC.SetProperty("extends", "B") + varC.AddOperation( raptor_data.Set("V3", "3C") ) + varC.AddOperation( raptor_data.Set("V4", "4C") ) + + self.failUnless( varA.Valid() ) + self.failUnless( varB.Valid() ) + self.failUnless( varC.Valid() ) + + r.cache.AddVariant(varA) + r.cache.AddVariant(varB) + r.cache.AddVariant(varC) + + e = r.GetEvaluator(None, varA.GenerateBuildUnits(r.cache)[0] ) + self.assertEqual( e.Get("V1"), "1A" ) + self.assertEqual( e.Get("V2"), "2A" ) + + e = r.GetEvaluator(None, varB.GenerateBuildUnits(r.cache)[0] ) + self.assertEqual( e.Get("V1"), "1A" ) + self.assertEqual( e.Get("V2"), "2B" ) + self.assertEqual( e.Get("V3"), "3B" ) + + e = r.GetEvaluator(None, varC.GenerateBuildUnits(r.cache)[0] ) + self.assertEqual( e.Get("V1"), "1A" ) + self.assertEqual( e.Get("V2"), "2B" ) + self.assertEqual( e.Get("V3"), "3C" ) + self.assertEqual( e.Get("V4"), "4C" ) + + def testReferencedVariant(self): + r = raptor.Raptor() + + varA = raptor_data.Variant("A") + varA.SetProperty("extends", None) + varA.AddOperation( raptor_data.Set("V1", "1A") ) + varA.AddOperation( raptor_data.Set("V2", "2A") ) + + # B extends A, and has a reference to C. + varB = raptor_data.Variant("B") + varB.SetProperty("extends", "A") + varB.AddOperation( raptor_data.Set("V2", "2B") ) + varB.AddOperation( raptor_data.Set("V3", "3B") ) + varB.AddChild( raptor_data.VariantRef("C") ) + + varC = raptor_data.Variant("C") + varC.SetProperty("extends", None) + varC.AddOperation( raptor_data.Set("V3", "3C") ) + varC.AddOperation( raptor_data.Set("V4", "4C") ) + + self.failUnless( varA.Valid() ) + self.failUnless( varB.Valid() ) + self.failUnless( varC.Valid() ) + + r.cache.AddVariant(varA) + r.cache.AddVariant(varB) + r.cache.AddVariant(varC) + + e = r.GetEvaluator(None, varA.GenerateBuildUnits(r.cache)[0] ) + self.assertEqual( e.Get("V1"), "1A" ) + self.assertEqual( e.Get("V2"), "2A" ) + + e = r.GetEvaluator(None, varC.GenerateBuildUnits(r.cache)[0] ) + self.assertEqual( e.Get("V3"), "3C" ) + self.assertEqual( e.Get("V4"), "4C" ) + + e = r.GetEvaluator(None, varB.GenerateBuildUnits(r.cache)[0] ) + self.assertEqual( e.Get("V1"), "1A" ) + self.assertEqual( e.Get("V2"), "2B" ) + self.assertEqual( e.Get("V3"), "3B" ) + self.assertEqual( e.Get("V4"), "4C" ) + + def testAlias(self): + r = raptor.Raptor() + + varA = raptor_data.Variant("A") + varA.AddOperation( raptor_data.Set("V1", "1A") ) + varA.AddOperation( raptor_data.Set("V2", "2A") ) + r.cache.AddVariant(varA) + + varB = raptor_data.Variant("B") + varB.AddOperation( raptor_data.Set("V2", "2B") ) + varB.AddOperation( raptor_data.Set("V3", "3B") ) + r.cache.AddVariant(varB) + + varC = raptor_data.Variant("C") + varC.AddOperation( raptor_data.Set("V3", "3C") ) + varC.AddOperation( raptor_data.Set("V4", "4C") ) + r.cache.AddVariant(varC) + + # + alias = raptor_data.Alias("an_alias") + alias.SetProperty("meaning", "A.B.C") + r.cache.AddAlias(alias) + + self.failUnless( alias.Valid() ) + + e = r.GetEvaluator(None, alias.GenerateBuildUnits(r.cache)[0] ) + self.assertEqual( e.Get("V1"), "1A" ) + self.assertEqual( e.Get("V2"), "2B" ) + self.assertEqual( e.Get("V3"), "3C" ) + self.assertEqual( e.Get("V4"), "4C" ) + + def testGroup1(self): + r = raptor.Raptor() + + varA = raptor_data.Variant("A") + varA.AddOperation( raptor_data.Set("V1", "1A") ) + varA.AddOperation( raptor_data.Set("V2", "2A") ) + r.cache.AddVariant(varA) + + varB = raptor_data.Variant("B") + varB.AddOperation( raptor_data.Set("V2", "2B") ) + varB.AddOperation( raptor_data.Set("V3", "3B") ) + r.cache.AddVariant(varB) + + varC = raptor_data.Variant("C") + varC.AddOperation( raptor_data.Set("V3", "3C") ) + varC.AddOperation( raptor_data.Set("V4", "4C") ) + r.cache.AddVariant(varC) + + alias = raptor_data.Alias("alias") + alias.SetProperty("meaning", "B.C") + r.cache.AddAlias(alias) + + # This group has two buildable units: "A" and "alias" = "B.C". + # + # + # + # + group1 = raptor_data.Group("group1") + group1.AddChild( raptor_data.VariantRef("A") ) + group1.AddChild( raptor_data.AliasRef("alias") ) + r.cache.AddGroup(group1) + + vRef = raptor_data.VariantRef("C") + vRef.SetProperty("mod", "B") + + # This group has three buildable units: "C.B", "A" and "alias" = "B.C". + # + # + # + # + group2 = raptor_data.Group("group2") + group2.AddChild(vRef) + group2.AddChild( raptor_data.GroupRef("group1") ) + r.cache.AddGroup(group2) + + self.failUnless( group1.Valid() ) + self.failUnless( group2.Valid() ) + + buildUnits = group1.GenerateBuildUnits(r.cache) + self.assertEqual( len(buildUnits), 2 ) + self.assertEqual( buildUnits[0].name, "A" ) + self.assertEqual( buildUnits[1].name, "alias" ) + self.assertEqual( buildUnits[1].variants[0].name, "B" ) + self.assertEqual( buildUnits[1].variants[1].name, "C" ) + + buildUnits = group2.GenerateBuildUnits(r.cache) + self.assertEqual( len(buildUnits), 3 ) + self.assertEqual( buildUnits[0].name, "C.B" ) + self.assertEqual( buildUnits[1].name, "A" ) + self.assertEqual( buildUnits[2].name, "alias" ) + + self.assertEqual( len(buildUnits[0].variants), 2 ) + self.assertEqual( len(buildUnits[1].variants), 1 ) + self.assertEqual( len(buildUnits[2].variants), 2 ) + + def testGroup2(self): + r = raptor.Raptor() + + r.cache.Load( generic_path.Join(r.home, "test", "config", "arm.xml") ) + + buildUnits = r.cache.FindNamedGroup("G2").GenerateBuildUnits(r.cache) + + self.assertEqual( len(buildUnits), 8 ) + + self.assertEqual(buildUnits[0].name, "ARMV5_UREL.MOD1") + self.assertEqual(buildUnits[1].name, "ARMV5_UDEB.MOD1.MOD2") + self.assertEqual(buildUnits[2].name, "ALIAS_1") + self.assertEqual(buildUnits[3].name, "ALIAS_2.MOD1.MOD2.MOD1") + self.assertEqual(buildUnits[4].name, "ARMV5_UREL.MOD2") + self.assertEqual(buildUnits[5].name, "ARMV5_UDEB.MOD2") + self.assertEqual(buildUnits[6].name, "MOD1") + self.assertEqual(buildUnits[7].name, "MOD2") + + def testRefs(self): + i1 = raptor_data.InterfaceRef() + self.failIf(i1.Valid()) + + i2 = raptor_data.InterfaceRef("") + self.failIf(i2.Valid()) + + i3 = raptor_data.InterfaceRef("ABC_abc.123") + self.failUnless(i3.Valid()) + self.assertEqual(i3.ref, "ABC_abc.123") + + + def testEvaluator(self): + self.SetEnv("EPOCROOT", "/C") + aRaptor = raptor.Raptor() + cache = aRaptor.cache + aRaptor.debugOutput = True + cache.Load(generic_path.Join(aRaptor.home, "test", "config", "arm.xml")) + + var = cache.FindNamedVariant("ARMV5_UREL") + eval = aRaptor.GetEvaluator( None, var.GenerateBuildUnits(aRaptor.cache)[0]) + self.RestoreEnv("EPOCROOT") + + # test the Get method + varcfg = eval.Get("VARIANT_CFG") + self.assertEqual(varcfg, "/C/variant/variant.cfg") + + # test the Resolve wrt EPOCROOT + varcfg = eval.Resolve("VARIANT_CFG") + self.assertEqual(varcfg, "/C/variant/variant.cfg") + + def testProblematicEnvironment(self): + aRaptor = raptor.Raptor() + + # 1: ask for environment variable values that will break makefile parsing due to + # backslashes forming line continuation characters + self.SetEnv("ENVVAR_BSLASH_END1", "C:\\test1a\\;C:\\test1b\\") + self.SetEnv("ENVVAR_BSLASH_END2", "C:\\test2a\\;C:\\test2b\\\\") + self.SetEnv("ENVVAR_BSLASH_END3", "C:\\test3a\\;C:\\test3b\\\\\\") + var = raptor_data.Variant("my.var") + var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END1")) + var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END2")) + var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END3")) + + eval = aRaptor.GetEvaluator(None, var.GenerateBuildUnits(aRaptor.cache)[0]) + self.RestoreEnv("ENVVAR_BSLASH_END1") + self.RestoreEnv("ENVVAR_BSLASH_END2") + self.RestoreEnv("ENVVAR_BSLASH_END3") + + value = eval.Get("ENVVAR_BSLASH_END1") + self.assertEqual(value, "C:\\test1a\\;C:\\test1b\\\\") + + value = eval.Get("ENVVAR_BSLASH_END2") + self.assertEqual(value, "C:\\test2a\\;C:\\test2b\\\\") + + value = eval.Get("ENVVAR_BSLASH_END3") + self.assertEqual(value, "C:\\test3a\\;C:\\test3b\\\\\\\\") + + # 2: check 'tool' and 'toolchain' type environment variable values for correct behaviour when paths contain spaces + # this is different depending on host OS platform and whether or not the paths/tools actually exist + epocroot = os.path.abspath(os.environ.get('EPOCROOT')).replace('\\','/').rstrip('/') + pathwithspaces = epocroot+"/epoc32/build/Program Files/Some tool installed with spaces/no_spaces/s p c/no_more_spaces" + toolwithspaces = pathwithspaces+"/testtool.exe" + self.SetEnv("ENVVAR_TOOL_WITH_SPACES", toolwithspaces) + self.SetEnv("ENVVAR_TOOLCHAINPATH_WITH_SPACES", pathwithspaces) + toolVar = raptor_data.Variant("tool.var") + toolchainpathVar = raptor_data.Variant("toolchainpath.var") + toolVar.AddOperation(raptor_data.Env("ENVVAR_TOOL_WITH_SPACES", "", "tool")) + toolchainpathVar.AddOperation(raptor_data.Env("ENVVAR_TOOLCHAINPATH_WITH_SPACES", "", "toolchainpath")) + invalidValueException = "the environment variable %s is incorrect - it is a '%s' type but contains spaces that cannot be neutralised:" + + # 2a: paths/tools exist - on Windows we expect 8.3 paths post-evaluation, on all other platforms error exceptions + os.makedirs(pathwithspaces) + testtool = open(toolwithspaces,'wb') + testtool.close() + + exceptionText = "" + value = "" + try: + eval = aRaptor.GetEvaluator(None, toolVar.GenerateBuildUnits(aRaptor.cache)[0]) + value = eval.Get("ENVVAR_TOOL_WITH_SPACES") + except Exception, e: + exceptionText = str(e) + + if self.isWin(): + self.assertTrue(value) + self.assertFalse(' ' in value) + else: + self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOL_WITH_SPACES", "tool"))) + + exceptionText = "" + value = "" + try: + eval = aRaptor.GetEvaluator(None, toolchainpathVar.GenerateBuildUnits(aRaptor.cache)[0]) + value = eval.Get("ENVVAR_TOOLCHAINPATH_WITH_SPACES") + except Exception, e: + exceptionText = str(e) + + if self.isWin(): + self.assertTrue(value) + self.assertFalse(' ' in value) + else: + self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOLCHAINPATH_WITH_SPACES", "toolchainpath"))) + + # 2b: paths/tools don't exist - should throw error exceptions on all platforms as 8.3 paths are only available + # for use if a path/tool exists + os.remove(toolwithspaces) + os.removedirs(pathwithspaces) + + exceptionText = "" + try: + eval = aRaptor.GetEvaluator(None, toolVar.GenerateBuildUnits(aRaptor.cache)[0]) + except Exception, e: + exceptionText = str(e) + self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOL_WITH_SPACES", "tool"))) + + exceptionText = "" + try: + eval = aRaptor.GetEvaluator(None, toolchainpathVar.GenerateBuildUnits(aRaptor.cache)[0]) + except Exception, e: + exceptionText = str(e) + self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOLCHAINPATH_WITH_SPACES", "toolchainpath"))) + + # clean-up + self.RestoreEnv("ENVVAR_TOOL_WITH_SPACES") + self.RestoreEnv("ENVVAR_TOOLCHAINPATH_WITH_SPACES") + + def testMissingEnvironment(self): + # ask for an environment variable that is not set + # and has no default value. + var = raptor_data.Variant("my.var") + var.AddOperation(raptor_data.Env("RAPTOR_SAYS_NO")) + + aRaptor = raptor.Raptor() + + try: + eval = aRaptor.GetEvaluator(None, var.GenerateBuildUnits(aRaptor.cache)[0] ) + badval = eval.Get("RAPTOR_SAYS_NO") + except raptor_data.UninitialisedVariableException, e: + return + + self.assertTrue(False) + + def checkForParam(self, params, name, default): + for p in params: + if p.name == name and (default == None or p.default == default): + return True + return False + + def testInterface(self): + aRaptor = raptor.Raptor() + cache = aRaptor.cache + cache.Load(generic_path.Join(aRaptor.home, "test", "config", "interface.xml")) + + base = cache.FindNamedInterface("Base.XYZ") + p = base.GetParams(cache) + self.failUnless(self.checkForParam(p, "A", None)) + self.failUnless(self.checkForParam(p, "B", "baseB")) + self.failUnless(self.checkForParam(p, "C", "baseC")) + + extended = cache.FindNamedInterface("Extended.XYZ") + p = extended.GetParams(cache) + self.failUnless(self.checkForParam(p, "A", None)) + self.failUnless(self.checkForParam(p, "B", "baseB")) + self.failUnless(self.checkForParam(p, "C", "extC")) + self.failUnless(self.checkForParam(p, "D", None)) + f = extended.GetFLMIncludePath(cache=cache) + self.assertEqual(f.File(), "ext.flm") + + extended = cache.FindNamedInterface("Extended2.XYZ") + p = extended.GetParams(cache) + self.failUnless(self.checkForParam(p, "A", None)) + self.failUnless(self.checkForParam(p, "B", "baseB")) + self.failUnless(self.checkForParam(p, "C", "extC")) + self.failUnless(self.checkForParam(p, "D", None)) + f = extended.GetFLMIncludePath(cache) + self.assertEqual(f.File(), "base.flm") + + def testGetBuildUnits(self): + r = raptor.Raptor() + + # + g1 = raptor_data.Group("g1") + r.cache.AddGroup(g1) + + # + g2a = raptor_data.GroupRef() + g2a.SetProperty("ref", "g2") + g2a.SetProperty("mod", "A.B") + g1.AddChild(g2a) + + # + g2b = raptor_data.GroupRef() + g2b.SetProperty("ref", "g2") + g2b.SetProperty("mod", "C.D") + g1.AddChild(g2b) + + # + g2 = raptor_data.Group("g2") + r.cache.AddGroup(g2) + + # + v2 = raptor_data.VariantRef() + v2.SetProperty("ref", "V") + v2.SetProperty("mod", "E.F") + g2.AddChild(v2) + + # + v3 = raptor_data.VariantRef() + v3.SetProperty("ref", "V") + v3.SetProperty("mod", "G.H") + g2.AddChild(v3) + + # + v4 = raptor_data.AliasRef() + v4.SetProperty("ref", "X") + v4.SetProperty("mod", "I.J") + g2.AddChild(v4) + + # + v5 = raptor_data.AliasRef() + v5.SetProperty("ref", "X") + v5.SetProperty("mod", "K.L") + g2.AddChild(v5) + + r.cache.AddVariant(raptor_data.Variant("A")) + r.cache.AddVariant(raptor_data.Variant("B")) + r.cache.AddVariant(raptor_data.Variant("C")) + r.cache.AddVariant(raptor_data.Variant("D")) + r.cache.AddVariant(raptor_data.Variant("E")) + r.cache.AddVariant(raptor_data.Variant("F")) + r.cache.AddVariant(raptor_data.Variant("G")) + r.cache.AddVariant(raptor_data.Variant("H")) + r.cache.AddVariant(raptor_data.Variant("I")) + r.cache.AddVariant(raptor_data.Variant("J")) + r.cache.AddVariant(raptor_data.Variant("K")) + r.cache.AddVariant(raptor_data.Variant("L")) + + r.cache.AddVariant(raptor_data.Variant("V")) + + # + # g2.A.B + # g2.C.D + # + # + # V.E.F + # V.G.H + # X.I.J + # X.K.L + # + #