| Index: components/metrics/persistent_system_profile_unittest.cc
|
| diff --git a/components/metrics/persistent_system_profile_unittest.cc b/components/metrics/persistent_system_profile_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..79ab6276626ae42f661c307cdfab1ca10fcc271a
|
| --- /dev/null
|
| +++ b/components/metrics/persistent_system_profile_unittest.cc
|
| @@ -0,0 +1,120 @@
|
| +// Copyright 2017 The Chromium 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 "components/metrics/persistent_system_profile.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/metrics/persistent_memory_allocator.h"
|
| +#include "base/rand_util.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace metrics {
|
| +
|
| +class PersistentSystemProfileTest : public testing::Test {
|
| + public:
|
| + const int32_t kAllocatorMemorySize = 1 << 20; // 1 MiB
|
| +
|
| + PersistentSystemProfileTest() {}
|
| + ~PersistentSystemProfileTest() override {}
|
| +
|
| + void SetUp() override {
|
| + memory_allocator_ = base::MakeUnique<base::LocalPersistentMemoryAllocator>(
|
| + kAllocatorMemorySize, 0, "");
|
| + records_ = base::MakeUnique<PersistentSystemProfile::RecordAllocator>(
|
| + memory_allocator_.get());
|
| + persistent_profile_.RegisterPersistentAllocator(memory_allocator_.get());
|
| + }
|
| +
|
| + void TearDown() override {
|
| + persistent_profile_.DeregisterPersistentAllocator(memory_allocator_.get());
|
| + records_.reset();
|
| + memory_allocator_.reset();
|
| + }
|
| +
|
| + void WriteRecord(uint8_t type, const std::string& record) {
|
| + persistent_profile_.allocators_[0].Write(
|
| + static_cast<PersistentSystemProfile::RecordType>(type), record);
|
| + }
|
| +
|
| + bool ReadRecord(uint8_t* type, std::string* record) {
|
| + PersistentSystemProfile::RecordType rec_type;
|
| +
|
| + bool success = records_->Read(&rec_type, record);
|
| + *type = rec_type; // Convert to uint8_t for testing.
|
| + return success;
|
| + }
|
| +
|
| + base::PersistentMemoryAllocator* memory_allocator() {
|
| + return memory_allocator_.get();
|
| + }
|
| +
|
| + PersistentSystemProfile* persistent_profile() { return &persistent_profile_; }
|
| +
|
| + private:
|
| + PersistentSystemProfile persistent_profile_;
|
| + std::unique_ptr<base::PersistentMemoryAllocator> memory_allocator_;
|
| + std::unique_ptr<PersistentSystemProfile::RecordAllocator> records_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PersistentSystemProfileTest);
|
| +};
|
| +
|
| +TEST_F(PersistentSystemProfileTest, Create) {
|
| + uint32_t type;
|
| + base::PersistentMemoryAllocator::Iterator iter(memory_allocator());
|
| + base::PersistentMemoryAllocator::Reference ref = iter.GetNext(&type);
|
| + DCHECK(ref);
|
| + DCHECK_NE(0U, type);
|
| +}
|
| +
|
| +TEST_F(PersistentSystemProfileTest, RecordSplitting) {
|
| + const size_t kRecordSize = 100 << 10; // 100 KiB
|
| + std::vector<char> buffer;
|
| + buffer.resize(kRecordSize);
|
| + base::RandBytes(&buffer[0], kRecordSize);
|
| +
|
| + WriteRecord(42, std::string(&buffer[0], kRecordSize));
|
| +
|
| + uint8_t type;
|
| + std::string record;
|
| + ASSERT_TRUE(ReadRecord(&type, &record));
|
| + EXPECT_EQ(42U, type);
|
| + ASSERT_EQ(kRecordSize, record.size());
|
| + for (size_t i = 0; i < kRecordSize; ++i)
|
| + EXPECT_EQ(buffer[i], record[i]);
|
| +}
|
| +
|
| +TEST_F(PersistentSystemProfileTest, ProfileStorage) {
|
| + SystemProfileProto proto1;
|
| + SystemProfileProto::FieldTrial* trial = proto1.add_field_trial();
|
| + trial->set_name_id(123);
|
| + trial->set_group_id(456);
|
| +
|
| + persistent_profile()->SetSystemProfile(proto1);
|
| +
|
| + SystemProfileProto proto2;
|
| + ASSERT_TRUE(
|
| + PersistentSystemProfile::GetSystemProfile(&proto2, memory_allocator()));
|
| + ASSERT_EQ(1, proto2.field_trial_size());
|
| + EXPECT_EQ(123U, proto2.field_trial(0).name_id());
|
| + EXPECT_EQ(456U, proto2.field_trial(0).group_id());
|
| +
|
| + // Check that the profile can be overwritten.
|
| +
|
| + trial = proto1.add_field_trial();
|
| + trial->set_name_id(78);
|
| + trial->set_group_id(90);
|
| +
|
| + persistent_profile()->SetSystemProfile(proto1);
|
| +
|
| + ASSERT_TRUE(
|
| + PersistentSystemProfile::GetSystemProfile(&proto2, memory_allocator()));
|
| + ASSERT_EQ(2, proto2.field_trial_size());
|
| + EXPECT_EQ(123U, proto2.field_trial(0).name_id());
|
| + EXPECT_EQ(456U, proto2.field_trial(0).group_id());
|
| + EXPECT_EQ(78U, proto2.field_trial(1).name_id());
|
| + EXPECT_EQ(90U, proto2.field_trial(1).group_id());
|
| +}
|
| +
|
| +} // namespace metrics
|
|
|