blob: f320faf49232e0aa36da71db1f1f2603fab5a923 [file] [log] [blame]
// Copyright 2018 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 "services/network/keepalive_statistics_recorder.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace network {
namespace {
TEST(KeepaliveStatisticsRecorderTest, InitialState) {
KeepaliveStatisticsRecorder r;
EXPECT_EQ(0, r.num_inflight_requests());
EXPECT_EQ(0, r.peak_inflight_requests());
EXPECT_TRUE(r.per_process_records().empty());
}
TEST(KeepaliveStatisticsRecorderTest, Register) {
KeepaliveStatisticsRecorder r;
constexpr int process_id = 4;
r.Register(process_id);
EXPECT_EQ(0, r.num_inflight_requests());
EXPECT_EQ(0, r.peak_inflight_requests());
const auto& map = r.per_process_records();
EXPECT_EQ(1u, map.size());
auto it = map.find(process_id);
ASSERT_NE(it, map.end());
EXPECT_EQ(1, it->second.num_registrations);
EXPECT_EQ(0, it->second.num_inflight_requests);
EXPECT_EQ(0, it->second.peak_inflight_requests);
}
TEST(KeepaliveStatisticsRecorderTest, Unregister) {
KeepaliveStatisticsRecorder r;
constexpr int process_id = 4;
r.Register(process_id);
EXPECT_FALSE(r.per_process_records().empty());
r.Unregister(process_id);
EXPECT_TRUE(r.per_process_records().empty());
}
TEST(KeepaliveStatisticsRecorderTest, MultipleRegistration) {
KeepaliveStatisticsRecorder r;
constexpr int process1 = 4;
constexpr int process2 = 7;
constexpr int process3 = 8;
r.Register(process1);
r.Register(process2);
r.Register(process3);
r.Register(process1);
r.Register(process2);
r.Unregister(process1);
r.Unregister(process3);
const auto& map = r.per_process_records();
EXPECT_EQ(2u, map.size());
auto it1 = map.find(process1);
auto it2 = map.find(process2);
auto it3 = map.find(process3);
EXPECT_NE(it1, map.end());
EXPECT_EQ(1, it1->second.num_registrations);
EXPECT_EQ(0, it1->second.num_inflight_requests);
EXPECT_EQ(0, it1->second.peak_inflight_requests);
EXPECT_NE(it2, map.end());
EXPECT_EQ(2, it2->second.num_registrations);
EXPECT_EQ(0, it2->second.num_inflight_requests);
EXPECT_EQ(0, it2->second.peak_inflight_requests);
EXPECT_EQ(it3, map.end());
}
TEST(KeepaliveStatisticsRecorderTest, IssueOneRequest) {
KeepaliveStatisticsRecorder r;
constexpr int process = 4;
r.Register(process);
r.OnLoadStarted(process);
{
const auto& map = r.per_process_records();
EXPECT_EQ(1u, map.size());
auto it = map.find(process);
ASSERT_NE(it, map.end());
EXPECT_EQ(1, it->second.num_registrations);
EXPECT_EQ(1, it->second.num_inflight_requests);
EXPECT_EQ(1, it->second.peak_inflight_requests);
EXPECT_EQ(1, r.num_inflight_requests());
EXPECT_EQ(1, r.peak_inflight_requests());
}
r.OnLoadFinished(process);
{
const auto& map = r.per_process_records();
EXPECT_EQ(1u, map.size());
auto it = map.find(process);
ASSERT_NE(it, map.end());
EXPECT_EQ(1, it->second.num_registrations);
EXPECT_EQ(0, it->second.num_inflight_requests);
EXPECT_EQ(1, it->second.peak_inflight_requests);
EXPECT_EQ(0, r.num_inflight_requests());
EXPECT_EQ(1, r.peak_inflight_requests());
}
}
TEST(KeepaliveStatisticsRecorderTest, IssueRequests) {
KeepaliveStatisticsRecorder r;
constexpr int process1 = 2;
constexpr int process2 = 3;
constexpr int no_process = 0;
r.Register(process1);
r.Register(process1);
r.Register(process1);
r.Register(process2);
r.Register(process2);
r.OnLoadStarted(process1);
r.OnLoadStarted(process1);
r.OnLoadStarted(process2);
r.OnLoadStarted(process2);
r.OnLoadStarted(process2);
r.OnLoadStarted(process2);
r.OnLoadStarted(no_process);
r.OnLoadFinished(process2);
r.OnLoadFinished(process2);
r.OnLoadFinished(process2);
r.OnLoadStarted(process2);
r.OnLoadStarted(no_process);
r.OnLoadStarted(no_process);
r.OnLoadStarted(no_process);
r.OnLoadStarted(no_process);
r.OnLoadStarted(no_process);
r.OnLoadFinished(no_process);
const auto& map = r.per_process_records();
EXPECT_EQ(2u, map.size());
auto it1 = map.find(process1);
auto it2 = map.find(process2);
ASSERT_NE(it1, map.end());
EXPECT_EQ(3, it1->second.num_registrations);
EXPECT_EQ(2, it1->second.num_inflight_requests);
EXPECT_EQ(2, it1->second.peak_inflight_requests);
ASSERT_NE(it2, map.end());
EXPECT_EQ(2, it2->second.num_registrations);
EXPECT_EQ(2, it2->second.num_inflight_requests);
EXPECT_EQ(4, it2->second.peak_inflight_requests);
EXPECT_EQ(9, r.num_inflight_requests());
EXPECT_EQ(10, r.peak_inflight_requests());
}
TEST(KeepaliveStatisticsRecorderTest, ProcessReuse) {
KeepaliveStatisticsRecorder r;
constexpr int process = 2;
r.Register(process);
r.OnLoadStarted(process);
r.OnLoadStarted(process);
r.OnLoadStarted(process);
r.OnLoadFinished(process);
r.OnLoadFinished(process);
r.OnLoadFinished(process);
r.Unregister(process);
r.Register(process);
const auto& map = r.per_process_records();
EXPECT_EQ(1u, map.size());
auto it = map.find(process);
ASSERT_NE(it, map.end());
EXPECT_EQ(1, it->second.num_registrations);
EXPECT_EQ(0, it->second.num_inflight_requests);
EXPECT_EQ(0, it->second.peak_inflight_requests);
}
} // namespace
} // namespace network