sbsv2/raptor/test/unit_suite/raptor_data_unit.py
changeset 591 22486c9c7b15
equal deleted inserted replaced
590:360bd6b35136 591:22486c9c7b15
       
     1 #
       
     2 # Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3 # All rights reserved.
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of the License "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 #
       
     9 # Initial Contributors:
       
    10 # Nokia Corporation - initial contribution.
       
    11 #
       
    12 # Contributors:
       
    13 #
       
    14 # Description: 
       
    15 # raptor_data_unit module
       
    16 # This module tests the classes that make up the Raptor Data Model.
       
    17 #
       
    18 
       
    19 import generic_path
       
    20 import os
       
    21 import raptor
       
    22 import raptor_cache
       
    23 import raptor_data
       
    24 import sys
       
    25 import unittest
       
    26 
       
    27 class TestRaptorData(unittest.TestCase):
       
    28 
       
    29 	def setUp(self):
       
    30 		self.envStack = {}
       
    31 		
       
    32 		
       
    33 	def SetEnv(self, name, value):
       
    34 		# set environment variable and remember the old value (if there is one)		
       
    35 		if os.environ.has_key(name):
       
    36 			self.envStack[name] = os.environ[name]
       
    37 		os.environ[name] = value
       
    38 		
       
    39 	def isWin(self):
       
    40 		return 'win' in raptor.hostplatform
       
    41 			
       
    42 	def RestoreEnv(self, name):
       
    43 		# put environment back to its state before SetEnv
       
    44 		if self.envStack.has_key(name):
       
    45 			os.environ[name] = self.envStack[name]
       
    46 		else:
       
    47 			del os.environ[name]    # was not defined
       
    48 			
       
    49 			
       
    50 	def testSimpleSpecification(self):
       
    51 		spec = raptor_data.Specification("myProject")
       
    52 
       
    53 		spec.SetInterface("Symbian.EXE")
       
    54 		
       
    55 		var = raptor_data.Variant("X")
       
    56 
       
    57 		var.AddOperation(raptor_data.Set("SOURCES", "a.cpp"))
       
    58 		var.AddOperation(raptor_data.Append("LIBS", "all.dll"))
       
    59 		var.AddOperation(raptor_data.Append("INC", "/C/include"))
       
    60 		var.AddOperation(raptor_data.Prepend("INC", "/B/include"))
       
    61 
       
    62 		spec.AddVariant(var)
       
    63 		spec.AddVariant("AlwaysBuildAsArm")
       
    64 
       
    65 		self.failUnless(spec)
       
    66 		self.failUnless(spec.Valid())
       
    67 		self.failUnless(var.Valid())
       
    68 		self.assertEqual(spec.name, "myProject")
       
    69 
       
    70 
       
    71 	def testSimpleFilter(self):
       
    72 		filter = raptor_data.Filter("filtered")
       
    73 		filter.SetConfigCondition("ARMV5")
       
    74 		
       
    75 		filter.SetInterface(raptor_data.Interface("True.EXE"))
       
    76 		filter.Else.SetInterface(raptor_data.Interface("False.EXE"))
       
    77 		
       
    78 		filter.AddVariant(raptor_data.Variant("True_var"))
       
    79 		filter.Else.AddVariant(raptor_data.Variant("False_var"))
       
    80 		
       
    81 		filter.AddChildSpecification(raptor_data.Specification("TrueSpec"))
       
    82 		filter.Else.AddChildSpecification(raptor_data.Specification("FalseSpec"))
       
    83 		
       
    84 		filter.Configure( raptor_data.BuildUnit("ARMV5",[]), cache=None )
       
    85 		# check a positive test
       
    86 		iface = filter.GetInterface(cache=None)
       
    87 		self.assertEqual(iface.name, "True.EXE")
       
    88 		vars = filter.GetVariants(cache = None)
       
    89 		self.assertEqual(vars[0].name, "True_var")
       
    90 		kids = filter.GetChildSpecs()
       
    91 		self.assertEqual(kids[0].name, "TrueSpec")
       
    92 		
       
    93 		filter.Configure( raptor_data.BuildUnit("NOT_ARMV5",[]) , cache = None)
       
    94 		# check a negative test
       
    95 		iface = filter.GetInterface(cache = None)
       
    96 		self.assertEqual(iface.name, "False.EXE")
       
    97 		vars = filter.GetVariants(cache = None)
       
    98 		self.assertEqual(vars[0].name, "False_var")
       
    99 		kids = filter.GetChildSpecs()
       
   100 		self.assertEqual(kids[0].name, "FalseSpec")
       
   101 		
       
   102 
       
   103 	def testSimpleVariant(self):
       
   104 		var = raptor_data.Variant()
       
   105 		self.failUnless(var)
       
   106 		self.failIf( var.Valid() )
       
   107 
       
   108 		var.SetProperty("name", "ABC")
       
   109 		var.SetProperty("extends", "DEF")
       
   110 		var.SetProperty("host", "GHI")
       
   111 
       
   112 		self.assertEqual(var.name, "ABC")
       
   113 		self.assertEqual(var.extends, "DEF")
       
   114 		self.assertEqual(var.host, None)
       
   115 
       
   116 		var.SetProperty("host", "win32")
       
   117 		self.assertEqual(var.host, "win32")
       
   118 
       
   119 		self.failUnless( var.Valid() )
       
   120 
       
   121 		var.AddOperation( raptor_data.Set("CC", "armcc") )
       
   122 		var.AddOperation( raptor_data.Set("LN", "armlink") )
       
   123 
       
   124 		self.failUnless( var.Valid() )
       
   125 
       
   126 		var.SetProperty("extends", "")
       
   127 		ops = var.GetAllOperationsRecursively(None)
       
   128 
       
   129 		self.assertEqual( len(ops), 1 )
       
   130 		self.assertEqual( len(ops[0]), 2 )
       
   131 
       
   132 	def testExtendedVariant(self):
       
   133 		r = raptor.Raptor()
       
   134 
       
   135 		varA = raptor_data.Variant("A")
       
   136 		varA.SetProperty("extends", None)
       
   137 		varA.AddOperation( raptor_data.Set("V1", "1A") )
       
   138 		varA.AddOperation( raptor_data.Set("V2", "2A") )
       
   139 
       
   140 		varB = raptor_data.Variant("B")
       
   141 		varB.SetProperty("extends", "A")
       
   142 		varB.AddOperation( raptor_data.Set("V2", "2B") )
       
   143 		varB.AddOperation( raptor_data.Set("V3", "3B") )
       
   144 
       
   145 		varC = raptor_data.Variant("C")
       
   146 		varC.SetProperty("extends", "B")
       
   147 		varC.AddOperation( raptor_data.Set("V3", "3C") )
       
   148 		varC.AddOperation( raptor_data.Set("V4", "4C") )
       
   149 
       
   150 		self.failUnless( varA.Valid() )
       
   151 		self.failUnless( varB.Valid() )
       
   152 		self.failUnless( varC.Valid() )
       
   153 
       
   154 		r.cache.AddVariant(varA)
       
   155 		r.cache.AddVariant(varB)
       
   156 		r.cache.AddVariant(varC)
       
   157 
       
   158 		e = r.GetEvaluator(None, varA.GenerateBuildUnits(r.cache)[0] )
       
   159 		self.assertEqual( e.Get("V1"), "1A" )
       
   160 		self.assertEqual( e.Get("V2"), "2A" )
       
   161 
       
   162 		e = r.GetEvaluator(None, varB.GenerateBuildUnits(r.cache)[0] )
       
   163 		self.assertEqual( e.Get("V1"), "1A" )
       
   164 		self.assertEqual( e.Get("V2"), "2B" )
       
   165 		self.assertEqual( e.Get("V3"), "3B" )
       
   166 
       
   167 		e = r.GetEvaluator(None, varC.GenerateBuildUnits(r.cache)[0] )
       
   168 		self.assertEqual( e.Get("V1"), "1A" )
       
   169 		self.assertEqual( e.Get("V2"), "2B" )
       
   170 		self.assertEqual( e.Get("V3"), "3C" )
       
   171 		self.assertEqual( e.Get("V4"), "4C" )
       
   172 
       
   173 	def testReferencedVariant(self):
       
   174 		r = raptor.Raptor()
       
   175 
       
   176 		varA = raptor_data.Variant("A")
       
   177 		varA.SetProperty("extends", None)
       
   178 		varA.AddOperation( raptor_data.Set("V1", "1A") )
       
   179 		varA.AddOperation( raptor_data.Set("V2", "2A") )
       
   180 
       
   181 		# B extends A, and has a reference to C.
       
   182 		varB = raptor_data.Variant("B")
       
   183 		varB.SetProperty("extends", "A")
       
   184 		varB.AddOperation( raptor_data.Set("V2", "2B") )
       
   185 		varB.AddOperation( raptor_data.Set("V3", "3B") )
       
   186 		varB.AddChild( raptor_data.VariantRef("C") )
       
   187 
       
   188 		varC = raptor_data.Variant("C")
       
   189 		varC.SetProperty("extends", None)
       
   190 		varC.AddOperation( raptor_data.Set("V3", "3C") )
       
   191 		varC.AddOperation( raptor_data.Set("V4", "4C") )
       
   192 
       
   193 		self.failUnless( varA.Valid() )
       
   194 		self.failUnless( varB.Valid() )
       
   195 		self.failUnless( varC.Valid() )
       
   196 
       
   197 		r.cache.AddVariant(varA)
       
   198 		r.cache.AddVariant(varB)
       
   199 		r.cache.AddVariant(varC)
       
   200 
       
   201 		e = r.GetEvaluator(None, varA.GenerateBuildUnits(r.cache)[0] )
       
   202 		self.assertEqual( e.Get("V1"), "1A" )
       
   203 		self.assertEqual( e.Get("V2"), "2A" )
       
   204 
       
   205 		e = r.GetEvaluator(None, varC.GenerateBuildUnits(r.cache)[0] )
       
   206 		self.assertEqual( e.Get("V3"), "3C" )
       
   207 		self.assertEqual( e.Get("V4"), "4C" )
       
   208 
       
   209 		e = r.GetEvaluator(None, varB.GenerateBuildUnits(r.cache)[0] )
       
   210 		self.assertEqual( e.Get("V1"), "1A" )
       
   211 		self.assertEqual( e.Get("V2"), "2B" )
       
   212 		self.assertEqual( e.Get("V3"), "3B" )
       
   213 		self.assertEqual( e.Get("V4"), "4C" )
       
   214 
       
   215 	def testAlias(self):
       
   216 		r = raptor.Raptor()
       
   217 
       
   218 		varA = raptor_data.Variant("A")
       
   219 		varA.AddOperation( raptor_data.Set("V1", "1A") )
       
   220 		varA.AddOperation( raptor_data.Set("V2", "2A") )
       
   221 		r.cache.AddVariant(varA)
       
   222 
       
   223 		varB = raptor_data.Variant("B")
       
   224 		varB.AddOperation( raptor_data.Set("V2", "2B") )
       
   225 		varB.AddOperation( raptor_data.Set("V3", "3B") )
       
   226 		r.cache.AddVariant(varB)
       
   227 
       
   228 		varC = raptor_data.Variant("C")
       
   229 		varC.AddOperation( raptor_data.Set("V3", "3C") )
       
   230 		varC.AddOperation( raptor_data.Set("V4", "4C") )
       
   231 		r.cache.AddVariant(varC)
       
   232 
       
   233 		# <alias name="an_alias" meaning="A.B.C"/>
       
   234 		alias = raptor_data.Alias("an_alias")
       
   235 		alias.SetProperty("meaning", "A.B.C")
       
   236 		r.cache.AddAlias(alias)
       
   237 
       
   238 		self.failUnless( alias.Valid() )
       
   239 
       
   240 		e = r.GetEvaluator(None, alias.GenerateBuildUnits(r.cache)[0] )
       
   241 		self.assertEqual( e.Get("V1"), "1A" )
       
   242 		self.assertEqual( e.Get("V2"), "2B" )
       
   243 		self.assertEqual( e.Get("V3"), "3C" )
       
   244 		self.assertEqual( e.Get("V4"), "4C" )
       
   245 
       
   246 	def testGroup1(self):
       
   247 		r = raptor.Raptor()
       
   248 
       
   249 		varA = raptor_data.Variant("A")
       
   250 		varA.AddOperation( raptor_data.Set("V1", "1A") )
       
   251 		varA.AddOperation( raptor_data.Set("V2", "2A") )
       
   252 		r.cache.AddVariant(varA)
       
   253 
       
   254 		varB = raptor_data.Variant("B")
       
   255 		varB.AddOperation( raptor_data.Set("V2", "2B") )
       
   256 		varB.AddOperation( raptor_data.Set("V3", "3B") )
       
   257 		r.cache.AddVariant(varB)
       
   258 
       
   259 		varC = raptor_data.Variant("C")
       
   260 		varC.AddOperation( raptor_data.Set("V3", "3C") )
       
   261 		varC.AddOperation( raptor_data.Set("V4", "4C") )
       
   262 		r.cache.AddVariant(varC)
       
   263 
       
   264 		alias = raptor_data.Alias("alias")
       
   265 		alias.SetProperty("meaning", "B.C")
       
   266 		r.cache.AddAlias(alias)
       
   267 
       
   268 		# This group has two buildable units: "A" and "alias" = "B.C".
       
   269 		# <group name="group1">
       
   270 		#	<varRef ref="A"/>
       
   271 		#   <aliasRef ref="alias">
       
   272 		# <group>
       
   273 		group1 = raptor_data.Group("group1")
       
   274 		group1.AddChild( raptor_data.VariantRef("A") )
       
   275 		group1.AddChild( raptor_data.AliasRef("alias") )
       
   276 		r.cache.AddGroup(group1)
       
   277 
       
   278 		vRef = raptor_data.VariantRef("C")
       
   279 		vRef.SetProperty("mod", "B")
       
   280 
       
   281 		# This group has three buildable units: "C.B", "A" and "alias" = "B.C".
       
   282 		# <group name="group2">
       
   283 		#	<varRef ref="C" mod="B"/>
       
   284 		#   <groupRef ref="group1"/>
       
   285 		# <group>
       
   286 		group2 = raptor_data.Group("group2")
       
   287 		group2.AddChild(vRef)
       
   288 		group2.AddChild( raptor_data.GroupRef("group1") )
       
   289 		r.cache.AddGroup(group2)
       
   290 
       
   291 		self.failUnless( group1.Valid() )
       
   292 		self.failUnless( group2.Valid() )
       
   293 
       
   294 		buildUnits = group1.GenerateBuildUnits(r.cache)
       
   295 		self.assertEqual( len(buildUnits), 2 )
       
   296 		self.assertEqual( buildUnits[0].name, "A" )
       
   297 		self.assertEqual( buildUnits[1].name, "alias" )
       
   298 		self.assertEqual( buildUnits[1].variants[0].name, "B" )
       
   299 		self.assertEqual( buildUnits[1].variants[1].name, "C" )
       
   300 
       
   301 		buildUnits = group2.GenerateBuildUnits(r.cache)
       
   302 		self.assertEqual( len(buildUnits), 3 )
       
   303 		self.assertEqual( buildUnits[0].name, "C.B" )
       
   304 		self.assertEqual( buildUnits[1].name, "A" )
       
   305 		self.assertEqual( buildUnits[2].name, "alias" )
       
   306 
       
   307 		self.assertEqual( len(buildUnits[0].variants), 2 )
       
   308 		self.assertEqual( len(buildUnits[1].variants), 1 )
       
   309 		self.assertEqual( len(buildUnits[2].variants), 2 )
       
   310 
       
   311 	def testGroup2(self):
       
   312 		r = raptor.Raptor()
       
   313 
       
   314 		r.cache.Load( generic_path.Join(r.home, "test", "config", "arm.xml") )
       
   315 
       
   316 		buildUnits = r.cache.FindNamedGroup("G2").GenerateBuildUnits(r.cache)
       
   317 
       
   318 		self.assertEqual( len(buildUnits), 8 )
       
   319 
       
   320 		self.assertEqual(buildUnits[0].name, "ARMV5_UREL.MOD1")
       
   321 		self.assertEqual(buildUnits[1].name, "ARMV5_UDEB.MOD1.MOD2")
       
   322 		self.assertEqual(buildUnits[2].name, "ALIAS_1")
       
   323 		self.assertEqual(buildUnits[3].name, "ALIAS_2.MOD1.MOD2.MOD1")
       
   324 		self.assertEqual(buildUnits[4].name, "ARMV5_UREL.MOD2")
       
   325 		self.assertEqual(buildUnits[5].name, "ARMV5_UDEB.MOD2")
       
   326 		self.assertEqual(buildUnits[6].name, "MOD1")
       
   327 		self.assertEqual(buildUnits[7].name, "MOD2")
       
   328 
       
   329 	def testRefs(self):
       
   330 		i1 = raptor_data.InterfaceRef()
       
   331 		self.failIf(i1.Valid())
       
   332 
       
   333 		i2 = raptor_data.InterfaceRef("")
       
   334 		self.failIf(i2.Valid())
       
   335 
       
   336 		i3 = raptor_data.InterfaceRef("ABC_abc.123")
       
   337 		self.failUnless(i3.Valid())
       
   338 		self.assertEqual(i3.ref, "ABC_abc.123")
       
   339 
       
   340 
       
   341 	def testEvaluator(self):
       
   342 		self.SetEnv("EPOCROOT", "/C")
       
   343 		aRaptor = raptor.Raptor()
       
   344 		cache = aRaptor.cache
       
   345 		aRaptor.debugOutput = True
       
   346 		cache.Load(generic_path.Join(aRaptor.home, "test", "config", "arm.xml"))
       
   347 		
       
   348 		var = cache.FindNamedVariant("ARMV5_UREL")
       
   349 		eval = aRaptor.GetEvaluator( None, var.GenerateBuildUnits(aRaptor.cache)[0])
       
   350 		self.RestoreEnv("EPOCROOT")
       
   351 		
       
   352 		# test the Get method
       
   353 		varcfg = eval.Get("VARIANT_CFG")
       
   354 		self.assertEqual(varcfg, "/C/variant/variant.cfg")
       
   355 		
       
   356 		# test the Resolve wrt EPOCROOT
       
   357 		varcfg = eval.Resolve("VARIANT_CFG")
       
   358 		self.assertEqual(varcfg, "/C/variant/variant.cfg")
       
   359 		
       
   360 	def testProblematicEnvironment(self):
       
   361 		aRaptor = raptor.Raptor()		
       
   362 		
       
   363 		# 1: ask for environment variable values that will break makefile parsing due to
       
   364 		# backslashes forming line continuation characters
       
   365 		self.SetEnv("ENVVAR_BSLASH_END1", "C:\\test1a\\;C:\\test1b\\")
       
   366 		self.SetEnv("ENVVAR_BSLASH_END2", "C:\\test2a\\;C:\\test2b\\\\")
       
   367 		self.SetEnv("ENVVAR_BSLASH_END3", "C:\\test3a\\;C:\\test3b\\\\\\")
       
   368 		var = raptor_data.Variant("my.var")
       
   369 		var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END1"))
       
   370 		var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END2"))
       
   371 		var.AddOperation(raptor_data.Env("ENVVAR_BSLASH_END3"))
       
   372 
       
   373 		eval = aRaptor.GetEvaluator(None, var.GenerateBuildUnits(aRaptor.cache)[0])
       
   374 		self.RestoreEnv("ENVVAR_BSLASH_END1")
       
   375 		self.RestoreEnv("ENVVAR_BSLASH_END2")
       
   376 		self.RestoreEnv("ENVVAR_BSLASH_END3")
       
   377 		
       
   378 		value = eval.Get("ENVVAR_BSLASH_END1")
       
   379 		self.assertEqual(value, "C:\\test1a\\;C:\\test1b\\\\")
       
   380 		
       
   381 		value = eval.Get("ENVVAR_BSLASH_END2")
       
   382 		self.assertEqual(value, "C:\\test2a\\;C:\\test2b\\\\")
       
   383 		
       
   384 		value = eval.Get("ENVVAR_BSLASH_END3")
       
   385 		self.assertEqual(value, "C:\\test3a\\;C:\\test3b\\\\\\\\")
       
   386 		
       
   387 		# 2: check 'tool' and 'toolchain' type environment variable values for correct behaviour when paths contain spaces
       
   388 		# this is different depending on host OS platform and whether or not the paths/tools actually exist
       
   389 		epocroot = os.path.abspath(os.environ.get('EPOCROOT')).replace('\\','/').rstrip('/')
       
   390 		pathwithspaces = epocroot+"/epoc32/build/Program Files/Some tool installed with spaces/no_spaces/s p c/no_more_spaces"
       
   391 		toolwithspaces = pathwithspaces+"/testtool.exe"	
       
   392 		self.SetEnv("ENVVAR_TOOL_WITH_SPACES", toolwithspaces)
       
   393 		self.SetEnv("ENVVAR_TOOLCHAINPATH_WITH_SPACES", pathwithspaces)
       
   394 		toolVar = raptor_data.Variant("tool.var")
       
   395 		toolchainpathVar = raptor_data.Variant("toolchainpath.var")
       
   396 		toolVar.AddOperation(raptor_data.Env("ENVVAR_TOOL_WITH_SPACES", "", "tool"))
       
   397 		toolchainpathVar.AddOperation(raptor_data.Env("ENVVAR_TOOLCHAINPATH_WITH_SPACES", "", "toolchainpath"))
       
   398 		invalidValueException = "the environment variable %s is incorrect - it is a '%s' type but contains spaces that cannot be neutralised:"
       
   399 		
       
   400 		# 2a: paths/tools exist - on Windows we expect 8.3 paths post-evaluation, on all other platforms error exceptions
       
   401 		os.makedirs(pathwithspaces)
       
   402 		testtool = open(toolwithspaces,'wb')
       
   403 		testtool.close()
       
   404 		
       
   405 		exceptionText = ""
       
   406 		value = ""
       
   407 		try:
       
   408 			eval = aRaptor.GetEvaluator(None, toolVar.GenerateBuildUnits(aRaptor.cache)[0])
       
   409 			value = eval.Get("ENVVAR_TOOL_WITH_SPACES")
       
   410 		except Exception, e:
       
   411 			exceptionText = str(e)
       
   412 			
       
   413 		if self.isWin():
       
   414 			self.assertTrue(value)
       
   415 			self.assertFalse(' ' in value)
       
   416 		else:
       
   417 			self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOL_WITH_SPACES", "tool")))
       
   418 
       
   419 		exceptionText = ""
       
   420 		value = ""
       
   421 		try:
       
   422 			eval = aRaptor.GetEvaluator(None, toolchainpathVar.GenerateBuildUnits(aRaptor.cache)[0])
       
   423 			value = eval.Get("ENVVAR_TOOLCHAINPATH_WITH_SPACES")
       
   424 		except Exception, e:
       
   425 			exceptionText = str(e)
       
   426 			
       
   427 		if self.isWin():
       
   428 			self.assertTrue(value)
       
   429 			self.assertFalse(' ' in value)
       
   430 		else:
       
   431 			self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOLCHAINPATH_WITH_SPACES", "toolchainpath")))
       
   432 		
       
   433 		# 2b: paths/tools don't exist - should throw error exceptions on all platforms as 8.3 paths are only available
       
   434 		# for use if a path/tool exists
       
   435 		os.remove(toolwithspaces)
       
   436 		os.removedirs(pathwithspaces)
       
   437 
       
   438 		exceptionText = ""
       
   439 		try:
       
   440 			eval = aRaptor.GetEvaluator(None, toolVar.GenerateBuildUnits(aRaptor.cache)[0])
       
   441 		except Exception, e:
       
   442 			exceptionText = str(e)
       
   443 		self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOL_WITH_SPACES", "tool")))
       
   444 
       
   445 		exceptionText = ""
       
   446 		try:
       
   447 			eval = aRaptor.GetEvaluator(None, toolchainpathVar.GenerateBuildUnits(aRaptor.cache)[0])
       
   448 		except Exception, e:
       
   449 			exceptionText = str(e)			
       
   450 		self.assertTrue(exceptionText.startswith(invalidValueException % ("ENVVAR_TOOLCHAINPATH_WITH_SPACES", "toolchainpath")))
       
   451 
       
   452 		# clean-up
       
   453 		self.RestoreEnv("ENVVAR_TOOL_WITH_SPACES")
       
   454 		self.RestoreEnv("ENVVAR_TOOLCHAINPATH_WITH_SPACES")
       
   455 	
       
   456 	def testMissingEnvironment(self):
       
   457 		# ask for an environment variable that is not set
       
   458 		# and has no default value.
       
   459 		var = raptor_data.Variant("my.var")
       
   460 		var.AddOperation(raptor_data.Env("RAPTOR_SAYS_NO"))
       
   461 
       
   462 		aRaptor = raptor.Raptor()
       
   463 	
       
   464 		try:	
       
   465 			eval = aRaptor.GetEvaluator(None, var.GenerateBuildUnits(aRaptor.cache)[0] )
       
   466 			badval = eval.Get("RAPTOR_SAYS_NO")
       
   467 		except raptor_data.UninitialisedVariableException, e:
       
   468 			return
       
   469 
       
   470 		self.assertTrue(False)
       
   471 
       
   472 	def checkForParam(self, params, name, default):
       
   473 		for p in params:
       
   474 			if p.name == name and (default == None or p.default == default):
       
   475 				return True
       
   476 		return False
       
   477 	
       
   478 	def testInterface(self):
       
   479 		aRaptor = raptor.Raptor()
       
   480 		cache = aRaptor.cache
       
   481 		cache.Load(generic_path.Join(aRaptor.home, "test", "config", "interface.xml"))
       
   482 		
       
   483 		base = cache.FindNamedInterface("Base.XYZ")
       
   484 		p = base.GetParams(cache)
       
   485 		self.failUnless(self.checkForParam(p, "A", None))
       
   486 		self.failUnless(self.checkForParam(p, "B", "baseB"))
       
   487 		self.failUnless(self.checkForParam(p, "C", "baseC"))
       
   488 		
       
   489 		extended = cache.FindNamedInterface("Extended.XYZ")
       
   490 		p = extended.GetParams(cache)
       
   491 		self.failUnless(self.checkForParam(p, "A", None))
       
   492 		self.failUnless(self.checkForParam(p, "B", "baseB"))
       
   493 		self.failUnless(self.checkForParam(p, "C", "extC"))
       
   494 		self.failUnless(self.checkForParam(p, "D", None))
       
   495 		f = extended.GetFLMIncludePath(cache=cache)
       
   496 		self.assertEqual(f.File(), "ext.flm")
       
   497 		
       
   498 		extended = cache.FindNamedInterface("Extended2.XYZ")
       
   499 		p = extended.GetParams(cache)
       
   500 		self.failUnless(self.checkForParam(p, "A", None))
       
   501 		self.failUnless(self.checkForParam(p, "B", "baseB"))
       
   502 		self.failUnless(self.checkForParam(p, "C", "extC"))
       
   503 		self.failUnless(self.checkForParam(p, "D", None))
       
   504 		f = extended.GetFLMIncludePath(cache)
       
   505 		self.assertEqual(f.File(), "base.flm")
       
   506 
       
   507 	def testGetBuildUnits(self):
       
   508 		r = raptor.Raptor()
       
   509 
       
   510 		# <group name="g1">
       
   511 		g1 = raptor_data.Group("g1")
       
   512 		r.cache.AddGroup(g1)
       
   513 		
       
   514 		# <groupRef ref="g2" mod="A.B"/>
       
   515 		g2a = raptor_data.GroupRef()
       
   516 		g2a.SetProperty("ref", "g2")
       
   517 		g2a.SetProperty("mod", "A.B")
       
   518 		g1.AddChild(g2a)
       
   519 		
       
   520 		# <groupRef ref="g2" mod="C.D"/>
       
   521 		g2b = raptor_data.GroupRef()
       
   522 		g2b.SetProperty("ref", "g2")
       
   523 		g2b.SetProperty("mod", "C.D")
       
   524 		g1.AddChild(g2b)
       
   525 		
       
   526 		# <group name="g2">
       
   527 		g2 = raptor_data.Group("g2")
       
   528 		r.cache.AddGroup(g2)
       
   529 		
       
   530 		# <varRef ref="V" mod="E.F"/>
       
   531 		v2 = raptor_data.VariantRef()
       
   532 		v2.SetProperty("ref", "V")
       
   533 		v2.SetProperty("mod", "E.F")
       
   534 		g2.AddChild(v2)
       
   535 		
       
   536 		# <varRef ref="V" mod="G.H"/>
       
   537 		v3 = raptor_data.VariantRef()
       
   538 		v3.SetProperty("ref", "V")
       
   539 		v3.SetProperty("mod", "G.H")
       
   540 		g2.AddChild(v3)
       
   541 		
       
   542 		# <aliasRef ref="X" mod="I.J"/>
       
   543 		v4 = raptor_data.AliasRef()
       
   544 		v4.SetProperty("ref", "X")
       
   545 		v4.SetProperty("mod", "I.J")
       
   546 		g2.AddChild(v4)
       
   547 		
       
   548 		# <aliasRef ref="X" mod="K.L"/>
       
   549 		v5 = raptor_data.AliasRef()
       
   550 		v5.SetProperty("ref", "X")
       
   551 		v5.SetProperty("mod", "K.L")
       
   552 		g2.AddChild(v5)
       
   553 		
       
   554 		r.cache.AddVariant(raptor_data.Variant("A"))
       
   555 		r.cache.AddVariant(raptor_data.Variant("B"))
       
   556 		r.cache.AddVariant(raptor_data.Variant("C"))
       
   557 		r.cache.AddVariant(raptor_data.Variant("D"))
       
   558 		r.cache.AddVariant(raptor_data.Variant("E"))
       
   559 		r.cache.AddVariant(raptor_data.Variant("F"))
       
   560 		r.cache.AddVariant(raptor_data.Variant("G"))
       
   561 		r.cache.AddVariant(raptor_data.Variant("H"))
       
   562 		r.cache.AddVariant(raptor_data.Variant("I"))
       
   563 		r.cache.AddVariant(raptor_data.Variant("J"))
       
   564 		r.cache.AddVariant(raptor_data.Variant("K"))
       
   565 		r.cache.AddVariant(raptor_data.Variant("L"))
       
   566 		
       
   567 		r.cache.AddVariant(raptor_data.Variant("V"))
       
   568 		
       
   569 		# <alias name="X" meaning="A.B.C.D.E.F.G.H/>
       
   570 		alias = raptor_data.Alias("X")
       
   571 		alias.SetProperty("meaning", "A.B.C.D.E.F.G.H")
       
   572 		r.cache.AddAlias(alias)
       
   573 
       
   574 		r.cache.AddVariant(raptor_data.Variant("Y"))
       
   575 		r.cache.AddVariant(raptor_data.Variant("Z"))
       
   576 	
       
   577 		units = raptor_data.GetBuildUnits(["g1.Y", "g1.Z"], r.cache, r)
       
   578 		
       
   579 		# <group name="g1">
       
   580 		#   <groupRef ref="g2" mod="A.B"/>    g2.A.B
       
   581 		#   <groupRef ref="g2" mod="C.D"/>    g2.C.D
       
   582 		# </group>
       
   583 		# <group name="g2">
       
   584 		#   <varRef ref="V" mod="E.F"/>       V.E.F
       
   585 		#   <varRef ref="V" mod="G.H"/>       V.G.H
       
   586 		#   <aliasRef ref="X" mod="I.J"/>     X.I.J
       
   587 		#   <aliasRef ref="X" mod="K.L"/>     X.K.L
       
   588 		# </group>
       
   589 		# <alias name="X" meaning="A.B.C.D.E.F.G.H/>
       
   590 		#
       
   591 		expected = [ "VEFABY", "VGHABY", "ABCDEFGHIJABY", "ABCDEFGHKLABY",
       
   592 				     "VEFCDY", "VGHCDY", "ABCDEFGHIJCDY", "ABCDEFGHKLCDY",
       
   593 		             "VEFABZ", "VGHABZ", "ABCDEFGHIJABZ", "ABCDEFGHKLABZ",
       
   594 				     "VEFCDZ", "VGHCDZ", "ABCDEFGHIJCDZ", "ABCDEFGHKLCDZ" ]
       
   595 		
       
   596 		self.failUnlessEqual(len(units), len(expected))
       
   597 		
       
   598 		for u in units:
       
   599 			vars = "".join([v.name for v in u.variants])
       
   600 			self.failUnless(vars in expected, vars + " was not expected")
       
   601 			expected.remove(vars)
       
   602 		
       
   603 		self.failUnless(len(expected) == 0, str(expected) + " not found")
       
   604 		
       
   605 # run all the tests
       
   606 
       
   607 from raptor_tests import SmokeTest
       
   608 
       
   609 def run():
       
   610 	t = SmokeTest()
       
   611 	t.id = "999"
       
   612 	t.name = "raptor_data_unit"
       
   613 
       
   614 	tests = unittest.makeSuite(TestRaptorData)
       
   615 	result = unittest.TextTestRunner(verbosity=2).run(tests)
       
   616 
       
   617 	if result.wasSuccessful():
       
   618 		t.result = SmokeTest.PASS
       
   619 	else:
       
   620 		t.result = SmokeTest.FAIL
       
   621 
       
   622 	return t