| // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // Fuzzer for ambient_light_handler |
| // |
| // Randomly generate ambient light pref up to 10 steps and test reading |
| // the mock light sensor up to 10000 times. |
| |
| #include <base/logging.h> |
| #include <base/strings/stringprintf.h> |
| #include <fuzzer/FuzzedDataProvider.h> |
| |
| #include <vector> |
| |
| #include "power_manager/powerd/policy/ambient_light_handler.h" |
| #include "power_manager/powerd/policy/ambient_light_pref_fuzz_util.h" |
| #include "power_manager/powerd/system/ambient_light_sensor_stub.h" |
| |
| class Environment { |
| public: |
| Environment() { |
| logging::SetMinLogLevel(logging::LOGGING_FATAL); // Disable logging. |
| } |
| }; |
| |
| namespace power_manager { |
| namespace policy { |
| |
| // AmbientLightHandler::Delegate implementation that does nothing. |
| class FuzzTestDelegate : public AmbientLightHandler::Delegate { |
| public: |
| FuzzTestDelegate() {} |
| ~FuzzTestDelegate() override {} |
| |
| double percent() const { return 0; } |
| AmbientLightHandler::BrightnessChangeCause cause() const { |
| return AmbientLightHandler::BrightnessChangeCause::AMBIENT_LIGHT; |
| } |
| |
| void SetBrightnessPercentForAmbientLight( |
| double brightness_percent, |
| AmbientLightHandler::BrightnessChangeCause cause) override {} |
| |
| void OnColorTemperatureChanged(int color_temperature) override {} |
| }; |
| |
| } // namespace policy |
| } // namespace power_manager |
| |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
| static Environment env; |
| |
| FuzzedDataProvider data_provider(data, size); |
| |
| power_manager::system::AmbientLightSensorStub light_sensor(0); |
| power_manager::policy::FuzzTestDelegate delegate; |
| power_manager::policy::AmbientLightHandler handler(&light_sensor, &delegate); |
| |
| constexpr int kLuxMax = 20000; |
| |
| std::string pref = |
| power_manager::policy::test::GenerateAmbientLightPref(&data_provider); |
| |
| double initial_brightness_percent = |
| data_provider.ConsumeFloatingPointInRange<double>(0, 100); |
| double smoothing_constant = |
| data_provider.ConsumeFloatingPointInRange<double>(0.01, 1); |
| |
| handler.Init(pref, initial_brightness_percent, smoothing_constant); |
| |
| int num_readings = data_provider.ConsumeIntegralInRange<int>(0, 10000); |
| for (int i = 0; i < num_readings; i++) { |
| light_sensor.set_lux(data_provider.ConsumeIntegralInRange<int>(0, kLuxMax)); |
| handler.OnAmbientLightUpdated(&light_sensor); |
| } |
| |
| return 0; |
| } |