1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Copyright (C) 2016 Red Hat Inc.
14 #include "dmclock_client.h"
15 #include "dmclock_util.h"
16 #include "gtest/gtest.h"
19 namespace dmc = crimson::dmclock;
26 * Allows us to test the code provided with the mutex provided locked.
28 static void test_locked(std::mutex& mtx, std::function<void()> code) {
29 std::lock_guard<std::mutex> l(mtx);
34 TEST(dmclock_client, server_erase) {
36 // using ClientId = int;
38 ServerId server = 101;
39 // ClientId client = 3;
41 // dmc::PhaseType resp_params = dmc::PhaseType::reservation;
43 dmc::ServiceTracker<ServerId> st(std::chrono::seconds(2),
44 std::chrono::seconds(3));
46 auto lock_st = [&](std::function<void()> code) {
47 test_locked(st.data_mtx, code);
50 /* The timeline should be as follows:
52 * 0 seconds : request created
54 * 1 seconds : map is size 1
56 * 2 seconds : clean notes first mark; +2 is base for further calcs
58 * 4 seconds : clean does nothing except makes another mark
60 * 5 seconds : when we're secheduled to erase (+2 + 3)
62 * 5 seconds : since the clean job hasn't run yet, map still size 1
64 * 6 seconds : clean erases server
66 * 7 seconds : verified server is gone (map size 0)
70 EXPECT_EQ(0u, st.server_map.size()) <<
71 "server map initially has size 0";
74 std::this_thread::sleep_for(std::chrono::seconds(1));
76 // call for side effects
77 (void) st.get_req_params(server);
80 EXPECT_EQ(1u, st.server_map.size()) <<
81 "server map has size 1 after first request";
84 std::this_thread::sleep_for(std::chrono::seconds(4));
87 EXPECT_EQ(1u, st.server_map.size()) <<
88 "server map has size 1 just before erase";
91 std::this_thread::sleep_for(std::chrono::seconds(2));
94 EXPECT_EQ(0u, st.server_map.size()) <<
95 "server map has size 0 just after erase";
100 TEST(dmclock_client, delta_rho_values) {
101 using ServerId = int;
102 // using ClientId = int;
104 ServerId server1 = 101;
105 ServerId server2 = 7;
106 // ClientId client = 3;
108 // RespParams<ServerId> resp_params(server, dmc::PhaseType::reservation);
110 dmc::ServiceTracker<ServerId> st(std::chrono::seconds(2),
111 std::chrono::seconds(3));
113 auto rp1 = st.get_req_params(server1);
115 EXPECT_EQ(1u, rp1.delta) <<
116 "delta should be 1 with no intervening responses by" <<
118 EXPECT_EQ(1u, rp1.rho) <<
119 "rho should be 1 with no intervening reservation responses by" <<
122 auto rp2 = st.get_req_params(server1);
124 EXPECT_EQ(1u, rp2.delta) <<
125 "delta should be 1 with no intervening responses by" <<
127 EXPECT_EQ(1u, rp2.rho) <<
128 "rho should be 1 with no intervening reservation responses by" <<
131 st.track_resp(server1, dmc::PhaseType::priority);
133 auto rp3 = st.get_req_params(server1);
135 EXPECT_EQ(1u, rp3.delta) <<
136 "delta should be 1 with no intervening responses by" <<
138 EXPECT_EQ(1u, rp3.rho) <<
139 "rho should be 1 with no intervening reservation responses by" <<
142 st.track_resp(server2, dmc::PhaseType::priority);
144 auto rp4 = st.get_req_params(server1);
146 EXPECT_EQ(2u, rp4.delta) <<
147 "delta should be 2 with one intervening priority response by " <<
149 EXPECT_EQ(1u, rp4.rho) <<
150 "rho should be 1 with one intervening priority responses by " <<
153 auto rp5 = st.get_req_params(server1);
155 EXPECT_EQ(1u, rp5.delta) <<
156 "delta should be 1 with no intervening responses by" <<
158 EXPECT_EQ(1u, rp5.rho) <<
159 "rho should be 1 with no intervening reservation responses by" <<
162 st.track_resp(server2, dmc::PhaseType::reservation);
164 auto rp6 = st.get_req_params(server1);
166 EXPECT_EQ(2u, rp6.delta) <<
167 "delta should be 2 with one intervening reservation response by " <<
169 EXPECT_EQ(2u, rp6.rho) <<
170 "rho should be 2 with one intervening reservation responses by " <<
173 // auto rp6_b = st.get_req_params(server2);
175 st.track_resp(server2, dmc::PhaseType::reservation);
176 st.track_resp(server1, dmc::PhaseType::priority);
177 st.track_resp(server2, dmc::PhaseType::priority);
178 st.track_resp(server2, dmc::PhaseType::reservation);
179 st.track_resp(server1, dmc::PhaseType::reservation);
180 st.track_resp(server1, dmc::PhaseType::priority);
181 st.track_resp(server2, dmc::PhaseType::priority);
183 auto rp7 = st.get_req_params(server1);
185 EXPECT_EQ(5u, rp7.delta) <<
186 "delta should be 5 with fourintervening responses by " <<
188 EXPECT_EQ(3u, rp7.rho) <<
189 "rho should be 3 with two intervening reservation responses by " <<
192 auto rp7b = st.get_req_params(server2);
194 EXPECT_EQ(4u, rp7b.delta) <<
195 "delta should be 4 with three intervening responses by " <<
197 EXPECT_EQ(2u, rp7b.rho) <<
198 "rho should be 2 with one intervening reservation responses by " <<
201 auto rp8 = st.get_req_params(server1);
203 EXPECT_EQ(1u, rp8.delta) <<
204 "delta should be 1 with no intervening responses by " <<
206 EXPECT_EQ(1u, rp8.rho) <<
207 "rho should be 1 with no intervening reservation responses by " <<
210 auto rp8b = st.get_req_params(server2);
211 EXPECT_EQ(1u, rp8b.delta) <<
212 "delta should be 1 with no intervening responses by " <<
214 EXPECT_EQ(1u, rp8b.rho) <<
215 "rho should be 1 with no intervening reservation responses by " <<
218 } // namespace dmclock
219 } // namespace crimson