| // Copyright 2021 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. |
| |
| #include <memory> |
| #include <utility> |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "federated/device_status_monitor.h" |
| |
| namespace federated { |
| namespace { |
| |
| using ::testing::Return; |
| using ::testing::StrictMock; |
| using ::testing::Test; |
| |
| class MockTrainingCondition : public TrainingCondition { |
| public: |
| MockTrainingCondition() = default; |
| ~MockTrainingCondition() override = default; |
| MOCK_METHOD(bool, IsTrainingConditionSatisfied, (), (const, override)); |
| }; |
| } // namespace |
| |
| class DeviceStatusMonitorTest : public Test { |
| public: |
| DeviceStatusMonitorTest() = default; |
| DeviceStatusMonitorTest(const DeviceStatusMonitorTest&) = delete; |
| DeviceStatusMonitorTest& operator=(const DeviceStatusMonitorTest&) = delete; |
| }; |
| |
| TEST_F(DeviceStatusMonitorTest, OneTrainingCondition) { |
| auto training_condition1 = |
| std::make_unique<StrictMock<MockTrainingCondition>>(); |
| auto training_condition_1 = training_condition1.get(); |
| |
| std::vector<std::unique_ptr<TrainingCondition>> training_conditions; |
| training_conditions.push_back(std::move(training_condition1)); |
| auto device_status_monitor = |
| DeviceStatusMonitor(std::move(training_conditions)); |
| |
| EXPECT_CALL(*training_condition_1, IsTrainingConditionSatisfied()) |
| .WillOnce(Return(false)); |
| EXPECT_FALSE(device_status_monitor.TrainingConditionsSatisfied()); |
| |
| EXPECT_CALL(*training_condition_1, IsTrainingConditionSatisfied()) |
| .WillOnce(Return(true)); |
| EXPECT_TRUE(device_status_monitor.TrainingConditionsSatisfied()); |
| } |
| |
| TEST_F(DeviceStatusMonitorTest, TwoTrainingConditions) { |
| auto training_condition1 = |
| std::make_unique<StrictMock<MockTrainingCondition>>(); |
| auto training_condition_1 = training_condition1.get(); |
| |
| auto training_condition2 = |
| std::make_unique<StrictMock<MockTrainingCondition>>(); |
| auto training_condition_2 = training_condition2.get(); |
| |
| std::vector<std::unique_ptr<TrainingCondition>> training_conditions; |
| training_conditions.push_back(std::move(training_condition1)); |
| training_conditions.push_back(std::move(training_condition2)); |
| auto device_status_monitor = |
| DeviceStatusMonitor(std::move(training_conditions)); |
| |
| // false, any -> false |
| EXPECT_CALL(*training_condition_1, IsTrainingConditionSatisfied()) |
| .WillOnce(Return(false)); |
| // Expect tc2 not to be called |
| EXPECT_FALSE(device_status_monitor.TrainingConditionsSatisfied()); |
| |
| // true, false -> false |
| EXPECT_CALL(*training_condition_1, IsTrainingConditionSatisfied()) |
| .WillOnce(Return(true)); |
| EXPECT_CALL(*training_condition_2, IsTrainingConditionSatisfied()) |
| .WillOnce(Return(false)); |
| EXPECT_FALSE(device_status_monitor.TrainingConditionsSatisfied()); |
| |
| // true, true -> true |
| EXPECT_CALL(*training_condition_1, IsTrainingConditionSatisfied()) |
| .WillOnce(Return(true)); |
| EXPECT_CALL(*training_condition_2, IsTrainingConditionSatisfied()) |
| .WillOnce(Return(true)); |
| EXPECT_TRUE(device_status_monitor.TrainingConditionsSatisfied()); |
| } |
| } // namespace federated |