blob: dea0cf1285895616aa216968b0e838dd267017ff [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.
#ifndef DIAGNOSTICS_TELEM_TELEM_CACHE_H_
#define DIAGNOSTICS_TELEM_TELEM_CACHE_H_
#include <map>
#include <memory>
#include <base/macros.h>
#include <base/optional.h>
#include <base/time/default_tick_clock.h>
#include <base/time/time.h>
#include <base/time/tick_clock.h>
#include <base/values.h>
#include "diagnostics/telem/telemetry_item_enum.h"
namespace diagnostics {
// Provides caching functionality for libtelem.
class TelemCache final {
public:
TelemCache();
// Injects a custom implementation of the TickClock interface.
// This constructor should only be used for testing. Production
// code should only call the argument-less constructor.
explicit TelemCache(base::TickClock* tick_clock);
~TelemCache();
// Whether or not the cache contains valid telemetry data
// for |item|, which must be no older than |acceptable_age|.
bool IsValid(TelemetryItemEnum item, base::TimeDelta acceptable_age) const;
// Gets telemetry data for |item| in an appropriate representation.
// Does not check that the data is valid, so IsValid(|item|, acceptable_age)
// should be checked first before calling this function. The returned value
// should be checked before it is used - the function will return
// base::nullopt if the requested item does not exist in the cache.
const base::Optional<base::Value> GetParsedData(TelemetryItemEnum item);
// Sets telemetry data for |item|, which can be retrieved later
// via GetParsedData(|item|).
void SetParsedData(TelemetryItemEnum item, base::Optional<base::Value> data);
// Invalidates every item in the cache.
void Invalidate();
private:
// Internal representation of the data corresponding to
// a single telemetry item.
struct TelemItem {
TelemItem(base::Optional<base::Value> data_in,
base::TimeTicks last_fetched_time_ticks_in);
base::Optional<base::Value> data;
base::TimeTicks last_fetched_time_ticks;
};
std::map<TelemetryItemEnum, TelemItem> cache_;
std::unique_ptr<base::DefaultTickClock> default_tick_clock_;
base::TickClock* tick_clock_;
DISALLOW_COPY_AND_ASSIGN(TelemCache);
};
} // namespace diagnostics
#endif // DIAGNOSTICS_TELEM_TELEM_CACHE_H_