# Copyright 2009, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following disclaimer # in the documentation and/or other materials provided with the # distribution. # * Neither the name of Google Inc. nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import os import sys Import('env') env['COMPONENT_TEST_SUBSYSTEM_WINDOWS'] = True gtest_env = env.Clone() gtest_env.Append( CPPPATH = ['$GTEST_DIR/include', '$GTEST_DIR', ] ) gtest_sources = [ 'gtest-all', ] gtest_objs = [gtest_env.ComponentObject(name, '$GTEST_DIR/src/%s.cc' % name) for name in gtest_sources] gmock_env = gtest_env.Clone() gmock_env.Append(CPPPATH = ['$GMOCK_DIR/include', '$GMOCK_DIR']) gmock_sources = ['gmock-all'] gtest_objs += [gmock_env.ComponentObject(name, '$GMOCK_DIR/src/%s.cc' % name) for name in gmock_sources] gtest_lib = gtest_env.Library('gtest', gtest_objs) env.Append( CPPDEFINES = [ '_USE_MATH_DEFINES', ], CPPPATH = [ env.Dir('$COLLADA_DIR'), env.Dir('$COLLADA_DIR/LibXML/include'), env.Dir('$CG_DIR/include'), # Headers for Antlr runtime library env.Dir('$ANTLRLIBC_DIR/include'), # Headers generated by Antlr for Technique grammar env.Dir('$OBJ_ROOT/compiler/technique'), '$GTEST_DIR/include', '$GMOCK_DIR/include', ], LIBPATH=[ env.Dir('.'), env.Dir('$NACL_LIB_DIR'), env.Dir('$OBJ_ROOT/compiler/technique'), # For technique library env.Dir('$OBJ_ROOT/compiler/antlr'), # For antlr3c library ], ) # TODO: rearrange coverage so this can be an append. # NOTE: Do not rearrange or sort these -- order is # (apparently) important here on Linux. env.Prepend( LIBS = [ 'testing_common', 'o3dImportNoConditioner', 'o3dCore', 'o3dImport', 'o3dArchive', 'o3dCorePlatform', 'o3dSerializationObjects', 'o3dSerializer', 'o3dUtils', 'o3d_base', 'FColladaU', 'google_nacl_imc', 'technique', 'antlr3c', 'gtest', 'skia', ] + env['ICU_LIBS'], ) # Next, append renderer specific libraries to the linker environment env.Append( CPPPATH = env['RENDERER_INCLUDE_PATH'], LIBPATH = [ '$CG_DIR/lib', ] + env['RENDERER_LIB_PATH'], LIBS = env['RENDERER_LIBS'], ) # Add libevent on posix platforms. if env.Bit('mac') or env.Bit('linux'): env.Append( LIBS = [ 'event', ], ) # Add cocoa framework on mac. if env.Bit('mac'): env.Append( FRAMEWORKS = [ 'Cocoa', ], ) run_env = env.Clone() if env.Bit('linux'): run_env.Append(ENV = os.environ) run_env.Append( ENV = {'LD_LIBRARY_PATH': run_env.Dir('$ARTIFACTS_DIR').abspath} ) run_env.Append( ENV = {'MOZ_PLUGIN_PATH': run_env.Dir('$ARTIFACTS_DIR').abspath, 'MOZ_CRASHREPORTER_DISABLE': '1'}, PYTHONPATH = ['$GFLAGS_DIR/python', '$SELENIUM_PYTHON_DIR'] ) # Install runtime files required for the build type. gl_requirements = [] if env.Bit('windows'): # The install step for these lives in import/build.scons. the # import library always needs the Cg DLLs and executable, even on # D3D. gl_requirements += [ '$ARTIFACTS_DIR/cg.dll', '$ARTIFACTS_DIR/cgGL.dll', '$ARTIFACTS_DIR/glew32.dll', ] # TODO: shouldn't need this. # Adding extra line for cleaner formatting. env.Help('\n') swiftshader_install = [] if env.Bit('windows'): # Copy SwiftShader to plugin dir. swiftshader_path = env.subst('$SWIFTSHADER_DIR/swiftshader_d3d9.dll') if os.path.exists(swiftshader_path): swiftshader_install = env.Replicate('$ARTIFACTS_DIR/O3DExtras', swiftshader_path) # ------------------------------------------------------------------------- # Unit tests # The basic unit tests tests = [ 'base/cross/bits_test.cc', 'compiler/technique/technique_parser_test.cc', 'core/cross/bitmap_test.cc', 'core/cross/bounding_box_test.cc', 'core/cross/buffer_test.cc', 'core/cross/class_manager_test.cc', 'core/cross/client_test.cc', 'core/cross/client_info_test.cc', 'core/cross/counter_test.cc', 'core/cross/curve_test.cc', 'core/cross/draw_element_test.cc', 'core/cross/draw_list_test.cc', 'core/cross/draw_pass_test.cc', 'core/cross/effect_test.cc', 'core/cross/element_test.cc', 'core/cross/event_manager_test.cc', 'core/cross/fake_vertex_source.cc', 'core/cross/features_test.cc', 'core/cross/field_test.cc', 'core/cross/float_n_test.cc', 'core/cross/function_test.cc', 'core/cross/image_utils_test.cc', 'core/cross/material_test.cc', 'core/cross/math_utilities_test.cc', 'core/cross/matrix4_axis_rotation_test.cc', 'core/cross/matrix4_composition_test.cc', 'core/cross/matrix4_scale_test.cc', 'core/cross/matrix4_translation_test.cc', 'core/cross/message_commands_test.cc', 'core/cross/message_queue_test.cc', 'core/cross/object_base_test.cc', 'core/cross/pack_test.cc', 'core/cross/param_array_test.cc', 'core/cross/param_object_test.cc', 'core/cross/param_operation_test.cc', 'core/cross/param_test.cc', 'core/cross/performance_timer_test.cc', 'core/cross/primitive_test.cc', 'core/cross/ray_intersection_info_test.cc', 'core/cross/render_node_test.cc', 'core/cross/render_surface_test.cc', 'core/cross/renderer_test.cc', 'core/cross/service_locator_test.cc', 'core/cross/shape_test.cc', 'core/cross/skin_test.cc', 'core/cross/smart_ptr_test.cc', 'core/cross/state_set_test.cc', 'core/cross/state_test.cc', 'core/cross/stream_bank_test.cc', 'core/cross/stream_test.cc', 'core/cross/texture_base_test.cc', 'core/cross/texture_test.cc', 'core/cross/transform_test.cc', 'core/cross/tree_traversal_test.cc', 'core/cross/vector_map_test.cc', 'core/cross/vertex_source_test.cc', 'core/cross/visitor_base_test.cc', 'core/cross/weak_ptr_test.cc', 'import/cross/camera_info_test.cc', 'import/cross/destination_buffer_test.cc', 'import/cross/gz_compressor_test.cc', 'import/cross/gz_decompressor_test.cc', 'import/cross/json_object_test.cc', 'import/cross/main_thread_archive_callback_client_test.cc', 'import/cross/memory_buffer_test.cc', 'import/cross/memory_stream_test.cc', 'import/cross/raw_data_test.cc', 'import/cross/tar_generator_test.cc', 'import/cross/tar_processor_test.cc', 'import/cross/targz_generator_test.cc', 'import/cross/targz_processor_test.cc', 'import/cross/threaded_stream_processor_test.cc', 'serializer/cross/serializer_test.cc', 'tests/common/cross/test_utils.cc', 'utils/cross/base64_test.cc', 'utils/cross/dataurl_test.cc', 'utils/cross/file_path_utils_test.cc', 'utils/cross/file_text_reader_test.cc', 'utils/cross/json_writer_test.cc', 'utils/cross/math_gtest.cc', 'utils/cross/math_gtest_test.cc', 'utils/cross/string_reader_test.cc', 'utils/cross/string_writer_test.cc', 'utils/cross/temporary_file_test.cc', ] if env['TARGET_PLATFORM']=='WINDOWS': tests += [ # These are temporarily just being run for windows but should be # moved to global when logging is working for the mac. 'plugin/cross/plugin_logging_test.cc', 'statsreport/aggregator-win32_unittest.cc', 'statsreport/aggregator_unittest.cc', 'statsreport/formatter_unittest.cc', 'statsreport/metrics_unittest.cc', 'statsreport/persistent_iterator-win32_unittest.cc', 'breakpad/win/bluescreen_detector_test.cc', ] env.Append( LINKFLAGS=['/SUBSYSTEM:WINDOWS'], LIBS=[ 'o3dStatsreport_Common', 'o3dStatsreport', 'o3dPlugin_logging', 'o3dBreakpad', 'shlwapi', ] ) unit_tests = env.Program('unit_tests', tests) # After building the test executable, force the windows executable to output # stdout to a console window # TODO: if WinMain/main is handled differently this isn't needed. if env['TARGET_PLATFORM'] == 'WINDOWS': blessed = env.AddPostAction(unit_tests, 'editbin /SUBSYSTEM:CONSOLE $TARGET') else: blessed = unit_tests # Install to artifacts. unit_tests_install = env.Replicate('$ARTIFACTS_DIR', blessed) # Install any data required by the basic unit-tests unit_tests_req = [] env['TEST_DATA_DIR'] = '$SCONSTRUCT_DIR/import/test_data' unit_tests_req += env.Replicate( '$ARTIFACTS_DIR/unittest_data', [ '$TEST_DATA_DIR/crate.dae', '$TEST_DATA_DIR/crate.jpg', '$TEST_DATA_DIR/rock01.tga', '$TEST_DATA_DIR/rock02.tga', ]) env['TECHNIQUE_TEST_DATA_DIR'] = '$SCONSTRUCT_DIR/compiler/technique/test_data' unit_tests_req += env.Replicate( '$ARTIFACTS_DIR/unittest_data', [ '$TECHNIQUE_TEST_DATA_DIR/fur.fx', '$TECHNIQUE_TEST_DATA_DIR/lambert.fx', '$TECHNIQUE_TEST_DATA_DIR/noshader.fx', '$TECHNIQUE_TEST_DATA_DIR/notechnique.fx', '$TECHNIQUE_TEST_DATA_DIR/sampler_test.fx', '$TECHNIQUE_TEST_DATA_DIR/shadow_map.fx', '$TECHNIQUE_TEST_DATA_DIR/simple.fx', ]) unit_tests_req += env.Replicate( '$ARTIFACTS_DIR/bitmap_test', '$SCONSTRUCT_DIR/tests/bitmap_test/*') unit_tests_req += env.Replicate( '$ARTIFACTS_DIR/archive_files', '$SCONSTRUCT_DIR/tests/archive_files/*') # Also require gl related libraries based on variant. unit_tests_req += gl_requirements unit_tests_req += swiftshader_install # Add requirements for unit tests. env.Requires(unit_tests_install, unit_tests_req) # TODO: temporarily continue to use aliases to run tests. # This need to eventually switch to use ComponentTestProgram once # other sections have been adjusted. env['PROGRAM_NAME'] = unit_tests_install[0].path env['PROGRAM_BASENAME'] = os.path.join('$ARTIFACTS_DIR', 'unit_tests') env.AlwaysBuild(run_env.Alias('unit_tests', unit_tests_install, env.subst('$COMPONENT_TEST_CMDLINE'))) # Add help. env.Help('unit_tests: run unit tests\n') if env.Bit('mac'): env['SHLINKFLAGS'] = ['-F$CG_DIR'] env['SHLIBPREFIX'] = [''] env['SHLIBSUFFIX'] = [''] env.Append( FRAMEWORKS = [ 'AGL', 'Accelerate', 'AudioToolbox', 'AudioUnit', 'Carbon', 'Cg', 'CoreAudio', 'Foundation', 'GLUT', 'OpenAL', 'OpenGL', ], CCFLAGS = ['-F$CG_DIR'], LINKFLAGS = ['-F$CG_DIR'], SHLINKFLAGS = ['-F$CG_DIR'] ) env.AddPostAction( unit_tests_install, [ # Change install name reference # make Cg.framework point to copy in $THIRD_PARTY '/usr/bin/install_name_tool ' '-change @executable_path/../Library/Frameworks/Cg.framework/Cg ' '"$CG_DIR/Cg.framework/Cg" ' '"$ARTIFACTS_DIR/unit_tests"' ]) #---------------------------------------------------------------------------- # Install the perceptual diff tool and its requirements. installed_pdiff = None pdiff = None pdiff_requirements = [] if env.Bit('windows'): # Install the perceptual-diff utility for lossy image comparisons pdiff = '$PDIFF_DIR/bin/win/perceptualdiff.exe' # perceptualdiff.exe also needs FreeImage.dll to run pdiff_requirements = env.Replicate('$ARTIFACTS_DIR', '$PDIFF_DIR/bin/win/FreeImage.dll') elif env.Bit("linux"): pdiff = '$PDIFF_DIR/bin/linux/perceptualdiff' elif env.Bit("mac"): pdiff = '$PDIFF_DIR/bin/mac/perceptualdiff' if pdiff: installed_pdiff = env.Replicate('$ARTIFACTS_DIR', pdiff) run_env["PDIFF_PATH"] = installed_pdiff[0] env.Requires(installed_pdiff, pdiff_requirements) # ------------------------------------------------------------------------- # System tests # Only define and run the system tests if they are enabled. if ARGUMENTS.get('SYSTEM_TESTS_ENABLED', False): # Build the system tests system_testprog = env.Program('system_tests', 'basic_system_test/basic_system_test.cc') # After building the test executable, force the windows executable to output # stdout to a console window if env.Bit('windows'): blessed = env.AddPostAction(system_testprog, 'editbin /SUBSYSTEM:CONSOLE $TARGET') else: blessed = system_testprog system_tests_install = env.Replicate('$ARTIFACTS_DIR', blessed) # Gather requirements for system tests. system_tests_req = [] # TODO : The system tests are currently limited to Direct3D. if env.Bit('windows') and 'RENDERER_D3D9' in env['CPPDEFINES']: system_tests_req += env.Replicate( '$ARTIFACTS_DIR', ['test_driver.bat', 'test_driver.py']) # Install the assets required for the basic system test. system_tests_req += env.Replicate( '$ARTIFACTS_DIR/basic_system_test/reference_frames', 'basic_system_test/reference_frames/*') system_tests_req += env.Replicate( '$ARTIFACTS_DIR/basic_system_test', 'basic_system_test/reference_stream.csv') # Copy the PIX utility and experiment file to the testing build directory. if env.Bit('windows') and 'RENDERER_D3D9' in env['CPPDEFINES']: # Replicate a script which will package all of the files required, # for D3D9-tests. pix_requirements = env.Replicate( '$ARTIFACTS_DIR', [ '$DIRECTX9_DIR/utilities/bin/x86/PIXWin.exe', '$DIRECTX9_DIR/utilities/bin/x86/PIXHelper.dll', '$DIRECTX9_DIR/utilities/bin/x86/PIXAdmin.exe', '$DIRECTX9_DIR/utilities/bin/x86/Detoured.dll', '$DIRECTX9_DIR/runtime/x86/d3dref9.dll', 'testing_framework_reference.PIXExp', 'testing_framework_hardware.PIXExp', 'package_tests.bat', ]) system_tests_req += pix_requirements if installed_pdiff: system_tests_req += installed_pdiff # Also require gl related libraries based on variant. system_tests_req += gl_requirements # Require SwiftShader (only if it is available). system_tests_req += swiftshader_install # Add requirements for system_tests. env.Requires(system_tests_install, system_tests_req) # Get command line flags for tests driver. if int(ARGUMENTS.get('hardware', 1)): env.Replace(TEST_DRIVER_FLAGS = '-hardware') # Create an alias for the execution of the system tests. env.Alias('system_tests') # Only add actual step if d3d mode (for now). if 'RENDERER_D3D9' in env['CPPDEFINES']: if env.get('COVERAGE_ENABLED'): # TODO: temporarily continue to use aliases to run tests. # This need to eventually switch to use ComponentTestProgram once # other sections have been adjusted. # When running coverage, don't run system_tests thru test_driver.py env['PROGRAM_NAME'] = system_tests_install[0].path env['PROGRAM_BASENAME'] = os.path.join('$ARTIFACTS_DIR', 'system_tests') env.AlwaysBuild(run_env.Alias( 'system_tests', system_tests_install, env.subst('$COMPONENT_TEST_CMDLINE'))) else: env.AlwaysBuild(run_env.Alias( 'system_tests', system_tests_install, 'cd $ARTIFACTS_DIR && ' + \ sys.executable + ' $ARTIFACTS_DIR/test_driver.py $TEST_DRIVER_FLAGS')) # Add help. env.Help('system_tests: run system tests\n') #---------------------------------------------------------------------------- # Selenium Tests run_env.Replace( SELENIUM_VERBOSE = ARGUMENTS.get('SELENIUM_VERBOSE', '0'), SELENIUM_SERVER_JAR = '$SELENIUM_JAVA_DIR/selenium-server.jar', SELENIUM_TEST_PREFIX = ARGUMENTS.get('SELENIUM_TEST_PREFIX', 'Test'), SELENIUM_TEST_SUFFIXES = ARGUMENTS.get('SELENIUM_TEST_SUFFIXES', 'small,medium,large'), SELENIUM_CAPTURE_SCREENSHOTS = ARGUMENTS.get( 'SELENIUM_CAPTURE_SCREENSHOTS', ''), SELENIUM_SAMPLES_DIR = run_env.subst('$ARTIFACTS_DIR')[ len(run_env.subst('$SCONSTRUCT_DIR')):], SELENIUM_FLAGS = ('--verbose=$SELENIUM_VERBOSE ' '--selenium_server="$SELENIUM_SERVER_JAR" ' '--product_dir="$ARTIFACTS_DIR" ' '--testprefix=$SELENIUM_TEST_PREFIX ' '--testsuffixes=$SELENIUM_TEST_SUFFIXES ' '--screencompare="${PDIFF_PATH.abspath}" ' '$SELENIUM_CAPTURE_SCREENSHOTS ' '$SELENIUM_EXTRA_FLAGS'), ) if run_env.Bit('windows'): from SCons.Platform.win32 import get_program_files_dir path_contents = '%s/Mozilla Firefox;%s' % ( get_program_files_dir(), run_env.Dir('$ARTIFACTS_DIR').abspath) run_env.Append( ENV = {'PATH': '%s/Mozilla Firefox;%s' % ( get_program_files_dir(), run_env.Dir('$ARTIFACTS_DIR').abspath)}, ) run_env.Append( ENV = {'USERPROFILE': os.environ['USERPROFILE']} ) # The Macintosh Firefox apparently does not support the MOZ_PLUGIN_PATH. # On the Mac we can run a hermetic version of Firefox and allow it to find # the O3D plugin by adding a symlink to it inside the plugins directory # inside the Firefox.app bundle. We then instruct selenium to run this # specific version of Firefox. All of this avoids having to install # the plugin in a system directory which could be bad on # auto-build machines, etc. plugin_path = '$ARTIFACTS_DIR/${LIBPREFIX}npo3dautoplugin$SHLIBSUFFIX' browser_path = '' plugin_install_steps = [] cleanup_steps = [] selenium_good_to_go = True if run_env.Bit('mac'): plugin_path = '$ARTIFACTS_DIR/O3D.plugin' if run_env['MAC_HERMETIC_FIREFOX_DIR']: # if we have a hermetic version of Firefox, then run it if os.path.exists(run_env.subst('$MAC_HERMETIC_FIREFOX_DIR')): run_env['MAC_FIREFOX_DIR'] = '$MAC_HERMETIC_FIREFOX_DIR' run_env['MAC_FIREFOX_APP'] = '$MAC_FIREFOX_DIR/Firefox.app' run_env['MAC_FIREFOX_TGZ'] = '$MAC_FIREFOX_DIR/firefox.tgz' browser_path = '$MAC_FIREFOX_APP/Contents/MacOS/firefox-bin' plugin_install_steps = [ 'rm -rf "$MAC_FIREFOX_APP"', 'cd $MAC_FIREFOX_DIR && tar xfz "$MAC_FIREFOX_TGZ"', 'ln -fs "' + plugin_path + '" "$MAC_FIREFOX_APP/Contents/MacOS/plugins"', ] cleanup_steps = [ 'rm -rf "$MAC_FIREFOX_APP"', ] else: # No hermetic version, look for Firefox.app in /Applications run_env['MAC_FIREFOX_ORIG_DIR'] = '/Applications' run_env['MAC_FIREFOX_ORIG_APP'] = '$MAC_FIREFOX_ORIG_DIR/Firefox.app' if not os.path.exists(run_env.subst('$MAC_FIREFOX_ORIG_APP')): selenium_good_to_go = False else: run_env['MAC_FIREFOX_DIR'] = '$TARGET_ROOT/firefox_selenium' run_env['MAC_FIREFOX_APP'] = '$MAC_FIREFOX_DIR/Firefox.app' browser_path = '$MAC_FIREFOX_APP/Contents/MacOS/firefox-bin' plugin_install_steps = [ # copy user's version of Firefox into $MAC_FIREFOX_DIR 'rm -rf "$MAC_FIREFOX_DIR"', 'mkdir "$MAC_FIREFOX_DIR"', 'ditto "$MAC_FIREFOX_ORIG_APP" "$MAC_FIREFOX_APP"', 'ln -fs "' + plugin_path + '" "$MAC_FIREFOX_APP/Contents/MacOS/plugins"', ] cleanup_steps = [ 'rm -rf "$MAC_FIREFOX_DIR"', ] def DeferSeleniumTestsInstall(env): manifest = [] sconstruct_dir = env.subst('$SCONSTRUCT_DIR') for root, dirs, files in \ os.walk(sconstruct_dir + '/tests/selenium/tests'): if '.svn' in dirs: dirs.remove('.svn') for file in files: manifest.append(os.path.join(root[len(sconstruct_dir) + 1:], file)) for manifest_item in manifest: result = env.Command('$ARTIFACTS_DIR/' + manifest_item, '$MAIN_DIR/' + manifest_item, [Delete('$TARGET'), Copy('$TARGET', '$SOURCE'), Chmod('$TARGET', 0777)]) env.Publish('selenium', 'tests', result); env.Defer(DeferSeleniumTestsInstall) def DeferSelenium(env): if not selenium_good_to_go: run_selenium_firefox = run_env.Alias( 'selenium_firefox', [], 'echo "******* Firefox.app MUST be installed in /Applications!!!"' ) else: run_selenium_firefox = run_env.Alias( 'selenium_firefox', [plugin_path, env.GetPublished('samples', 'asset_files'), env.GetPublished('selenium', 'tests')], # TODO: have a cleaner way to do this. [Delete('$ARTIFACTS_DIR/selenium/screenshots_firefox'), Mkdir('$ARTIFACTS_DIR/selenium/screenshots_firefox')] + plugin_install_steps + [run_env.Python([ 'tests/selenium/main.py', '$SELENIUM_FLAGS', '--browser=*firefox', '--browserpath="' + browser_path + '"', '--referencedir=$TEST_REFERENCE_IMAGES', '--screenshotsdir=$ARTIFACTS_DIR/selenium/screenshots_firefox'])] + cleanup_steps, ) # Require SwiftShader (only if it is available). run_env.Requires(run_selenium_firefox, swiftshader_install) if run_env.Bit('windows'): run_selenium_ie = run_env.Alias( 'selenium_ie', ['$ARTIFACTS_DIR/${LIBPREFIX}npo3dautoplugin$SHLIBSUFFIX', '$ARTIFACTS_DIR/${LIBPREFIX}o3d_host$SHLIBSUFFIX', env.GetPublished('samples', 'asset_files')], # TODO: have a cleaner way to do this. [Delete('$ARTIFACTS_DIR/selenium/screenshots_ie'), Mkdir('$ARTIFACTS_DIR/selenium/screenshots_ie'), run_env.Python([ 'tests/selenium/main.py', '$SELENIUM_FLAGS', '--browser=*iexplore', '--servertimeout=80', '--referencedir=$TEST_REFERENCE_IMAGES', '--screenshotsdir=$ARTIFACTS_DIR/selenium/screenshots_ie'])], ) run_env.Requires(run_selenium_ie, '$IE_PLUGIN_DIR') run_selenium_chrome = run_env.Alias( 'selenium_chrome', ['$ARTIFACTS_DIR/${LIBPREFIX}npo3dautoplugin$SHLIBSUFFIX', env.GetPublished('samples', 'asset_files')], # TODO: have a cleaner way to do this. [Delete('$ARTIFACTS_DIR/selenium/screenshots_chrome'), Mkdir('$ARTIFACTS_DIR/selenium/screenshots_chrome'), run_env.Python([ 'tests/selenium/main.py', '$SELENIUM_FLAGS', '--browser=*googlechrome', '--referencedir=$TEST_REFERENCE_IMAGES', '--screenshotsdir=$ARTIFACTS_DIR/selenium/screenshots_chrome'])], ) # Chrome requires that the plug-in be located in the install path. env.Requires(run_selenium_chrome, env.Alias('install')) if installed_pdiff: env.Requires(run_selenium_firefox, installed_pdiff) if run_env.Bit('windows'): env.Requires(run_selenium_ie, installed_pdiff) env.Requires(run_selenium_chrome, installed_pdiff) env.AlwaysBuild(run_selenium_firefox) if run_env.Bit('windows'): env.AlwaysBuild(run_selenium_ie) env.AlwaysBuild(run_selenium_chrome) run_env.Alias('selenium', run_selenium_firefox) run_env.Defer(DeferSelenium) # Add help. env.Help('selenium_{firefox|ie|chrome): run selenium tests in the given browser\n') # Add generation of lump for hive selenium tests. if env.AnyBits('mac', 'windows'): selenium_env = env.Clone() selenium_env.AppendENVPath('PATH', os.environ.get('PRESCONS_PATH', '').split(';')) # Pull in all pulse related environment variables. for k in os.environ: if k.startswith('PULSE_') or k == 'BUILD_NUMBER': selenium_env['ENV'][k] = os.environ[k] selenium_env['PREP_SELENIUM_ARCHIVE'] = ( '$TARGET_ROOT/${PREP_SELENIUM_ARCHIVE_NAME}.zip') if int(ARGUMENTS.get('O3D_ENABLE_BREAKPAD', 0)): selenium_env['O3D_BRANCH'] = 'release' else: selenium_env['O3D_BRANCH'] = 'trunk' if env.Bit('mac'): selenium_env['PREP_SELENIUM_ARCHIVE_NAME'] = 'O3Dtests_mac' selenium_env['GNU_SETUP_EXTRAS'] = '' selenium_env['SETUP_SCRIPTS'] = ( # PYTHONPATH env needed to import python modules used on Buildbot. 'export PYTHONPATH=' + os.environ.get('PYTHONPATH', '')) else: selenium_env['PREP_SELENIUM_ARCHIVE_NAME'] = 'O3Dtests' selenium_env['GNU_SETUP_EXTRAS'] = r'..\o3d-internal\third_party\gnu\setup_env.bat && ' # PYTHONPATH env needed to import python modules used on Buildbot. selenium_env['SETUP_SCRIPTS'] = ( 'set PYTHONPATH=' + os.environ.get('PYTHONPATH', '')) selenium_env['ENV']['DXSDK_DIR'] = os.environ.get('DXSDK_DIR', '') selenium_env.AlwaysBuild(selenium_env.Alias('prep_selenium', [], [Delete('$TARGET_ROOT/${PREP_SELENIUM_ARCHIVE_NAME}'), '$SETUP_SCRIPTS && ' 'cd .. && cd o3d-internal && cd tests && cd lab_automation && ' + sys.executable + ' prepare_selenium_tests.py ' '$TARGET_ROOT/${PREP_SELENIUM_ARCHIVE_NAME}', Delete('$PREP_SELENIUM_ARCHIVE'), '${GNU_SETUP_EXTRAS}' 'cd $TARGET_ROOT && ' 'zip -9 -r $PREP_SELENIUM_ARCHIVE ${PREP_SELENIUM_ARCHIVE_NAME}', ])) #-------------------------------------------------------------------------- # General stuff presubmit_tests = [ env.Alias('unit_tests'), ] if ARGUMENTS.get('SYSTEM_TESTS_ENABLED', False): presubmit_tests += [ env.Alias('system_tests'), ] # TODO: Make presubmit run selenium once the OpenGL build is # completely working. if 'RENDERER_D3D9' in env['CPPDEFINES']: presubmit_tests += [ env.Alias('selenium_firefox'), ] env.Alias('presubmit', presubmit_tests) env.Help('presubmit: run unit tests and selenium integration tests.\n') # Add an alias for what to run on Pulse. pulse_tests = [env.Alias('presubmit')] # OpenGL tests don't work with selenium yet. if 'RENDERER_D3D9' in env['CPPDEFINES']: pulse_tests += [env.Alias('selenium_firefox'), env.Alias('selenium_ie'), env.Alias('selenium_chrome')] # Add selenium for mac. if env.Bit('mac'): pulse_tests += [env.Alias('selenium')] env.Alias('pulse_tests', pulse_tests) env.Help('pulse_tests: the test target that automatic builds use.\n') # TODO: shouldn't need this. # Adding extra line for cleaner formatting. env.Help('\n') #-------------------------------------------------------------------------- # Other odds and ends # Install presubmit_tests batch file. # TODO: is this really needed anymore? env.Replicate('$ARTIFACTS_DIR', 'presubmit_tests.bat')