@@ -38,3 +38,115 @@ TEST(TimeSyncProtocolTest, Smoketest) {
38
38
39
39
server.Stop ();
40
40
}
41
+
42
+ TEST (TimeSyncClientTest, CalculateZero) {
43
+ using namespace wpi ::tsp;
44
+ using namespace std ::chrono_literals;
45
+
46
+ // GIVEN a fresh client
47
+ TimeSyncClient client{" 127.0.0.1" , 5812 , 100ms};
48
+
49
+ // AND a ping-pong sent with no delay
50
+ // client -> server -> client
51
+ uint64_t ping_client_time{100 };
52
+ uint64_t pong_server_time{100 };
53
+ uint64_t pong_client_time{100 };
54
+
55
+ // setup our ping/pong packets
56
+ TspPing ping{.version = 1 , .message_id = 1 , .client_time = ping_client_time};
57
+ TspPong pong{ping, pong_server_time};
58
+
59
+ // WHEN we update statistics
60
+ client.UpdateStatistics (pong_client_time, ping, pong);
61
+
62
+ // THEN the statistics will reflect no delay
63
+ EXPECT_EQ (0 , client.GetMetadata ().offset );
64
+ EXPECT_EQ (0 , client.GetMetadata ().rtt2 );
65
+ EXPECT_EQ (1u , client.GetMetadata ().pongsReceived );
66
+ EXPECT_EQ (pong_client_time, client.GetMetadata ().lastPongTime );
67
+ }
68
+
69
+ TEST (TimeSyncClientTest, CalculateZeroOffset) {
70
+ using namespace wpi ::tsp;
71
+ using namespace std ::chrono_literals;
72
+
73
+ // GIVEN a fresh client
74
+ TimeSyncClient client{" 127.0.0.1" , 5812 , 100ms};
75
+
76
+ // AND a ping-pong sent with 10ms delay each way
77
+ // client -> server -> client
78
+ uint64_t ping_client_time{100 };
79
+ uint64_t pong_server_time{110 };
80
+ uint64_t pong_client_time{120 };
81
+
82
+ // setup our ping/pong packets
83
+ TspPing ping{.version = 1 , .message_id = 1 , .client_time = ping_client_time};
84
+ TspPong pong{ping, pong_server_time};
85
+
86
+ // WHEN we update statistics
87
+ client.UpdateStatistics (pong_client_time, ping, pong);
88
+
89
+ // THEN the statistics will reflect no offset, and the expected rtt2
90
+ // (client-to-client) latency
91
+ EXPECT_EQ (0 , client.GetMetadata ().offset );
92
+ EXPECT_EQ (20 , client.GetMetadata ().rtt2 );
93
+ EXPECT_EQ (1u , client.GetMetadata ().pongsReceived );
94
+ EXPECT_EQ (pong_client_time, client.GetMetadata ().lastPongTime );
95
+ }
96
+
97
+ TEST (TimeSyncClientTest, CalculateZeroRtt) {
98
+ using namespace wpi ::tsp;
99
+ using namespace std ::chrono_literals;
100
+
101
+ // GIVEN a fresh client
102
+ TimeSyncClient client{" 127.0.0.1" , 5812 , 100ms};
103
+
104
+ // AND a ping-pong sent with no delay
105
+ // client -> server -> client
106
+ uint64_t ping_client_time{100 };
107
+ uint64_t pong_server_time{123 };
108
+ uint64_t pong_client_time{100 };
109
+
110
+ // setup our ping/pong packets
111
+ TspPing ping{.version = 1 , .message_id = 1 , .client_time = ping_client_time};
112
+ TspPong pong{ping, pong_server_time};
113
+
114
+ // WHEN we update statistics
115
+ client.UpdateStatistics (pong_client_time, ping, pong);
116
+
117
+ // THEN the statistics will reflect the expected 23ms offset
118
+ EXPECT_EQ (23 , client.GetMetadata ().offset );
119
+ EXPECT_EQ (0 , client.GetMetadata ().rtt2 );
120
+ EXPECT_EQ (1u , client.GetMetadata ().pongsReceived );
121
+ EXPECT_EQ (pong_client_time, client.GetMetadata ().lastPongTime );
122
+ }
123
+
124
+ TEST (TimeSyncClientTest, CalculateBoth) {
125
+ using namespace wpi ::tsp;
126
+ using namespace std ::chrono_literals;
127
+
128
+ // GIVEN a fresh client
129
+ TimeSyncClient client{" 127.0.0.1" , 5812 , 100ms};
130
+
131
+ // AND a ping-pong sent with no delay
132
+ // client -> server -> client
133
+ int64_t offset{-234 };
134
+ int64_t network_latency{23 };
135
+
136
+ uint64_t ping_client_time{100 };
137
+ uint64_t pong_server_time{ping_client_time + offset + network_latency};
138
+ uint64_t pong_client_time{ping_client_time + 2 * network_latency};
139
+
140
+ // setup our ping/pong packets
141
+ TspPing ping{.version = 1 , .message_id = 1 , .client_time = ping_client_time};
142
+ TspPong pong{ping, pong_server_time};
143
+
144
+ // WHEN we update statistics
145
+ client.UpdateStatistics (pong_client_time, ping, pong);
146
+
147
+ // THEN the statistics will reflect the expected latency and RTT
148
+ EXPECT_EQ (offset, client.GetMetadata ().offset );
149
+ EXPECT_EQ (network_latency * 2 , client.GetMetadata ().rtt2 );
150
+ EXPECT_EQ (1u , client.GetMetadata ().pongsReceived );
151
+ EXPECT_EQ (pong_client_time, client.GetMetadata ().lastPongTime );
152
+ }
0 commit comments