# -*- python -*- ## ## SConscript - SCons buildscript for the Testsuite (called by SConstruct) ## import os from os import path from glob import glob from Buildhelper import srcSubtree from Buildhelper import scanSubtree from Buildhelper import globRootdirs from Buildhelper import createPlugins Import('env core tools config') env = env.Clone() env.Append(CPPPATH='include') # additional headers for tests def testExecutable(env,tree, exeName=None, obj=None): """ declare all targets needed to create a standalone Test executable of the given Sub-tree. @note this tree uses separate Environment/Includepath """ env = env.Clone() env.Append(CPPPATH=tree) # add subdir to Includepath tree = env.subst(tree) # expand Construction Vars if obj: obj = [path.join(tree,name) for name in obj] else: obj = srcSubtree(tree) # use all sourcefiles found in subtree if not exeName: exeName = 'test-%s' % tree return env.Program(exeName, obj + core) def testCollection(env,dir): """ treat a Directory containing a collection of standalone tests. Link each of them into an independent executable """ env = env.Clone() env.Append(CPPPATH=dir) # add subdir to Includepath srcpatt = ['test-*.c'] exeName = lambda p: path.basename(path.splitext(p)[0]) buildIt = lambda p: env.Program(exeName(p), [p] + core) return [buildIt(f) for f in scanSubtree(dir,srcpatt)] # but have to treat some subdirs individually. specials = ['plugin','lib','components'] moduledirs = globRootdirs('*') testsuite = ( [ testExecutable(env, dir) for dir in ['lib','components'] ] + [ testCollection(env, dir) for dir in moduledirs if not dir in specials] + createPlugins(env, 'plugin') + env.File(glob('*.tests')) # depending on the test definition files for test.sh + config ) Export('testsuite') # for creating a Valgrind-Suppression file vgsuppr = env.Program('vgsuppression','tool/vgsuppression.c', LIBS=core) ## for suppressing false valgrind alarms tools += [vgsuppr] Depends(testsuite,vgsuppr) # # actually run the Testsuite # # - the product of running the Testsuite is the ",testlog" # - it depends on all artifacts defined as "testsuite" above # - including the tests/*.tests (suite definition files) # - if not set via options switch, the environment variables # TESTSUITES and VALGRINDFLAGS are explicitly propagated to test.sh # testEnv = env.Clone() valgrind = os.environ.get('VALGRINDFLAGS', '') # unset if not defined if not valgrind and not env['VALGRIND']: valgrind = 'DISABLE' testEnv.Append(ENV = { 'VALGRINDFLAGS' : valgrind , 'LUMIERA_CONFIG_PATH' : './' }) testsuites = env['TESTSUITES'] or os.environ.get('TESTSUITES') if testsuites: testEnv['ENV']['TESTSUITES'] = testsuites pluginpath = os.environ.get('LUMIERA_PLUGIN_PATH') if testsuites: testEnv['ENV']['LUMIERA_PLUGIN_PATH'] = pluginpath # specify path to test.conf testEnv['ENV']['TEST_CONF'] = env.File("test.conf").abspath testDir = env.Dir('#$TARGDIR') runTest = env.File("test.sh").abspath runTests = testEnv.Command('#$TARGDIR/,testlog', testsuite, runTest, chdir=testDir) # # define Phony targets # - 'scons testcode' triggers building of the Testsuite # - 'scons check' triggers building and running # env.Alias('testcode', testsuite ) env.Alias('check', runTests ) # allow tempfiles of test.sh to be cleaned env.Clean ('check', [',testlog',',testlog.pre',',expect_stdout',',stdout',',stderr',',testtmp','.libs'])