blob: 99b152a1be5f4067dc4d12e638087918e4d61a26 [file] [log] [blame]
// Copyright 2019 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 <map>
#include <utility>
#include <base/message_loop/message_loop.h>
#include <base/time/time.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "diagnostics/telem/cache_writer_impl.h"
#include "diagnostics/telem/telem_parsers.h"
#include "diagnostics/telem/telemetry.h"
#include "diagnostics/telem/telemetry_item_enum.h"
using ::testing::_;
namespace diagnostics {
char const* kFakePerCPUIdleTimes[] = {"653435243543", "235435413"};
constexpr char kFakeBadLoadavgFileContents[] = "0.82 0.61 0.52 2 370 30707\n";
constexpr char kFakeBadMeminfoFileContents[] =
"MemTotal: 3906320\nMemfree: 873180 kB\n";
constexpr char kFakeBadStatFileContents[] =
"cpu 0 0 165432156432413546\npu0 0 0 0 653435243543\ncpu1 0 0 0 "
"235435413\nctxt 5345634354";
constexpr char kFakeLoadavgFileContents[] = "0.82 0.61 0.52 2/370 30707\n";
constexpr char kFakeMeminfoFileContents[] =
"MemTotal: 3906320 kB\nMemFree: 873180 kB\n";
constexpr char kFakeTotalCPUIdleTime[] = "165432156432413546";
constexpr int kFakeMemFreeMebibytes = 852;
constexpr int kFakeMemTotalMebibytes = 3906320 / 1024;
constexpr int kFakeNumExistingEntities = 370;
constexpr int kFakeNumRunnableEntities = 2;
constexpr char kFakeStatFileContents[] =
"cpu 0 0 0 165432156432413546\ncpu0 0 0 0 653435243543\ncpu1 0 0 0 "
"235435413\nctxt 5345634354";
// Test that we can retrieve kMemTotalMebibytes and kMemFreeMebibytes.
TEST(TelemParsers, GetMemTotal) {
FileDump file_dump{"", "", kFakeMeminfoFileContents};
CacheWriterImpl test_cache;
ParseDataFromProcMeminfo({file_dump}, &test_cache);
test_cache.CheckParsedDataFor(TelemetryItemEnum::kMemTotalMebibytes,
base::Value(kFakeMemTotalMebibytes));
test_cache.CheckParsedDataFor(TelemetryItemEnum::kMemFreeMebibytes,
base::Value(kFakeMemFreeMebibytes));
}
// Test that an incorrectly formatted /proc/meminfo will fail to parse.
TEST(TelemParsers, GetBadMeminfo) {
FileDump file_dump{"", "", kFakeBadMeminfoFileContents};
CacheWriterImpl test_cache;
ParseDataFromProcMeminfo({file_dump}, &test_cache);
test_cache.CheckParsedDataIsNull(TelemetryItemEnum::kMemTotalMebibytes);
test_cache.CheckParsedDataIsNull(TelemetryItemEnum::kMemFreeMebibytes);
}
// Test that we can retrieve kNumRunnableEntities and kNumExistingEntities.
TEST(TelemParsers, GetRunnableEntities) {
FileDump file_dump{"", "", kFakeLoadavgFileContents};
CacheWriterImpl test_cache;
ParseDataFromProcLoadavg({file_dump}, &test_cache);
test_cache.CheckParsedDataFor(TelemetryItemEnum::kNumRunnableEntities,
base::Value(kFakeNumRunnableEntities));
test_cache.CheckParsedDataFor(TelemetryItemEnum::kNumExistingEntities,
base::Value(kFakeNumExistingEntities));
}
// Test that an incorrectly formatted /proc/loadavg will fail to parse.
TEST(TelemParsers, GetBadLoadAvg) {
FileDump file_dump{"", "", kFakeBadLoadavgFileContents};
CacheWriterImpl test_cache;
ParseDataFromProcLoadavg({file_dump}, &test_cache);
test_cache.CheckParsedDataIsNull(TelemetryItemEnum::kNumRunnableEntities);
test_cache.CheckParsedDataIsNull(TelemetryItemEnum::kNumExistingEntities);
}
// Test that we can retrieve kTotalIdleTimeUserHz and kIdleTimePerCPUUserHz.
TEST(TelemParsers, GetCPUTimes) {
FileDump file_dump{"", "", kFakeStatFileContents};
CacheWriterImpl test_cache;
ParseDataFromProcStat({file_dump}, &test_cache);
test_cache.CheckParsedDataFor(TelemetryItemEnum::kTotalIdleTimeUserHz,
base::Value(kFakeTotalCPUIdleTime));
base::ListValue fake_idle_times;
for (auto fakePerCPUIdleTime : kFakePerCPUIdleTimes) {
fake_idle_times.AppendString(fakePerCPUIdleTime);
}
test_cache.CheckParsedDataFor(TelemetryItemEnum::kIdleTimePerCPUUserHz,
fake_idle_times);
}
// Test that an incorrectly formatted /proc/stat will fail gracefully.
TEST(TelemParsers, GetEmptyStat) {
FileDump file_dump{"", "", ""};
CacheWriterImpl test_cache;
ParseDataFromProcStat({file_dump}, &test_cache);
test_cache.CheckParsedDataIsNull(TelemetryItemEnum::kIdleTimePerCPUUserHz);
}
// Test that an empty /proc/stat will fail gracefully.
TEST(TelemParsers, GetBadStat) {
FileDump file_dump{"", "", kFakeBadStatFileContents};
CacheWriterImpl test_cache;
ParseDataFromProcStat({file_dump}, &test_cache);
test_cache.CheckParsedDataIsNull(TelemetryItemEnum::kIdleTimePerCPUUserHz);
}
// Test that an incorrectly formatted /proc/stat will fail to parse.
TEST(TelemParsers, GetNoFileStat) {
CacheWriterImpl test_cache;
ParseDataFromProcStat({}, &test_cache);
test_cache.CheckParsedDataIsNull(TelemetryItemEnum::kIdleTimePerCPUUserHz);
}
} // namespace diagnostics