blob: 0ded658fc5aab0ab8cca2812a9931ab752c09654 [file] [log] [blame]
// Copyright 2022 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 "missive/analytics/registry.h"
#include <memory>
#include <utility>
#include <base/test/task_environment.h>
#include <base/time/time.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "missive/analytics/resource_collector_mock.h"
using ::testing::Assign;
namespace reporting::analytics {
class RegistryTest : public ::testing::Test {
protected:
base::test::TaskEnvironment task_environment_;
};
TEST_F(RegistryTest, RegisterAndUnregister) {
Registry registry;
// Nothing can be removed from an empty registry
ASSERT_FALSE(registry.Remove("nonexisting"));
// Add two collectors and set up their destructor flags. We use these
// destructor flags because the behavior of interleaving EXPECT_CALL within
// the test is undefined by gtest.
auto first_collector =
std::make_unique<ResourceCollectorMock>(base::Seconds(40));
bool first_collector_destructed = false;
EXPECT_CALL(*first_collector, Destruct())
.Times(1)
.WillOnce(Assign(&first_collector_destructed, true));
registry.Add("first-collector", std::move(first_collector));
auto second_collector =
std::make_unique<ResourceCollectorMock>(base::Minutes(30));
bool second_collector_destructed = false;
EXPECT_CALL(*second_collector, Destruct())
.Times(1)
.WillOnce(Assign(&second_collector_destructed, true));
registry.Add("second-collector", std::move(second_collector));
// Can't remove a collector that was not added
ASSERT_FALSE(registry.Remove("third-collector"));
// Remove an added collector
ASSERT_FALSE(first_collector_destructed)
<< "first-collector is not yet removed but is destructed";
ASSERT_TRUE(registry.Remove("first-collector"));
ASSERT_TRUE(first_collector_destructed)
<< "first-collector is removed but is not destructed";
// Can't remove the same collector twice
ASSERT_FALSE(registry.Remove("first-collector"));
// replacing the second collector
ASSERT_FALSE(second_collector_destructed)
<< "second-collector is not yet replaced but is destructed";
registry.Add("second-collector",
std::make_unique<ResourceCollectorMock>(base::Minutes(100)));
ASSERT_TRUE(second_collector_destructed)
<< "second-collector is replaced but is not destructed";
}
} // namespace reporting::analytics