Skip to content

Commit fe1ca26

Browse files
Fix Stackdriver deduplication for corpus minimization errors
1 parent dc14a6e commit fe1ca26

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

src/clusterfuzz/_internal/bot/tasks/utasks/corpus_pruning_task.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,8 @@ def run(self, initial_corpus_path, minimized_corpus_path, bad_units_path):
479479
raise CorpusPruningError(
480480
'Corpus pruning timed out while minimizing corpus\n' + repr(e))
481481
except engine.Error as e:
482-
raise CorpusPruningError('Corpus pruning failed to minimize corpus\n' +
483-
repr(e))
482+
logs.warning('Corpus pruning failed to minimize corpus\n' + repr(e))
483+
raise CorpusPruningError('Corpus pruning failed to minimize corpus')
484484

485485
symbolized_output = stack_symbolizer.symbolize_stacktrace(result.logs)
486486

src/clusterfuzz/_internal/tests/core/bot/tasks/utasks/corpus_pruning_task_test.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import shutil
2121
import tempfile
2222
import unittest
23-
from unittest.mock import patch
23+
from unittest.mock import MagicMock, patch
2424

2525
from clusterfuzz._internal.bot.fuzzers import options
2626
from clusterfuzz._internal.bot.fuzzers.centipede import \
@@ -30,6 +30,7 @@
3030
from clusterfuzz._internal.bot.tasks import commands
3131
from clusterfuzz._internal.bot.tasks.utasks import corpus_pruning_task
3232
from clusterfuzz._internal.bot.tasks.utasks import uworker_io
33+
from clusterfuzz._internal.metrics import logs
3334
from clusterfuzz._internal.datastore import data_handler
3435
from clusterfuzz._internal.datastore import data_types
3536
from clusterfuzz._internal.google_cloud_utils import blobs
@@ -584,3 +585,35 @@ def tearDown(self):
584585
shutil.rmtree('a')
585586
shutil.rmtree('c')
586587
shutil.rmtree(self.temp_dir)
588+
589+
590+
class CorpusPruningDedupTest(unittest.TestCase):
591+
"""Tests for corpus pruning error deduplication."""
592+
593+
def test_minimize_corpus_error_dedup(self):
594+
"""Test that corpus minimization errors are deduplicated."""
595+
runner = MagicMock()
596+
runner.get_fuzzer_flags.return_value = []
597+
runner.target_path = '/tmp/target'
598+
runner.context = MagicMock()
599+
600+
# We need a predictable repr for the error
601+
err = engine.Error("Variable error content 12345")
602+
runner.minimize_corpus.side_effect = err
603+
604+
pruner = corpus_pruning_task.CorpusPrunerBase(runner)
605+
606+
with patch('clusterfuzz._internal.system.shell.get_directory_file_count', return_value=1), \
607+
patch('clusterfuzz._internal.bot.fuzzers.engine_common.unpack_seed_corpus_if_needed'), \
608+
patch('clusterfuzz._internal.system.environment.reset_current_memory_tool_options'), \
609+
patch('clusterfuzz._internal.metrics.logs.warning') as mock_log_warning, \
610+
patch('clusterfuzz._internal.metrics.logs.info'):
611+
612+
with self.assertRaises(corpus_pruning_task.CorpusPruningError) as cm:
613+
pruner.run('/tmp/initial', '/tmp/minimized', '/tmp/bad')
614+
615+
# This is the expected behavior AFTER fix.
616+
self.assertEqual(str(cm.exception), "Corpus pruning failed to minimize corpus")
617+
618+
# Check detailed log
619+
mock_log_warning.assert_called_with("Corpus pruning failed to minimize corpus\n" + repr(err))

0 commit comments

Comments
 (0)