def setUp(self): self.suppress_logging_methods() self.chrome_src = '/usr/local/google/home/user/repos/chromium/src' self.mock_os_environment({'V8_SRC': '/v8/src', 'CHROME_SRC': '/pdf/src'}) helpers.patch(self, [ 'clusterfuzz.common.ensure_important_dirs', 'clusterfuzz.commands.reproduce.create_builder_class', 'clusterfuzz.commands.reproduce.get_definition', 'clusterfuzz.commands.reproduce.get_testcase_and_identity', 'clusterfuzz.testcase.Testcase.get_testcase_path', ]) self.builder = mock.Mock(symbolizer_path='/path/to/symbolizer') self.reproducer = mock.Mock() self.definition = mock.Mock() self.definition.reproducer.return_value = self.reproducer self.mock.get_definition.return_value = self.definition self.mock.create_builder_class.return_value = self.builder self.testcase = mock.Mock( id='1234', build_url='chrome_build_url', revision=123456, job_type='linux_asan_d8', reproducible=True, reproduction_args='--always-opt', platform='linux') self.mock.get_testcase_and_identity.return_value = ( self.testcase, 'identity@something') self.options = libs.make_options( testcase_id=str(self.testcase.id), extra_log_params={ 'identity': 'identity@something', 'job_type': self.testcase.job_type, 'platform': self.testcase.platform, 'reproducible': self.testcase.reproducible } )
def test_correct_calls(self): """Tests the correct checks and commands are run to build.""" revision_num = 12345 testcase_id = 54321 chrome_source = '/chrome/source' testcase = mock.Mock(id=testcase_id, build_url='', revision=revision_num) self.mock_os_environment({'V8_SRC': chrome_source}) definition = mock.Mock(source_var='V8_SRC', binary_name='binary') builder = binary_providers.V8Builder(testcase, definition, libs.make_options()) builder.build_directory = '/chrome/source/out/clusterfuzz_54321' builder.build_target() self.assert_exact_calls(self.mock.execute, [ mock.call('gclient', 'sync --no-history --shallow', chrome_source), mock.call('gclient', 'runhooks', chrome_source), mock.call('python', 'tools/clang/scripts/update.py', chrome_source), mock.call( 'ninja', ("-w 'dupbuild=err' -C /chrome/source/out/clusterfuzz_54321 " '-j 120 -l 8 d8'), chrome_source, capture_output=False, stdout_transformer=mock.ANY) ]) self.assertIsInstance( self.mock.execute.call_args[1]['stdout_transformer'], output_transformer.Ninja) self.assert_exact_calls(self.mock.setup_gn_args, [mock.call(builder)])
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.GenericBuilder.get_source_dir_path' ]) self.builder = binary_providers.GenericBuilder( libs.make_testcase(), libs.make_definition(source_name='something'), libs.make_options())
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.GenericBuilder.get_source_dir_path', ]) self.builder = binary_providers.GenericBuilder( libs.make_testcase(testcase_id='1234', revision='999'), libs.make_definition(), libs.make_options(current=False))
def setUp(self): helpers.patch(self, ['clusterfuzz.binary_providers.sha_from_revision']) self.mock_os_environment({'V8_SRC': '/source/dir'}) testcase = mock.Mock(id=1234, build_url='', revision=54321) definition = mock.Mock(source_var='V8_SRC') self.builder = binary_providers.V8Builder( testcase, definition, libs.make_options(testcase_id=testcase.id))
def test_base_with_env_args(self): """Test base's reproduce_crash with environment args.""" mocked_testcase = mock.Mock( id=1234, reproduction_args='--app-dir=%APP_DIR% --testcase=%TESTCASE%', environment={'ASAN_OPTIONS': 'test-asan'}, gestures=None, stacktrace_lines=[{ 'content': 'line' }], job_type='job_type') mocked_testcase.get_testcase_path.return_value = self.testcase_path mocked_provider = mock.Mock(symbolizer_path='%s/llvm-symbolizer' % self.app_directory) mocked_provider.get_binary_path.return_value = '%s/d8' % self.app_directory mocked_provider.get_build_directory.return_value = self.app_directory reproducer = reproducers.BaseReproducer( self.definition, mocked_provider, mocked_testcase, 'UBSAN', libs.make_options(target_args='--test')) reproducer.setup_args() reproducer.reproduce_crash() self.assert_exact_calls(self.mock.execute, [ mock.call('/chrome/source/folder/d8', '--app-dir=%s --testcase=%s --test' % (self.app_directory, self.testcase_path), '/chrome/source/folder', env={'ASAN_OPTIONS': 'test-asan'}, exit_on_error=False, timeout=30, stdout_transformer=mock.ANY, redirect_stderr_to_stdout=True) ])
def create_reproducer(klass): """Creates a LinuxChromeJobReproducer for use in testing.""" binary_provider = mock.Mock(symbolizer_path='/path/to/symbolizer') binary_provider.get_binary_path.return_value = '/fake/build_dir/test_binary' binary_provider.get_build_dir_path.return_value = '/fake/build_dir' testcase = mock.Mock( gestures=None, stacktrace_lines=[{ 'content': 'line' }], job_type='job_type', reproduction_args='--original', android_package_name='package') testcase.get_testcase_path.return_value = '/fake/testcase_dir/testcase' reproducer = klass( definition=mock.Mock(), binary_provider=binary_provider, testcase=testcase, sanitizer='UBSAN', options=libs.make_options(target_args='--test')) reproducer.args = '--always-opt' reproducer.environment = {} reproducer.source_directory = '/fake/source_dir' reproducer.original_testcase_path = '/fake/original_testcase_dir/testcase' return reproducer
def test_gn_args(self): """Tests the args.gn parsing of extra values.""" self.builder = binary_providers.PdfiumBuilder( self.testcase, self.definition, libs.make_options(goma_dir='/goma/dir')) os.makedirs(self.testcase_dir) with open(os.path.join(self.testcase_dir, 'args.gn'), 'w') as f: f.write('Not correct args.gn') build_dir = os.path.join(common.CLUSTERFUZZ_BUILDS_DIR, '1234_build') os.makedirs(build_dir) with open(os.path.join(build_dir, 'args.gn'), 'w') as f: f.write('goma_dir = /not/correct/dir') self.builder.build_directory = self.testcase_dir self.builder.setup_gn_args() self.assert_exact_calls(self.mock.execute, [ mock.call('gn', 'gen %s' % self.testcase_dir, '/chrome/source/dir') ]) with open(os.path.join(self.testcase_dir, 'args.gn'), 'r') as f: self.assertEqual(f.read(), ('goma_dir = "/goma/dir"\n' 'pdf_is_standalone = true\n' 'use_goma = true'))
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.sha_from_revision', 'clusterfuzz.binary_providers.get_third_party_sha' ]) self.builder = binary_providers.PdfiumBuilder( libs.make_testcase(revision=1234), libs.make_definition(), libs.make_options())
def setUp(self): helpers.patch(self, [ 'clusterfuzz.common.execute', 'clusterfuzz.binary_providers.GenericBuilder.get_source_dir_path', ]) self.builder = binary_providers.GenericBuilder(libs.make_testcase(), libs.make_definition(), libs.make_options())
def test_debug(self): """Test reproduce in debugger.""" self.reproducer.options = libs.make_options(enable_debug=True) self.reproducer.reproduce(10) self.mock.pre_build_steps.assert_called_once_with(self.reproducer) self.mock.reproduce_debug.assert_called_once_with(self.reproducer) self.assertEqual(0, self.mock.reproduce_normal.call_count)
def test_run(self): """Test run.""" builder = binary_providers.GenericBuilder( libs.make_testcase(), libs.make_definition(), libs.make_options(skip_deps=False)) builder.setup_all_deps() self.mock.gclient_sync.assert_called_once_with(builder) self.mock.gclient_runhooks.assert_called_once_with(builder) self.mock.install_deps.assert_called_once_with(builder)
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.install_build_deps', 'clusterfuzz.binary_providers.ChromiumBuilder.get_source_dir_path', 'clusterfuzz.binary_providers.ChromiumBuilder.install_deps', ]) self.mock.get_source_dir_path.return_value = '/chrome/src' self.builder = binary_providers.ChromiumBuilder32Bit( libs.make_testcase(), libs.make_definition(), libs.make_options())
def test_not_specifying(self): """Test not specifying goma threads.""" self.builder = binary_providers.ChromiumBuilder( self.testcase, self.definition, libs.make_options(goma_threads=None, goma_load=None, goma_dir='dir')) self.assertEqual(self.builder.get_goma_cores(), 3200) self.assertEqual(self.builder.get_goma_load(), 128)
def test_run(self): """Test run.""" builder = binary_providers.V8Builder( self.testcase, self.definition, libs.make_options(goma_dir='/goma/dir', skip_deps=False)) builder.setup_all_deps() self.mock.gclient_sync.assert_called_once_with(builder) self.mock.gclient_runhooks.assert_called_once_with(builder) self.mock.install_deps.assert_called_once_with(builder)
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.ChromiumBuilder.get_gn_args', 'clusterfuzz.binary_providers.ChromiumBuilder.get_source_dir_path', 'clusterfuzz.binary_providers.ChromiumBuilder.gclient_runhooks', 'clusterfuzz.binary_providers.gclient_runhooks_msan', ]) self.builder = binary_providers.MsanChromiumBuilder( libs.make_testcase(), libs.make_definition(), libs.make_options())
def test_skip(self): """Test skip.""" builder = binary_providers.GenericBuilder( libs.make_testcase(), libs.make_definition(), libs.make_options(skip_deps=True)) builder.setup_all_deps() self.assert_n_calls(0, [ self.mock.gclient_sync, self.mock.gclient_runhooks, self.mock.install_deps ])
def test_skip(self): """Test skip.""" builder = binary_providers.V8Builder( self.testcase, self.definition, libs.make_options(goma_dir='/goma/dir', skip_deps=True)) builder.setup_all_deps() self.assert_n_calls(0, [ self.mock.gclient_sync, self.mock.gclient_runhooks, self.mock.install_deps ])
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.gclient_runhooks_msan', 'clusterfuzz.binary_providers.sha_from_revision' ]) testcase = mock.Mock(id=12345, build_url='', revision=4567, gn_args={}) self.mock_os_environment({'V8_SRC': '/chrome/src'}) definition = mock.Mock(source_var='V8_SRC', binary_name='binary') self.builder = binary_providers.MsanChromiumBuilder( testcase, definition, libs.make_options())
def test_chromium(self): """Test chromium's reproduce_crash.""" self.mock.start_execute.return_value = mock.Mock() self.mock.__enter__.return_value = ':display' mocked_testcase = mock.Mock( id=1234, reproduction_args='--repro', environment={'ASAN_OPTIONS': 'test-asan'}, gestures=None, stacktrace_lines=[{ 'content': 'line' }], job_type='job_type') mocked_testcase.get_testcase_path.return_value = self.testcase_path mocked_provider = mock.Mock( symbolizer_path='%s/llvm-symbolizer' % self.app_directory) mocked_provider.get_binary_path.return_value = '%s/d8' % self.app_directory mocked_provider.get_build_dir_path.return_value = self.app_directory reproducer = reproducers.LinuxChromeJobReproducer( self.definition, mocked_provider, mocked_testcase, 'UBSAN', libs.make_options(target_args='--test')) reproducer.gestures = ['gesture,1', 'gesture,2'] reproducer.setup_args() err, text = reproducer.reproduce_crash() self.assertEqual(err, 0) self.assertEqual(text, 'symbolized') self.assert_exact_calls(self.mock.start_execute, [ mock.call( '/chrome/source/folder/d8', '--repro --test %s' % self.testcase_path, '/chrome/source/folder', env={ 'DISPLAY': ':display', 'ASAN_OPTIONS': 'test-asan', }, redirect_stderr_to_stdout=True, stdin=self.mock.UserStdin.return_value) ]) self.assert_exact_calls(self.mock.wait_execute, [ mock.call( self.mock.start_execute.return_value, exit_on_error=False, timeout=30, stdout_transformer=mock.ANY, read_buffer_length=1) ]) self.assert_exact_calls(self.mock.run_gestures, [ mock.call(reproducer, self.mock.start_execute.return_value, ':display') ])
def test_disable_xvfb(self): """Test disable xvfb.""" reproducer = reproducers.LinuxChromeJobReproducer( self.definition, self.provider, self.testcase, 'UBSAN', libs.make_options( disable_xvfb=True, target_args='--test --disable-gl-drawing-for-tests')) reproducer.setup_args() self.assertEqual('--repro --test %s' % self.testcase_path, reproducer.args)
def setUp(self): helpers.patch(self, [ 'clusterfuzz.common.execute', 'clusterfuzz.binary_providers.sha_from_revision', 'clusterfuzz.binary_providers.ChromiumBuilder.install_deps', 'clusterfuzz.binary_providers.ChromiumBuilder.get_source_dir_path', 'os.path.exists' ]) self.mock.get_source_dir_path.return_value = '/chrome/src' self.builder = binary_providers.CfiChromiumBuilder( libs.make_testcase(), libs.make_definition(), libs.make_options())
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.install_build_deps_32bit', 'clusterfuzz.binary_providers.sha_from_revision', 'clusterfuzz.binary_providers.V8Builder.install_deps' ]) testcase = mock.Mock(id=12345, build_url='', revision=4567) self.mock_os_environment({'V8_SRC': '/chrome/src'}) definition = mock.Mock(source_var='V8_SRC', binary_name='binary') self.builder = binary_providers.V8Builder32Bit(testcase, definition, libs.make_options())
def setUp(self): helpers.patch(self, [ 'clusterfuzz.common.execute', 'clusterfuzz.binary_providers.sha_from_revision', 'clusterfuzz.binary_providers.ChromiumBuilder.pre_build_steps' ]) testcase = mock.Mock(id=12345, build_url='', revision=4567) self.mock_os_environment({'V8_SRC': '/chrome/src'}) definition = mock.Mock(source_var='V8_SRC', binary_name='binary') self.builder = binary_providers.CfiChromiumBuilder( testcase, definition, libs.make_options())
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.GenericBuilder.get_source_dir_path', 'clusterfuzz.binary_providers.sha_from_revision', 'clusterfuzz.binary_providers.get_third_party_sha', 'clusterfuzz.binary_providers.install_build_deps', 'clusterfuzz.common.execute', ]) self.mock.get_source_dir_path.return_value = '/src' self.builder = binary_providers.V8Builder( libs.make_testcase(revision=1234), libs.make_definition(), libs.make_options())
def setUp(self): self.suppress_logging_methods() self.chrome_src = '/usr/local/google/home/user/repos/chromium/src' self.mock_os_environment({ 'V8_SRC': '/v8/src', 'CHROME_SRC': '/pdf/src' }) helpers.patch(self, [ 'clusterfuzz.commands.reproduce.get_definition', 'clusterfuzz.commands.reproduce.get_testcase_info', 'clusterfuzz.testcase.Testcase', 'clusterfuzz.commands.reproduce.ensure_goma', 'clusterfuzz.binary_providers.DownloadedBinary', 'clusterfuzz.binary_providers.V8Builder', 'clusterfuzz.binary_providers.ChromiumBuilder', ]) self.response = { 'testcase': { 'gestures': 'test' }, 'id': 1234, 'crash_type': 'Bad Crash', 'crash_state': ['halted'], 'crash_revision': '123456', 'metadata': { 'build_url': 'chrome_build_url' }, 'crash_stacktrace': { 'lines': ['Line 1', 'Line 2'] } } self.mock.get_testcase_info.return_value = self.response self.mock.ensure_goma.return_value = '/goma/dir' self.builder = mock.Mock(symbolizer_path='/path/to/symbolizer') self.builder.get_binary_path.return_value = '/path/to/binary' self.definition = mock.Mock(kwargs={}, source_var='V8_SRC', sanitizer='ASAN') self.definition.builder.return_value = self.builder self.mock.get_definition.return_value = self.definition self.testcase = mock.Mock(id=1234, build_url='chrome_build_url', revision=123456, job_type='linux_asan_d8', reproducible=True, reproduction_args='--always-opt') self.mock.Testcase.return_value = self.testcase self.options = libs.make_options(testcase_id=str(self.testcase.id))
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.setup_debug_symbol_if_needed', 'clusterfuzz.binary_providers.setup_gn_goma_params', ]) self.builder = binary_providers.GenericBuilder( libs.make_testcase(raw_gn_args='a=b\nc=d'), libs.make_definition(sanitizer='ASAN'), libs.make_options(current=False, enable_debug=True)) self.builder.extra_gn_args = {'e': 'f'} self.mock.setup_debug_symbol_if_needed.side_effect = lambda v, _1, _2: v self.mock.setup_gn_goma_params.side_effect = lambda v, _: v
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.download_build_if_needed', 'clusterfuzz.binary_providers.get_or_ask_for_source_location', 'clusterfuzz.binary_providers.BinaryProvider.get_binary_path', ]) self.definition = libs.make_definition(binary_name='d8') self.testcase = libs.make_testcase( testcase_id=12345, build_url='https://storage.cloud.google.com/abc.zip') self.provider = binary_providers.DownloadedBinary( testcase=self.testcase, definition=self.definition, options=libs.make_options())
def test_parameter_already_set(self): """Tests functionality when build_directory parameter is already set.""" testcase = mock.Mock(id=12345, build_url=self.build_url, revision=54321) definition = mock.Mock(source_var='V8_SRC') provider = binary_providers.V8Builder(testcase, definition, libs.make_options()) provider.build_directory = 'dir/already/set' result = provider.get_build_directory() self.assertEqual(result, 'dir/already/set')
def setUp(self): helpers.patch(self, [ 'clusterfuzz.binary_providers.get_clank_sha', 'clusterfuzz.common.execute', 'clusterfuzz.binary_providers.ChromiumBuilder.get_source_dir_path', 'clusterfuzz.binary_providers.ChromiumBuilder.get_build_dir_path', 'clusterfuzz.binary_providers.ChromiumBuilder.get_binary_name', 'clusterfuzz.binary_providers.ChromiumBuilder.install_deps', 'clusterfuzz.binary_providers.ChromiumBuilder.get_gn_args', ]) self.builder = binary_providers.ClankiumBuilder( libs.make_testcase(revision='1234'), libs.make_definition(revision_url='test_url/%s'), libs.make_options())