blob: 73c188e9039a13415e5f836b95ad4f3143b893ab [file] [log] [blame]
// Copyright 2018 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 <string>
#include <utility>
#include <base/logging.h>
#include <base/test/simple_test_tick_clock.h>
#include <base/time/time.h>
#include <base/values.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "diagnostics/telem/telem_cache.h"
#include "diagnostics/telem/telemetry_item_enum.h"
using testing::StrictMock;
namespace diagnostics {
namespace {
// String values that telemetry items can take.
constexpr char kFirstStrValue[] = "test_val1";
constexpr char kSecondStrValue[] = "test_val2";
// Longest TimeDelta that an item inserted into the cache is valid for.
constexpr base::TimeDelta kInsertionDelta = base::TimeDelta::FromSeconds(2);
// Longer TimeDelta than the insertion time. Requesting an item with this delta
// should pass the cache's timeout check.
constexpr base::TimeDelta kAfterInsertionDelta =
base::TimeDelta::FromSeconds(3);
// Shorter TimeDelta than the insertion time. Requesting an item with this delta
// should fail the cache's timeout check.
constexpr base::TimeDelta kBeforeInsertionDelta =
base::TimeDelta::FromSeconds(1);
} // namespace
class TelemCacheTest : public ::testing::Test {
public:
TelemCacheTest() = default;
TelemCache* cache() { return cache_.get(); }
base::SimpleTestTickClock* clock() { return &clock_; }
private:
base::SimpleTestTickClock clock_;
std::unique_ptr<TelemCache> cache_ = std::make_unique<TelemCache>(&clock_);
DISALLOW_COPY_AND_ASSIGN(TelemCacheTest);
};
// Test that an empty cache does not have a valid entry.
TEST_F(TelemCacheTest, EmptyCacheInvalidEntry) {
EXPECT_FALSE(cache()->IsValid(TelemetryItemEnum::kMemTotalMebibytes,
kAfterInsertionDelta));
}
// Test that we get an appropriate error if we attempt to access an
// entry which does not exist.
TEST_F(TelemCacheTest, AccessMissingEntry) {
EXPECT_EQ(cache()->GetParsedData(TelemetryItemEnum::kMemTotalMebibytes),
base::nullopt);
}
// Test that we can insert and retrieve an item with the cache.
TEST_F(TelemCacheTest, InsertNewEntry) {
cache()->SetParsedData(TelemetryItemEnum::kMemTotalMebibytes,
base::Value(kFirstStrValue));
std::string string_val;
const base::Optional<base::Value> returned_data =
cache()->GetParsedData(TelemetryItemEnum::kMemTotalMebibytes);
ASSERT_TRUE(returned_data);
EXPECT_TRUE(returned_data.value().GetAsString(&string_val));
EXPECT_EQ(string_val, kFirstStrValue);
}
// Test that an old cached value is not valid.
TEST_F(TelemCacheTest, InvalidOldEntry) {
cache()->SetParsedData(TelemetryItemEnum::kMemTotalMebibytes,
base::Value(kFirstStrValue));
clock()->Advance(kInsertionDelta);
EXPECT_FALSE(cache()->IsValid(TelemetryItemEnum::kMemTotalMebibytes,
kBeforeInsertionDelta));
}
// Test that a recent cached value is valid.
TEST_F(TelemCacheTest, ValidRecentEntry) {
cache()->SetParsedData(TelemetryItemEnum::kMemTotalMebibytes,
base::Value(kFirstStrValue));
clock()->Advance(kInsertionDelta);
EXPECT_TRUE(cache()->IsValid(TelemetryItemEnum::kMemTotalMebibytes,
kAfterInsertionDelta));
}
// Test that we can update a cached item's value.
TEST_F(TelemCacheTest, UpdateExistingEntry) {
cache()->SetParsedData(TelemetryItemEnum::kMemTotalMebibytes,
base::Value(kFirstStrValue));
std::string string_val;
const base::Optional<base::Value> first_returned_data =
cache()->GetParsedData(TelemetryItemEnum::kMemTotalMebibytes);
ASSERT_TRUE(first_returned_data);
EXPECT_TRUE(first_returned_data.value().GetAsString(&string_val));
EXPECT_EQ(string_val, kFirstStrValue);
cache()->SetParsedData(TelemetryItemEnum::kMemTotalMebibytes,
base::Value(kSecondStrValue));
const base::Optional<base::Value> second_returned_data =
cache()->GetParsedData(TelemetryItemEnum::kMemTotalMebibytes);
ASSERT_TRUE(second_returned_data);
EXPECT_TRUE(second_returned_data.value().GetAsString(&string_val));
EXPECT_EQ(string_val, kSecondStrValue);
}
// Test that we can invalidate the cache.
TEST_F(TelemCacheTest, InvalidateExistingEntries) {
cache()->SetParsedData(TelemetryItemEnum::kMemTotalMebibytes,
base::Value(kFirstStrValue));
cache()->SetParsedData(TelemetryItemEnum::kMemFreeMebibytes,
base::Value(kSecondStrValue));
clock()->Advance(kInsertionDelta);
EXPECT_TRUE(cache()->IsValid(TelemetryItemEnum::kMemTotalMebibytes,
kAfterInsertionDelta));
EXPECT_TRUE(cache()->IsValid(TelemetryItemEnum::kMemFreeMebibytes,
kAfterInsertionDelta));
cache()->Invalidate();
EXPECT_FALSE(cache()->IsValid(TelemetryItemEnum::kMemTotalMebibytes,
kAfterInsertionDelta));
EXPECT_FALSE(cache()->IsValid(TelemetryItemEnum::kMemFreeMebibytes,
kAfterInsertionDelta));
}
} // namespace diagnostics