Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #! -*- python -*- | 1 #! -*- python -*- |
| 2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import atexit | 6 import atexit |
| 7 import glob | 7 import glob |
| 8 import os | 8 import os |
| 9 import platform | 9 import platform |
| 10 import shutil | 10 import shutil |
| (...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1129 validator) | 1129 validator) |
| 1130 | 1130 |
| 1131 | 1131 |
| 1132 # Perform os.path.abspath rooted at the directory SConstruct resides in. | 1132 # Perform os.path.abspath rooted at the directory SConstruct resides in. |
| 1133 def SConstructAbsPath(env, path): | 1133 def SConstructAbsPath(env, path): |
| 1134 return os.path.normpath(os.path.join(env['MAIN_DIR'], path)) | 1134 return os.path.normpath(os.path.join(env['MAIN_DIR'], path)) |
| 1135 | 1135 |
| 1136 pre_base_env.AddMethod(SConstructAbsPath) | 1136 pre_base_env.AddMethod(SConstructAbsPath) |
| 1137 | 1137 |
| 1138 | 1138 |
| 1139 def GetSelLdr(env): | 1139 def GetSelLdr(env, with_exceptions=False): |
| 1140 sel_ldr = ARGUMENTS.get('force_sel_ldr') | 1140 sel_ldr = ARGUMENTS.get('force_sel_ldr') |
| 1141 if sel_ldr: | 1141 if sel_ldr: |
| 1142 return env.File(env.SConstructAbsPath(sel_ldr)) | 1142 return env.File(env.SConstructAbsPath(sel_ldr)) |
| 1143 | 1143 |
| 1144 # NOTE: that the variable TRUSTED_ENV is set by ExportSpecialFamilyVars() | 1144 # NOTE: that the variable TRUSTED_ENV is set by ExportSpecialFamilyVars() |
| 1145 if 'TRUSTED_ENV' not in env: | 1145 if 'TRUSTED_ENV' not in env: |
| 1146 return None | 1146 return None |
| 1147 | 1147 |
| 1148 trusted_env = env['TRUSTED_ENV'] | 1148 trusted_env = env['TRUSTED_ENV'] |
| 1149 return trusted_env.File('${STAGING_DIR}/${PROGPREFIX}sel_ldr${PROGSUFFIX}') | 1149 # TODO(bradnelson): drop once exceptions are available by default. |
| 1150 if with_exceptions: | |
| 1151 return trusted_env.File( | |
| 1152 '${STAGING_DIR}/${PROGPREFIX}sel_ldr_exc${PROGSUFFIX}') | |
| 1153 else: | |
| 1154 return trusted_env.File('${STAGING_DIR}/${PROGPREFIX}sel_ldr${PROGSUFFIX}') | |
| 1150 | 1155 |
| 1151 def GetBootstrap(env): | 1156 def GetBootstrap(env): |
| 1152 if 'TRUSTED_ENV' in env: | 1157 if 'TRUSTED_ENV' in env: |
| 1153 trusted_env = env['TRUSTED_ENV'] | 1158 trusted_env = env['TRUSTED_ENV'] |
| 1154 if trusted_env.Bit('linux'): | 1159 if trusted_env.Bit('linux'): |
| 1155 return (trusted_env.File('${STAGING_DIR}/nacl_helper_bootstrap'), | 1160 return (trusted_env.File('${STAGING_DIR}/nacl_helper_bootstrap'), |
| 1156 '--r_debug=0xXXXXXXXXXXXXXXXX') | 1161 '--r_debug=0xXXXXXXXXXXXXXXXX') |
| 1157 return None, None | 1162 return None, None |
| 1158 | 1163 |
| 1159 pre_base_env.AddMethod(GetBootstrap) | 1164 pre_base_env.AddMethod(GetBootstrap) |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1443 # This is "built" by src/untrusted/pnacl_support_extension/nacl.scons. | 1448 # This is "built" by src/untrusted/pnacl_support_extension/nacl.scons. |
| 1444 return env.Dir('${STAGING_DIR}/pnacl_all') | 1449 return env.Dir('${STAGING_DIR}/pnacl_all') |
| 1445 | 1450 |
| 1446 pre_base_env.AddMethod(GetPnaclExtensionNode) | 1451 pre_base_env.AddMethod(GetPnaclExtensionNode) |
| 1447 | 1452 |
| 1448 | 1453 |
| 1449 # Compares output_file and golden_file. | 1454 # Compares output_file and golden_file. |
| 1450 # If they are different, prints the difference and returns 1. | 1455 # If they are different, prints the difference and returns 1. |
| 1451 # Otherwise, returns 0. | 1456 # Otherwise, returns 0. |
| 1452 def CheckGoldenFile(golden_file, output_file, | 1457 def CheckGoldenFile(golden_file, output_file, |
| 1453 filter_regex, filter_inverse, filter_group_only): | 1458 filter_regex=None, |
| 1459 filter_inverse=None, filter_group_only=None): | |
| 1454 golden = open(golden_file).read() | 1460 golden = open(golden_file).read() |
| 1455 actual = open(output_file).read() | 1461 actual = open(output_file).read() |
| 1456 if filter_regex is not None: | 1462 if filter_regex is not None: |
| 1457 actual = test_lib.RegexpFilterLines( | 1463 actual = test_lib.RegexpFilterLines( |
| 1458 filter_regex, | 1464 filter_regex, |
| 1459 filter_inverse, | 1465 filter_inverse, |
| 1460 filter_group_only, | 1466 filter_group_only, |
| 1461 actual) | 1467 actual) |
| 1462 if command_tester.DifferentFromGolden(actual, golden, output_file): | 1468 if command_tester.DifferentFromGolden(actual, golden, output_file): |
| 1463 return 1 | 1469 return 1 |
| 1464 return 0 | 1470 return 0 |
| 1465 | 1471 |
| 1466 | 1472 |
| 1467 # Returns action that compares output_file and golden_file. | 1473 # Returns action that compares output_file and golden_file. |
| 1468 # This action can be attached to the node with | 1474 # This action can be attached to the node with |
| 1469 # env.AddPostAction(target, action) | 1475 # env.AddPostAction(target, action) |
| 1470 def GoldenFileCheckAction(env, output_file, golden_file, | 1476 def GoldenFileCheckAction(env, output_file, golden_file, |
| 1471 filter_regex=None, filter_inverse=False, | 1477 filter_regex=None, filter_inverse=False, |
| 1472 filter_group_only=False): | 1478 filter_group_only=False): |
| 1473 def ActionFunc(target, source, env): | 1479 def ActionFunc(target, source, env): |
| 1474 return CheckGoldenFile(env.subst(golden_file), env.subst(output_file), | 1480 return CheckGoldenFile(env.subst(golden_file), env.subst(output_file), |
| 1475 filter_regex, filter_inverse, filter_group_only) | 1481 filter_regex, filter_inverse, filter_group_only) |
| 1476 | 1482 |
| 1477 return env.Action(ActionFunc) | 1483 return env.Action(ActionFunc) |
| 1478 | 1484 |
| 1485 pre_base_env.AddMethod(GoldenFileCheckAction) | |
| 1486 | |
| 1487 | |
| 1488 def UntrustedCrashDumpFilter(env, target, source, nexe=None, nmf=None): | |
| 1489 cmd = ('${PYTHON} ' + | |
|
Mark Seaborn
2012/02/06 19:44:06
Use AutoDepsCommand() instead of concatenating the
bradn
2012/02/06 22:27:48
This is an action not a command, so reusing AutoDe
| |
| 1490 env.File( | |
| 1491 '$MAIN_DIR/tests/untrusted_crash_dump/decode_dump.py').abspath + | |
| 1492 ' ' + env.subst(source) + | |
| 1493 ' ' + env.subst(target) + | |
| 1494 ' --addr2line ${ADDR2LINE}' | |
| 1495 ' --toolchain-libs ${NACL_SDK_LIB}') | |
| 1496 if nexe: | |
| 1497 cmd += ' --main-nexe ' + env.subst(nexe) | |
| 1498 if nmf: | |
| 1499 cmd += ' --nmf ' + env.subst(nmf) | |
| 1500 return env.Action(cmd) | |
| 1501 | |
| 1502 pre_base_env.AddMethod(UntrustedCrashDumpFilter) | |
| 1503 | |
| 1479 | 1504 |
| 1480 def PPAPIBrowserTester(env, | 1505 def PPAPIBrowserTester(env, |
| 1481 target, | 1506 target, |
| 1482 url, | 1507 url, |
| 1483 files, | 1508 files, |
| 1484 nmfs=None, | 1509 nmfs=None, |
| 1485 map_files=(), | 1510 map_files=(), |
| 1486 extensions=(), | 1511 extensions=(), |
| 1487 mime_types=(), | 1512 mime_types=(), |
| 1488 timeout=20, | 1513 timeout=20, |
| 1489 log_verbosity=2, | 1514 log_verbosity=2, |
| 1490 args=(), | 1515 args=(), |
| 1491 # list of key/value pairs that are passed to the test | 1516 # list of key/value pairs that are passed to the test |
| 1492 test_args=(), | 1517 test_args=(), |
| 1493 # list of "--flag=value" pairs (no spaces!) | 1518 # list of "--flag=value" pairs (no spaces!) |
| 1494 browser_flags=(), | 1519 browser_flags=(), |
| 1495 # redirect streams of NaCl program to files | 1520 # redirect streams of NaCl program to files |
| 1496 nacl_exe_stdin=None, | 1521 nacl_exe_stdin=None, |
| 1497 nacl_exe_stdout=None, | 1522 nacl_exe_stdout=None, |
| 1498 nacl_exe_stderr=None, | 1523 nacl_exe_stderr=None, |
| 1499 python_tester_script=None, | 1524 python_tester_script=None, |
| 1525 with_exceptions=False, | |
| 1500 **extra): | 1526 **extra): |
| 1501 if 'TRUSTED_ENV' not in env: | 1527 if 'TRUSTED_ENV' not in env: |
| 1502 return [] | 1528 return [] |
| 1503 | 1529 |
| 1504 # No browser tests run on arm-thumb2 | 1530 # No browser tests run on arm-thumb2 |
| 1505 # Bug http://code.google.com/p/nativeclient/issues/detail?id=2224 | 1531 # Bug http://code.google.com/p/nativeclient/issues/detail?id=2224 |
| 1506 if env.Bit('target_arm_thumb2'): | 1532 if env.Bit('target_arm_thumb2'): |
| 1507 return [] | 1533 return [] |
| 1508 | 1534 |
| 1509 # Lint the extra arguments that are being passed to the tester. | 1535 # Lint the extra arguments that are being passed to the tester. |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1526 python_tester_script = env.File('${SCONSTRUCT_DIR}/tools/browser_tester' | 1552 python_tester_script = env.File('${SCONSTRUCT_DIR}/tools/browser_tester' |
| 1527 '/browser_tester.py') | 1553 '/browser_tester.py') |
| 1528 command = GetHeadlessPrefix(env) + [ | 1554 command = GetHeadlessPrefix(env) + [ |
| 1529 '${PYTHON}', python_tester_script, | 1555 '${PYTHON}', python_tester_script, |
| 1530 '--browser_path', env.ChromeBinary(), | 1556 '--browser_path', env.ChromeBinary(), |
| 1531 '--url', url, | 1557 '--url', url, |
| 1532 # Fail if there is no response for X seconds. | 1558 # Fail if there is no response for X seconds. |
| 1533 '--timeout', str(timeout)] | 1559 '--timeout', str(timeout)] |
| 1534 if not env.Bit('disable_dynamic_plugin_loading'): | 1560 if not env.Bit('disable_dynamic_plugin_loading'): |
| 1535 command.extend(['--ppapi_plugin', GetPPAPIPluginPath(env['TRUSTED_ENV'])]) | 1561 command.extend(['--ppapi_plugin', GetPPAPIPluginPath(env['TRUSTED_ENV'])]) |
| 1536 command.extend(['--sel_ldr', GetSelLdr(env)]) | 1562 command.extend(['--sel_ldr', GetSelLdr(env, with_exceptions)]) |
| 1537 bootstrap, _ = GetBootstrap(env) | 1563 bootstrap, _ = GetBootstrap(env) |
| 1538 if bootstrap is not None: | 1564 if bootstrap is not None: |
| 1539 command.extend(['--sel_ldr_bootstrap', bootstrap]) | 1565 command.extend(['--sel_ldr_bootstrap', bootstrap]) |
| 1540 if env.Bit('irt') and (not env.Bit('disable_dynamic_plugin_loading') or | 1566 if env.Bit('irt') and (not env.Bit('disable_dynamic_plugin_loading') or |
| 1541 env.Bit('override_chrome_irt')): | 1567 env.Bit('override_chrome_irt')): |
| 1542 command.extend(['--irt_library', env.GetIrtNexe()]) | 1568 command.extend(['--irt_library', env.GetIrtNexe()]) |
| 1543 for dep_file in files: | 1569 for dep_file in files: |
| 1544 command.extend(['--file', dep_file]) | 1570 command.extend(['--file', dep_file]) |
| 1545 for extension in extensions: | 1571 for extension in extensions: |
| 1546 command.extend(['--extension', extension]) | 1572 command.extend(['--extension', extension]) |
| 1547 if env.Bit('bitcode'): | 1573 if env.Bit('bitcode'): |
| 1548 pnacl_extension = env.GetPnaclExtensionNode() | 1574 pnacl_extension = env.GetPnaclExtensionNode() |
| 1549 command.extend(['--extension', pnacl_extension]) | 1575 command.extend(['--extension', pnacl_extension]) |
| 1550 for dest_path, dep_file in map_files: | 1576 for dest_path, dep_file in map_files: |
| 1551 command.extend(['--map_file', dest_path, dep_file]) | 1577 command.extend(['--map_file', dest_path, dep_file]) |
| 1552 for file_ext, mime_type in mime_types: | 1578 for file_ext, mime_type in mime_types: |
| 1553 command.extend(['--mime_type', file_ext, mime_type]) | 1579 command.extend(['--mime_type', file_ext, mime_type]) |
| 1554 command.extend(['--serving_dir', '${NACL_SDK_LIB}']) | 1580 command.extend(['--serving_dir', '${NACL_SDK_LIB}']) |
| 1555 command.extend(['--serving_dir', '${LIB_DIR}']) | 1581 command.extend(['--serving_dir', '${LIB_DIR}']) |
| 1582 generated_manifests = [] | |
| 1556 if not nmfs is None: | 1583 if not nmfs is None: |
| 1557 for nmf_file in nmfs: | 1584 for nmf_file in nmfs: |
| 1558 generated_manifest = GeneratedManifestNode(env, nmf_file) | 1585 generated_manifest = GeneratedManifestNode(env, nmf_file) |
| 1586 generated_manifests.append(generated_manifest) | |
| 1559 # We need to add generated manifests to the list of default targets. | 1587 # We need to add generated manifests to the list of default targets. |
| 1560 # The manifests should be generated even if the tests are not run - | 1588 # The manifests should be generated even if the tests are not run - |
| 1561 # the manifests may be needed for manual testing. | 1589 # the manifests may be needed for manual testing. |
| 1562 for group in env['COMPONENT_TEST_PROGRAM_GROUPS']: | 1590 for group in env['COMPONENT_TEST_PROGRAM_GROUPS']: |
| 1563 env.Alias(group, generated_manifest) | 1591 env.Alias(group, generated_manifest) |
| 1564 # Generated manifests are served in the root of the HTTP server | 1592 # Generated manifests are served in the root of the HTTP server |
| 1565 command.extend(['--file', generated_manifest]) | 1593 command.extend(['--file', generated_manifest]) |
| 1566 if 'browser_test_tool' in ARGUMENTS: | 1594 if 'browser_test_tool' in ARGUMENTS: |
| 1567 command.extend(['--tool', ARGUMENTS['browser_test_tool']]) | 1595 command.extend(['--tool', ARGUMENTS['browser_test_tool']]) |
| 1568 | 1596 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1591 ('stdout', nacl_exe_stdout), | 1619 ('stdout', nacl_exe_stdout), |
| 1592 ('stderr', nacl_exe_stderr)): | 1620 ('stderr', nacl_exe_stderr)): |
| 1593 if params is None: | 1621 if params is None: |
| 1594 continue | 1622 continue |
| 1595 stream_file = env.subst(params['file']) | 1623 stream_file = env.subst(params['file']) |
| 1596 command.extend(['--nacl_exe_' + stream, stream_file]) | 1624 command.extend(['--nacl_exe_' + stream, stream_file]) |
| 1597 golden_file = env.subst(params['golden']) | 1625 golden_file = env.subst(params['golden']) |
| 1598 filter_regex = params.get('filter_regex', None) | 1626 filter_regex = params.get('filter_regex', None) |
| 1599 filter_inverse = params.get('filter_inverse', False) | 1627 filter_inverse = params.get('filter_inverse', False) |
| 1600 filter_group_only = params.get('filter_group_only', False) | 1628 filter_group_only = params.get('filter_group_only', False) |
| 1629 decode_crash_dump = params.get('decode_crash_dump', False) | |
| 1630 if decode_crash_dump: | |
| 1631 if generated_manifests: | |
| 1632 nmf_path = generated_manifests[0].abspath | |
| 1633 else: | |
| 1634 nmf_path = None | |
| 1635 decoded = stream_file + '.decoded' | |
| 1636 post_actions.append( | |
| 1637 env.UntrustedCrashDumpFilter( | |
| 1638 decoded, stream_file, nexe=files[0].abspath, nmf=nmf_path)) | |
| 1639 stream_file = decoded | |
| 1601 post_actions.append( | 1640 post_actions.append( |
| 1602 GoldenFileCheckAction( | 1641 env.GoldenFileCheckAction( |
| 1603 env, stream_file, golden_file, | 1642 stream_file, golden_file, |
| 1604 filter_regex, filter_inverse, filter_group_only)) | 1643 filter_regex, filter_inverse, filter_group_only)) |
| 1605 | 1644 |
| 1606 if ShouldUseVerboseOptions(extra): | 1645 if ShouldUseVerboseOptions(extra): |
| 1607 env.MakeVerboseExtraOptions(target, log_verbosity, extra) | 1646 env.MakeVerboseExtraOptions(target, log_verbosity, extra) |
| 1608 # Heuristic for when to capture output... | 1647 # Heuristic for when to capture output... |
| 1609 capture_output = (extra.pop('capture_output', False) | 1648 capture_output = (extra.pop('capture_output', False) |
| 1610 or 'process_output_single' in extra) | 1649 or 'process_output_single' in extra) |
| 1611 node = env.CommandTest(target, | 1650 node = env.CommandTest(target, |
| 1612 command, | 1651 command, |
| 1613 # Set to 'huge' so that the browser tester's timeout | 1652 # Set to 'huge' so that the browser tester's timeout |
| (...skipping 1585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3199 'tests/sysbasic/nacl.scons', | 3238 'tests/sysbasic/nacl.scons', |
| 3200 'tests/syscall_return_sandboxing/nacl.scons', | 3239 'tests/syscall_return_sandboxing/nacl.scons', |
| 3201 'tests/syscalls/nacl.scons', | 3240 'tests/syscalls/nacl.scons', |
| 3202 'tests/threads/nacl.scons', | 3241 'tests/threads/nacl.scons', |
| 3203 'tests/time/nacl.scons', | 3242 'tests/time/nacl.scons', |
| 3204 'tests/tls/nacl.scons', | 3243 'tests/tls/nacl.scons', |
| 3205 'tests/tls_perf/nacl.scons', | 3244 'tests/tls_perf/nacl.scons', |
| 3206 'tests/toolchain/nacl.scons', | 3245 'tests/toolchain/nacl.scons', |
| 3207 'tests/unittests/shared/platform/nacl.scons', | 3246 'tests/unittests/shared/platform/nacl.scons', |
| 3208 'tests/untrusted_check/nacl.scons', | 3247 'tests/untrusted_check/nacl.scons', |
| 3248 'tests/untrusted_crash_dump/nacl.scons', | |
| 3209 #### ALPHABETICALLY SORTED #### | 3249 #### ALPHABETICALLY SORTED #### |
| 3210 ] | 3250 ] |
| 3211 | 3251 |
| 3212 # These are tests that are not worthwhile to run in an IRT variant. | 3252 # These are tests that are not worthwhile to run in an IRT variant. |
| 3213 # In some cases, that's because they are browser tests which always | 3253 # In some cases, that's because they are browser tests which always |
| 3214 # use the IRT. In others, it's because they are special-case tests | 3254 # use the IRT. In others, it's because they are special-case tests |
| 3215 # that are incompatible with having an IRT loaded. | 3255 # that are incompatible with having an IRT loaded. |
| 3216 nonvariant_tests = [ | 3256 nonvariant_tests = [ |
| 3217 #### ALPHABETICALLY SORTED #### | 3257 #### ALPHABETICALLY SORTED #### |
| 3218 'tests/barebones/nacl.scons', | 3258 'tests/barebones/nacl.scons', |
| 3219 'tests/chrome_extension/nacl.scons', | 3259 'tests/chrome_extension/nacl.scons', |
| 3220 'tests/exit_status/nacl.scons', | 3260 'tests/exit_status/nacl.scons', |
| 3221 'tests/imc_shm_mmap/nacl.scons', | 3261 'tests/imc_shm_mmap/nacl.scons', |
| 3222 'tests/imc_sockets/nacl.scons', | 3262 'tests/imc_sockets/nacl.scons', |
| 3223 'tests/inbrowser_crash_test/nacl.scons', | 3263 'tests/inbrowser_crash_test/nacl.scons', |
| 3264 'tests/inbrowser_untrusted_crash_dump_test/nacl.scons', | |
| 3224 'tests/inbrowser_test_runner/nacl.scons', | 3265 'tests/inbrowser_test_runner/nacl.scons', |
| 3225 'tests/mach_crash_filter/nacl.scons', | 3266 'tests/mach_crash_filter/nacl.scons', |
| 3226 'tests/minnacl/nacl.scons', | 3267 'tests/minnacl/nacl.scons', |
| 3227 'tests/multiple_sandboxes/nacl.scons', | 3268 'tests/multiple_sandboxes/nacl.scons', |
| 3228 'tests/nacl.scons', | 3269 'tests/nacl.scons', |
| 3229 'tests/ppapi/nacl.scons', | 3270 'tests/ppapi/nacl.scons', |
| 3230 'tests/ppapi_browser/bad/nacl.scons', | 3271 'tests/ppapi_browser/bad/nacl.scons', |
| 3231 'tests/ppapi_browser/crash/nacl.scons', | 3272 'tests/ppapi_browser/crash/nacl.scons', |
| 3232 'tests/ppapi_browser/extension_mime_handler/nacl.scons', | 3273 'tests/ppapi_browser/extension_mime_handler/nacl.scons', |
| 3233 'tests/ppapi_browser/manifest/nacl.scons', | 3274 'tests/ppapi_browser/manifest/nacl.scons', |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3746 nacl_env.ValidateSdk() | 3787 nacl_env.ValidateSdk() |
| 3747 | 3788 |
| 3748 if BROKEN_TEST_COUNT > 0: | 3789 if BROKEN_TEST_COUNT > 0: |
| 3749 msg = "There are %d broken tests." % BROKEN_TEST_COUNT | 3790 msg = "There are %d broken tests." % BROKEN_TEST_COUNT |
| 3750 if GetOption('brief_comstr'): | 3791 if GetOption('brief_comstr'): |
| 3751 msg += " Add --verbose to the command line for more information." | 3792 msg += " Add --verbose to the command line for more information." |
| 3752 print msg | 3793 print msg |
| 3753 | 3794 |
| 3754 # separate warnings from actual build output | 3795 # separate warnings from actual build output |
| 3755 Banner('B U I L D - O U T P U T:') | 3796 Banner('B U I L D - O U T P U T:') |
| OLD | NEW |