+def run_tests(ctx, appname, tests):
+ orig_dir = os.path.abspath(os.curdir)
+ failures = 0
+ base = '..'
+
+ top_level = os.path.abspath(ctx.curdir) != os.path.abspath(os.curdir)
+ if top_level:
+ os.chdir('./build/default/' + appname)
+ base = '../..'
+ else:
+ os.chdir('./build/default')
+
+ lcov = True
+ lcov_log = open('lcov.log', 'w')
+ try:
+ # Clear coverage data
+ subprocess.call('lcov -d ./src -z'.split(),
+ stdout=lcov_log, stderr=lcov_log)
+ except:
+ lcov = False
+ print("Failed to run lcov, no coverage report will be generated")
+
+
+ # Run all tests
+ for i in tests:
+ print()
+ Utils.pprint('BOLD', 'Running %s test %s' % (appname, i))
+ if subprocess.call(i) == 0:
+ Utils.pprint('GREEN', 'Passed %s %s' % (appname, i))
+ else:
+ failures += 1
+ Utils.pprint('RED', 'Failed %s %s' % (appname, i))
+
+ if lcov:
+ # Generate coverage data
+ coverage_lcov = open('coverage.lcov', 'w')
+ subprocess.call(('lcov -c -d ./src -d ./test -b ' + base).split(),
+ stdout=coverage_lcov, stderr=lcov_log)
+ coverage_lcov.close()
+
+ # Strip out unwanted stuff
+ coverage_stripped_lcov = open('coverage-stripped.lcov', 'w')
+ subprocess.call('lcov --remove coverage.lcov *boost* c++*'.split(),
+ stdout=coverage_stripped_lcov, stderr=lcov_log)
+ coverage_stripped_lcov.close()
+
+ # Generate HTML coverage output
+ if not os.path.isdir('./coverage'):
+ os.makedirs('./coverage')
+ subprocess.call('genhtml -o coverage coverage-stripped.lcov'.split(),
+ stdout=lcov_log, stderr=lcov_log)
+
+ lcov_log.close()
+
+ print()
+ Utils.pprint('BOLD', 'Summary:', sep=''),
+ if failures == 0:
+ Utils.pprint('GREEN', 'All ' + appname + ' tests passed')
+ else:
+ Utils.pprint('RED', str(failures) + ' ' + appname + ' test(s) failed')
+
+ Utils.pprint('BOLD', 'Coverage:', sep='')
+ print(os.path.abspath('coverage/index.html'))
+
+ os.chdir(orig_dir)
+