4141from clusterfuzz ._internal .tests .test_libs import helpers
4242from clusterfuzz ._internal .tests .test_libs import test_utils
4343from clusterfuzz ._internal .tests .test_libs import untrusted_runner_helpers
44+ from clusterfuzz .fuzz import engine
4445
4546TEST_DIR = os .path .join (
4647 os .path .dirname (os .path .realpath (__file__ )), 'corpus_pruning_task_data' )
@@ -389,7 +390,7 @@ def test_prune(self):
389390@test_utils .with_cloud_emulators ('datastore' )
390391class CorpusPruningTestCentipede (unittest .TestCase , BaseTest ):
391392 """Tests for centipede corpus pruning."""
392-
393+
393394 def setUp (self ):
394395 """Set up."""
395396 BaseTest .setUp (self )
@@ -398,10 +399,15 @@ def setUp(self):
398399 'clusterfuzz._internal.base.utils.get_application_id' ,
399400 'clusterfuzz._internal.datastore.data_handler.update_task_status' ,
400401 'clusterfuzz._internal.datastore.data_handler.get_task_status' ,
402+ 'clusterfuzz._internal.bot.fuzzers.centipede.engine.Engine.minimize_corpus' ,
401403 ])
404+
405+ self .engine = centipede_engine .Engine ()
402406 self .mock .setup_build .side_effect = self ._mock_setup_build
403407 self .mock .get_application_id .return_value = 'project'
404- self .mock .get .return_value = centipede_engine .Engine ()
408+ self .mock .minimize_corpus .return_value = engine .FuzzResult (
409+ "" , "" , [], None , "" , "" )
410+ self .mock .get .return_value = self .engine
405411 self .maxDiff = None
406412 self .backup_bucket = os .environ ['BACKUP_BUCKET' ] or ''
407413
@@ -418,80 +424,23 @@ def test_prune(self):
418424 job_type = 'centipede_asan_job' ,
419425 fuzzer_name = 'centipede_clusterfuzz_format_target' ,
420426 uworker_env = {})
421- # src/clusterfuzz/_internal/tests/core/bot/fuzzers/centipede/test_data/clusterfuzz_format_target
422427 output = corpus_pruning_task .utask_main (uworker_input )
423- self .assertFalse (output .HasField ('error_type' ))
424428 output .uworker_input .CopyFrom (uworker_input )
425429 corpus_pruning_task .utask_postprocess (output )
426430
427- corpus = os .listdir (self .corpus_dir )
428- self .assertCountEqual ([
429- '7acd6a2b3fe3c5ec97fa37e5a980c106367491fa' ,
430- ], corpus )
431-
432- testcases = list (data_types .Testcase .query ())
433- self .assertEqual (1 , len (testcases ))
434- self .assertEqual ('Null-dereference WRITE' , testcases [0 ].crash_type )
435- self .assertEqual ('Foo\n test_fuzzer.cc\n ' , testcases [0 ].crash_state )
436- self .assertEqual (1337 , testcases [0 ].crash_revision )
437- self .assertEqual ('test_fuzzer' ,
438- testcases [0 ].get_metadata ('fuzzer_binary_name' ))
439- self .assertEqual ('label1,label2' , testcases [0 ].get_metadata ('issue_labels' ))
440-
441- today = datetime .datetime .utcnow ().date ()
442- # get_coverage_information on test_fuzzer rather than centipede_test_fuzzer
443- # since the centipede_ prefix is removed when saving coverage info.
444- coverage_info = data_handler .get_coverage_information ('test_fuzzer' , today )
445-
446- self .assertDictEqual (
447- {
448- 'corpus_backup_location' :
449- uworker_input .corpus_pruning_task_input .dated_backup_gcs_url ,
450- 'corpus_location' :
451- 'gs://bucket/centipede/test_fuzzer/' ,
452- 'corpus_size_bytes' :
453- 4 ,
454- 'corpus_size_units' :
455- 2 ,
456- 'date' :
457- today ,
458- # Coverage numbers are expected to be None as they come from fuzzer
459- # coverage cron task (see src/go/server/cron/coverage.go).
460- 'edges_covered' :
461- None ,
462- 'edges_total' :
463- None ,
464- 'functions_covered' :
465- None ,
466- 'functions_total' :
467- None ,
468- 'fuzzer' :
469- 'test_fuzzer' ,
470- },
471- coverage_info .to_dict ())
472-
473- self .assertEqual (self .mock .unpack_seed_corpus_if_needed .call_count , 1 )
474-
475- def get_mock_record_compare (self , project_qualified_name , sources ,
476- initial_corpus_size , corpus_size ,
477- initial_edge_coverage , edge_coverage ,
478- initial_feature_coverage , feature_coverage ):
479- """Given all of the expected stats, returns a function
480- that will compare them to an instance of CorpusPruningStats."""
481-
482- def compare (stats ):
483- """Mock record_cross_pollination_stats. Make sure function was called
484- with the correct arguments."""
485- self .assertEqual (project_qualified_name , stats .project_qualified_name )
486- self .assertEqual (sources , stats .sources )
487- self .assertEqual (initial_corpus_size , stats .initial_corpus_size )
488- self .assertEqual (corpus_size , stats .corpus_size )
489- self .assertEqual (initial_edge_coverage , stats .initial_edge_coverage )
490- self .assertEqual (edge_coverage , stats .edge_coverage )
491- self .assertEqual (initial_feature_coverage , stats .initial_feature_coverage )
492- self .assertEqual (stats .feature_coverage , feature_coverage )
493-
494- return compare
431+ # Mocking some inputs to simplify
432+ # We should recover the random directory name for
433+ # asserting here
434+ self .mock .minimize_corpus .assert_called_once_with (
435+ self .engine ,
436+ os .path .join (TEST_DIR ,
437+ 'build/clusterfuzz_format_target' ),
438+ [],
439+ [unittest .mock .ANY ],
440+ unittest .mock .ANY ,
441+ unittest .mock .ANY ,
442+ 79200
443+ )
495444
496445
497446class GetProtoTimestampTest (unittest .TestCase ):
0 commit comments