From 0cc957683c073af3409d5ff78d739d8058802117 Mon Sep 17 00:00:00 2001 From: Aashutosh Sairam Murthy Date: Wed, 28 Oct 2026 20:01:20 +0000 Subject: [PATCH] Support base platform matching in ENABLE_FUZZ_FOR_BOTS feature flag Check both environment.platform() and environment.base_platform() against ENABLE_FUZZ_FOR_BOTS.string_value in get_task() so platforms with subqueues (such as ANDROID:PIXEL6 or ANDROID_MTE:PIXEL8) match their base platform (android, android_mte) without requiring every subqueue to be listed individually. Signed-off-by: Aashutosh Sairam Murthy --- .../_internal/base/tasks/__init__.py | 6 ++-- .../tests/core/base/tasks/tasks_test.py | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/clusterfuzz/_internal/base/tasks/__init__.py b/src/clusterfuzz/_internal/base/tasks/__init__.py index 2e5f7c0166..2688d26b79 100644 --- a/src/clusterfuzz/_internal/base/tasks/__init__.py +++ b/src/clusterfuzz/_internal/base/tasks/__init__.py @@ -461,8 +461,10 @@ def get_task(): for p in enable_fuzz_flag.string_value.split(',') if p.strip() ] - if (not enable_fuzz_flag.enabled or - environment.platform().lower() not in allowed_platforms): + platform = environment.platform().lower() + base_platform = environment.base_platform(platform) + if (not enable_fuzz_flag.enabled or (platform not in allowed_platforms and + base_platform not in allowed_platforms)): logs.warning('Fuzzing is disabled for long-lived bots.') return None diff --git a/src/clusterfuzz/_internal/tests/core/base/tasks/tasks_test.py b/src/clusterfuzz/_internal/tests/core/base/tasks/tasks_test.py index 1016d47511..ee5c0dd653 100644 --- a/src/clusterfuzz/_internal/tests/core/base/tasks/tasks_test.py +++ b/src/clusterfuzz/_internal/tests/core/base/tasks/tasks_test.py @@ -662,3 +662,37 @@ def test_empty_string_value(self): mock_flag.return_value = mock_flag_obj self.assertIsNone(tasks.get_task()) self.mock.get_fuzz_task.assert_not_called() + + def test_base_platform_in_string_value(self): + """Test fuzz task is returned when subqueue base platform matches.""" + self.mock.platform.return_value = 'ANDROID:PIXEL6' + mock_flag_obj = mock.MagicMock(enabled=True, string_value='linux,android') + with mock.patch.object( + feature_flags.FeatureFlags, 'flag', + new_callable=mock.PropertyMock) as mock_flag: + mock_flag.return_value = mock_flag_obj + self.assertEqual(tasks.get_task(), self.mock_fuzz_task) + self.mock.get_fuzz_task.assert_called_once() + + def test_subqueue_platform_in_string_value(self): + """Test fuzz task is returned when full subqueue platform matches.""" + self.mock.platform.return_value = 'ANDROID:PIXEL6' + mock_flag_obj = mock.MagicMock( + enabled=True, string_value='linux,android:pixel6') + with mock.patch.object( + feature_flags.FeatureFlags, 'flag', + new_callable=mock.PropertyMock) as mock_flag: + mock_flag.return_value = mock_flag_obj + self.assertEqual(tasks.get_task(), self.mock_fuzz_task) + self.mock.get_fuzz_task.assert_called_once() + + def test_subqueue_and_base_platform_not_in_string_value(self): + """Test fuzz task is not returned when neither platform nor base matches.""" + self.mock.platform.return_value = 'ANDROID_MTE:PIXEL8' + mock_flag_obj = mock.MagicMock(enabled=True, string_value='linux,android') + with mock.patch.object( + feature_flags.FeatureFlags, 'flag', + new_callable=mock.PropertyMock) as mock_flag: + mock_flag.return_value = mock_flag_obj + self.assertIsNone(tasks.get_task()) + self.mock.get_fuzz_task.assert_not_called()