1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/gcm_driver/gcm_stats_recorder_impl.h"
11 #include "google_apis/gcm/engine/mcs_client.h"
12 #include "testing/gtest/include/gtest/gtest.h"
18 static uint64 kAndroidId
= 4U;
19 static const char kCheckinStatus
[] = "URL_FETCHING_FAILED";
20 static const char kHost
[] = "www.example.com";
21 static const char kAppId
[] = "app id 1";
22 static const char kFrom
[] = "from";
23 static const char kSenderIds
[] = "s1,s2";
24 static const char kReceiverId
[] = "receiver 1";
25 static const char kMessageId
[] = "message id 1";
26 static const int kQueuedSec
= 5;
27 static const gcm::MCSClient::MessageSendStatus kMessageSendStatus
=
28 gcm::MCSClient::QUEUED
;
29 static const int kByteSize
= 99;
30 static const int kTTL
= 7;
31 static const int kRetries
= 3;
32 static const int64 kDelay
= 15000;
33 static const ConnectionFactory::ConnectionResetReason kReason
=
34 ConnectionFactory::NETWORK_CHANGE
;
35 static const int kNetworkError
= 1;
37 static const RegistrationRequest::Status kRegistrationStatus
=
38 RegistrationRequest::SUCCESS
;
39 static const UnregistrationRequest::Status kUnregistrationStatus
=
40 UnregistrationRequest::SUCCESS
;
42 static const char kCheckinInitiatedEvent
[] = "Checkin initiated";
43 static const char kCheckinInitiatedDetails
[] = "Android Id: 4";
44 static const char kCheckinDelayedDueToBackoffEvent
[] = "Checkin backoff";
45 static const char kCheckinDelayedDueToBackoffDetails
[] =
46 "Delayed for 15000 msec";
47 static const char kCheckinSuccessEvent
[] = "Checkin succeeded";
48 static const char kCheckinSuccessDetails
[] = "";
49 static const char kCheckinFailureEvent
[] = "Checkin failed";
50 static const char kCheckinFailureDetails
[] = "URL_FETCHING_FAILED. Will retry.";
52 static const char kConnectionInitiatedEvent
[] = "Connection initiated";
53 static const char kConnectionInitiatedDetails
[] = "www.example.com";
54 static const char kConnectionDelayedDueToBackoffEvent
[] = "Connection backoff";
55 static const char kConnectionDelayedDueToBackoffDetails
[] =
56 "Delayed for 15000 msec";
57 static const char kConnectionSuccessEvent
[] = "Connection succeeded";
58 static const char kConnectionSuccessDetails
[] = "";
59 static const char kConnectionFailureEvent
[] = "Connection failed";
60 static const char kConnectionFailureDetails
[] = "With network error 1";
61 static const char kConnectionResetSignaledEvent
[] = "Connection reset";
62 static const char kConnectionResetSignaledDetails
[] = "NETWORK_CHANGE";
64 static const char kRegistrationSentEvent
[] = "Registration request sent";
65 static const char kRegistrationSentDetails
[] = "";
66 static const char kRegistrationResponseEvent
[] =
67 "Registration response received";
68 static const char kRegistrationResponseDetails
[] = "SUCCESS";
69 static const char kRegistrationRetryDelayedEvent
[] =
70 "Registration retry delayed";
71 static const char kRegistrationRetryDelayedDetails
[] =
72 "Delayed for 15000 msec, retries left: 3";
73 static const char kUnregistrationSentEvent
[] = "Unregistration request sent";
74 static const char kUnregistrationSentDetails
[] = "";
75 static const char kUnregistrationResponseEvent
[] =
76 "Unregistration response received";
77 static const char kUnregistrationResponseDetails
[] = "SUCCESS";
78 static const char kUnregistrationRetryDelayedEvent
[] =
79 "Unregistration retry delayed";
80 static const char kUnregistrationRetryDelayedDetails
[] =
81 "Delayed for 15000 msec, retries left: 3";
83 static const char kDataReceivedEvent
[] = "Data msg received";
84 static const char kDataReceivedDetails
[] = "";
85 static const char kDataReceivedNotRegisteredEvent
[] = "Data msg received";
86 static const char kDataReceivedNotRegisteredDetails
[] =
87 "No such registered app found";
88 static const char kDataDeletedMessageEvent
[] = "Data msg received";
89 static const char kDataDeletedMessageDetails
[] =
90 "Message has been deleted on server";
92 static const char kDataSentToWireEvent
[] = "Data msg sent to wire";
93 static const char kSentToWireDetails
[] = "Msg queued for 5 seconds";
94 static const char kNotifySendStatusEvent
[] = "SEND status: QUEUED";
95 static const char kNotifySendStatusDetails
[] = "Msg size: 99 bytes, TTL: 7";
96 static const char kIncomingSendErrorEvent
[] = "Received 'send error' msg";
97 static const char kIncomingSendErrorDetails
[] = "";
101 class GCMStatsRecorderImplTest
: public testing::Test
{
103 GCMStatsRecorderImplTest();
104 ~GCMStatsRecorderImplTest() override
;
105 void SetUp() override
;
107 void VerifyRecordedCheckinCount(int expected_count
) {
108 EXPECT_EQ(expected_count
,
109 static_cast<int>(recorder_
.checkin_activities().size()));
111 void VerifyRecordedConnectionCount(int expected_count
) {
112 EXPECT_EQ(expected_count
,
113 static_cast<int>(recorder_
.connection_activities().size()));
115 void VerifyRecordedRegistrationCount(int expected_count
) {
116 EXPECT_EQ(expected_count
,
117 static_cast<int>(recorder_
.registration_activities().size()));
119 void VerifyRecordedReceivingCount(int expected_count
) {
120 EXPECT_EQ(expected_count
,
121 static_cast<int>(recorder_
.receiving_activities().size()));
123 void VerifyRecordedSendingCount(int expected_count
) {
124 EXPECT_EQ(expected_count
,
125 static_cast<int>(recorder_
.sending_activities().size()));
127 void VerifyAllActivityQueueEmpty(const std::string
& remark
) {
128 EXPECT_TRUE(recorder_
.checkin_activities().empty()) << remark
;
129 EXPECT_TRUE(recorder_
.connection_activities().empty()) << remark
;
130 EXPECT_TRUE(recorder_
.registration_activities().empty()) << remark
;
131 EXPECT_TRUE(recorder_
.receiving_activities().empty()) << remark
;
132 EXPECT_TRUE(recorder_
.sending_activities().empty()) << remark
;
135 void VerifyCheckinInitiated(const std::string
& remark
) {
136 VerifyCheckin(recorder_
.checkin_activities(),
137 kCheckinInitiatedEvent
,
138 kCheckinInitiatedDetails
,
142 void VerifyCheckinDelayedDueToBackoff(const std::string
& remark
) {
143 VerifyCheckin(recorder_
.checkin_activities(),
144 kCheckinDelayedDueToBackoffEvent
,
145 kCheckinDelayedDueToBackoffDetails
,
149 void VerifyCheckinSuccess(const std::string
& remark
) {
150 VerifyCheckin(recorder_
.checkin_activities(),
151 kCheckinSuccessEvent
,
152 kCheckinSuccessDetails
,
156 void VerifyCheckinFailure(const std::string
& remark
) {
157 VerifyCheckin(recorder_
.checkin_activities(),
158 kCheckinFailureEvent
,
159 kCheckinFailureDetails
,
163 void VerifyConnectionInitiated(const std::string
& remark
) {
164 VerifyConnection(recorder_
.connection_activities(),
165 kConnectionInitiatedEvent
,
166 kConnectionInitiatedDetails
,
170 void VerifyConnectionDelayedDueToBackoff(const std::string
& remark
) {
171 VerifyConnection(recorder_
.connection_activities(),
172 kConnectionDelayedDueToBackoffEvent
,
173 kConnectionDelayedDueToBackoffDetails
,
177 void VerifyConnectionSuccess(const std::string
& remark
) {
178 VerifyConnection(recorder_
.connection_activities(),
179 kConnectionSuccessEvent
,
180 kConnectionSuccessDetails
,
184 void VerifyConnectionFailure(const std::string
& remark
) {
185 VerifyConnection(recorder_
.connection_activities(),
186 kConnectionFailureEvent
,
187 kConnectionFailureDetails
,
191 void VerifyConnectionResetSignaled(const std::string
& remark
) {
192 VerifyConnection(recorder_
.connection_activities(),
193 kConnectionResetSignaledEvent
,
194 kConnectionResetSignaledDetails
,
198 void VerifyRegistrationSent(const std::string
& remark
) {
199 VerifyRegistration(recorder_
.registration_activities(),
201 kRegistrationSentEvent
,
202 kRegistrationSentDetails
,
206 void VerifyRegistrationResponse(const std::string
& remark
) {
207 VerifyRegistration(recorder_
.registration_activities(),
209 kRegistrationResponseEvent
,
210 kRegistrationResponseDetails
,
214 void VerifyRegistrationRetryRequested(const std::string
& remark
) {
215 VerifyRegistration(recorder_
.registration_activities(),
217 kRegistrationRetryDelayedEvent
,
218 kRegistrationRetryDelayedDetails
,
222 void VerifyUnregistrationSent(const std::string
& remark
) {
223 VerifyRegistration(recorder_
.registration_activities(),
225 kUnregistrationSentEvent
,
226 kUnregistrationSentDetails
,
230 void VerifyUnregistrationResponse(const std::string
& remark
) {
231 VerifyRegistration(recorder_
.registration_activities(),
233 kUnregistrationResponseEvent
,
234 kUnregistrationResponseDetails
,
238 void VerifyUnregistrationRetryDelayed(const std::string
& remark
) {
239 VerifyRegistration(recorder_
.registration_activities(),
241 kUnregistrationRetryDelayedEvent
,
242 kUnregistrationRetryDelayedDetails
,
246 void VerifyDataMessageReceived(const std::string
& remark
) {
247 VerifyReceivingData(recorder_
.receiving_activities(),
249 kDataReceivedDetails
,
253 void VerifyDataDeletedMessage(const std::string
& remark
) {
254 VerifyReceivingData(recorder_
.receiving_activities(),
255 kDataDeletedMessageEvent
,
256 kDataDeletedMessageDetails
,
260 void VerifyDataMessageReceivedNotRegistered(const std::string
& remark
) {
261 VerifyReceivingData(recorder_
.receiving_activities(),
262 kDataReceivedNotRegisteredEvent
,
263 kDataReceivedNotRegisteredDetails
,
267 void VerifyDataSentToWire(const std::string
& remark
) {
268 VerifySendingData(recorder_
.sending_activities(),
269 kDataSentToWireEvent
,
274 void VerifyNotifySendStatus(const std::string
& remark
) {
275 VerifySendingData(recorder_
.sending_activities(),
276 kNotifySendStatusEvent
,
277 kNotifySendStatusDetails
,
281 void VerifyIncomingSendError(const std::string
& remark
) {
282 VerifySendingData(recorder_
.sending_activities(),
283 kIncomingSendErrorEvent
,
284 kIncomingSendErrorDetails
,
290 const std::deque
<CheckinActivity
>& queue
,
291 const std::string
& event
,
292 const std::string
& details
,
293 const std::string
& remark
) {
294 EXPECT_EQ(event
, queue
.front().event
) << remark
;
295 EXPECT_EQ(details
, queue
.front().details
) << remark
;
298 void VerifyConnection(
299 const std::deque
<ConnectionActivity
>& queue
,
300 const std::string
& event
,
301 const std::string
& details
,
302 const std::string
& remark
) {
303 EXPECT_EQ(event
, queue
.front().event
) << remark
;
304 EXPECT_EQ(details
, queue
.front().details
) << remark
;
307 void VerifyRegistration(
308 const std::deque
<RegistrationActivity
>& queue
,
309 const std::string
& source
,
310 const std::string
& event
,
311 const std::string
& details
,
312 const std::string
& remark
) {
313 EXPECT_EQ(kAppId
, queue
.front().app_id
) << remark
;
314 EXPECT_EQ(source
, queue
.front().source
) << remark
;
315 EXPECT_EQ(event
, queue
.front().event
) << remark
;
316 EXPECT_EQ(details
, queue
.front().details
) << remark
;
319 void VerifyReceivingData(
320 const std::deque
<ReceivingActivity
>& queue
,
321 const std::string
& event
,
322 const std::string
& details
,
323 const std::string
& remark
) {
324 EXPECT_EQ(kAppId
, queue
.front().app_id
) << remark
;
325 EXPECT_EQ(kFrom
, queue
.front().from
) << remark
;
326 EXPECT_EQ(kByteSize
, queue
.front().message_byte_size
) << remark
;
327 EXPECT_EQ(event
, queue
.front().event
) << remark
;
328 EXPECT_EQ(details
, queue
.front().details
) << remark
;
331 void VerifySendingData(
332 const std::deque
<SendingActivity
>& queue
,
333 const std::string
& event
, const std::string
& details
,
334 const std::string
& remark
) {
335 EXPECT_EQ(kAppId
, queue
.front().app_id
) << remark
;
336 EXPECT_EQ(kReceiverId
, queue
.front().receiver_id
) << remark
;
337 EXPECT_EQ(kMessageId
, queue
.front().message_id
) << remark
;
338 EXPECT_EQ(event
, queue
.front().event
) << remark
;
339 EXPECT_EQ(details
, queue
.front().details
) << remark
;
343 GCMStatsRecorderImpl recorder_
;
346 GCMStatsRecorderImplTest::GCMStatsRecorderImplTest(){
349 GCMStatsRecorderImplTest::~GCMStatsRecorderImplTest() {}
351 void GCMStatsRecorderImplTest::SetUp(){
353 recorder_
.SetRecording(true);
356 TEST_F(GCMStatsRecorderImplTest
, StartStopRecordingTest
) {
357 EXPECT_TRUE(recorder_
.is_recording());
358 recorder_
.RecordDataSentToWire(kAppId
, kReceiverId
, kMessageId
, kQueuedSec
);
359 VerifyRecordedSendingCount(1);
360 VerifyDataSentToWire("1st call");
362 recorder_
.SetRecording(false);
363 EXPECT_FALSE(recorder_
.is_recording());
365 VerifyAllActivityQueueEmpty("all cleared");
367 // Exercise every recording method below and verify that nothing is recorded.
368 recorder_
.RecordCheckinInitiated(kAndroidId
);
369 recorder_
.RecordCheckinDelayedDueToBackoff(kDelay
);
370 recorder_
.RecordCheckinSuccess();
371 recorder_
.RecordCheckinFailure(kCheckinStatus
, true);
372 VerifyAllActivityQueueEmpty("no checkin");
374 recorder_
.RecordConnectionInitiated(kHost
);
375 recorder_
.RecordConnectionDelayedDueToBackoff(kDelay
);
376 recorder_
.RecordConnectionSuccess();
377 recorder_
.RecordConnectionFailure(kNetworkError
);
378 recorder_
.RecordConnectionResetSignaled(kReason
);
379 VerifyAllActivityQueueEmpty("no registration");
381 recorder_
.RecordRegistrationSent(kAppId
, kSenderIds
);
382 recorder_
.RecordRegistrationResponse(kAppId
, source_
,
383 kRegistrationStatus
);
384 recorder_
.RecordRegistrationRetryDelayed(kAppId
, source_
, kDelay
, kRetries
);
385 recorder_
.RecordUnregistrationSent(kAppId
, source_
);
386 recorder_
.RecordUnregistrationResponse(
387 kAppId
, source_
, kUnregistrationStatus
);
388 recorder_
.RecordUnregistrationRetryDelayed(kAppId
, source_
, kDelay
, kRetries
);
389 VerifyAllActivityQueueEmpty("no unregistration");
391 recorder_
.RecordDataMessageReceived(kAppId
, kFrom
, kByteSize
, true,
392 GCMStatsRecorder::DATA_MESSAGE
);
393 recorder_
.RecordDataMessageReceived(kAppId
, kFrom
, kByteSize
, true,
394 GCMStatsRecorder::DELETED_MESSAGES
);
395 recorder_
.RecordDataMessageReceived(kAppId
, kFrom
, kByteSize
, false,
396 GCMStatsRecorder::DATA_MESSAGE
);
397 VerifyAllActivityQueueEmpty("no receiving");
399 recorder_
.RecordDataSentToWire(kAppId
, kReceiverId
, kMessageId
, kQueuedSec
);
400 recorder_
.RecordNotifySendStatus(kAppId
, kReceiverId
, kMessageId
,
401 kMessageSendStatus
, kByteSize
, kTTL
);
402 recorder_
.RecordIncomingSendError(kAppId
, kReceiverId
, kMessageId
);
403 recorder_
.RecordDataSentToWire(kAppId
, kReceiverId
, kMessageId
, kQueuedSec
);
404 VerifyAllActivityQueueEmpty("no sending");
407 TEST_F(GCMStatsRecorderImplTest
, ClearLogTest
) {
408 recorder_
.RecordDataSentToWire(kAppId
, kReceiverId
, kMessageId
, kQueuedSec
);
409 VerifyRecordedSendingCount(1);
410 VerifyDataSentToWire("1st call");
412 recorder_
.RecordNotifySendStatus(kAppId
, kReceiverId
, kMessageId
,
413 kMessageSendStatus
, kByteSize
, kTTL
);
414 VerifyRecordedSendingCount(2);
415 VerifyNotifySendStatus("2nd call");
418 VerifyRecordedSendingCount(0);
421 TEST_F(GCMStatsRecorderImplTest
, CheckinTest
) {
422 recorder_
.RecordCheckinInitiated(kAndroidId
);
423 VerifyRecordedCheckinCount(1);
424 VerifyCheckinInitiated("1st call");
426 recorder_
.RecordCheckinDelayedDueToBackoff(kDelay
);
427 VerifyRecordedCheckinCount(2);
428 VerifyCheckinDelayedDueToBackoff("2nd call");
430 recorder_
.RecordCheckinSuccess();
431 VerifyRecordedCheckinCount(3);
432 VerifyCheckinSuccess("3rd call");
434 recorder_
.RecordCheckinFailure(kCheckinStatus
, true);
435 VerifyRecordedCheckinCount(4);
436 VerifyCheckinFailure("4th call");
439 TEST_F(GCMStatsRecorderImplTest
, ConnectionTest
) {
440 recorder_
.RecordConnectionInitiated(kHost
);
441 VerifyRecordedConnectionCount(1);
442 VerifyConnectionInitiated("1st call");
444 recorder_
.RecordConnectionDelayedDueToBackoff(kDelay
);
445 VerifyRecordedConnectionCount(2);
446 VerifyConnectionDelayedDueToBackoff("2nd call");
448 recorder_
.RecordConnectionSuccess();
449 VerifyRecordedConnectionCount(3);
450 VerifyConnectionSuccess("3rd call");
452 recorder_
.RecordConnectionFailure(kNetworkError
);
453 VerifyRecordedConnectionCount(4);
454 VerifyConnectionFailure("4th call");
456 recorder_
.RecordConnectionResetSignaled(kReason
);
457 VerifyRecordedConnectionCount(5);
458 VerifyConnectionResetSignaled("5th call");
461 TEST_F(GCMStatsRecorderImplTest
, RegistrationTest
) {
462 recorder_
.RecordRegistrationSent(kAppId
, kSenderIds
);
463 VerifyRecordedRegistrationCount(1);
464 VerifyRegistrationSent("1st call");
466 recorder_
.RecordRegistrationResponse(kAppId
, source_
,
467 kRegistrationStatus
);
468 VerifyRecordedRegistrationCount(2);
469 VerifyRegistrationResponse("2nd call");
471 recorder_
.RecordRegistrationRetryDelayed(kAppId
, source_
, kDelay
, kRetries
);
472 VerifyRecordedRegistrationCount(3);
473 VerifyRegistrationRetryRequested("3rd call");
475 recorder_
.RecordUnregistrationSent(kAppId
, source_
);
476 VerifyRecordedRegistrationCount(4);
477 VerifyUnregistrationSent("4th call");
479 recorder_
.RecordUnregistrationResponse(
480 kAppId
, source_
, kUnregistrationStatus
);
481 VerifyRecordedRegistrationCount(5);
482 VerifyUnregistrationResponse("5th call");
484 recorder_
.RecordUnregistrationRetryDelayed(kAppId
, source_
, kDelay
, kRetries
);
485 VerifyRecordedRegistrationCount(6);
486 VerifyUnregistrationRetryDelayed("6th call");
489 TEST_F(GCMStatsRecorderImplTest
, RecordReceivingTest
) {
490 recorder_
.RecordConnectionInitiated(std::string());
491 recorder_
.RecordConnectionSuccess();
492 recorder_
.RecordDataMessageReceived(kAppId
, kFrom
, kByteSize
, true,
493 GCMStatsRecorder::DATA_MESSAGE
);
494 VerifyRecordedReceivingCount(1);
495 VerifyDataMessageReceived("1st call");
497 recorder_
.RecordDataMessageReceived(kAppId
, kFrom
, kByteSize
, true,
498 GCMStatsRecorder::DELETED_MESSAGES
);
499 VerifyRecordedReceivingCount(2);
500 VerifyDataDeletedMessage("2nd call");
502 recorder_
.RecordDataMessageReceived(kAppId
, kFrom
, kByteSize
, false,
503 GCMStatsRecorder::DATA_MESSAGE
);
504 VerifyRecordedReceivingCount(3);
505 VerifyDataMessageReceivedNotRegistered("3rd call");
508 TEST_F(GCMStatsRecorderImplTest
, RecordSendingTest
) {
509 recorder_
.RecordDataSentToWire(kAppId
, kReceiverId
, kMessageId
, kQueuedSec
);
510 VerifyRecordedSendingCount(1);
511 VerifyDataSentToWire("1st call");
513 recorder_
.RecordNotifySendStatus(kAppId
, kReceiverId
, kMessageId
,
514 kMessageSendStatus
, kByteSize
, kTTL
);
515 VerifyRecordedSendingCount(2);
516 VerifyNotifySendStatus("2nd call");
518 recorder_
.RecordIncomingSendError(kAppId
, kReceiverId
, kMessageId
);
519 VerifyRecordedSendingCount(3);
520 VerifyIncomingSendError("3rd call");
522 recorder_
.RecordDataSentToWire(kAppId
, kReceiverId
, kMessageId
, kQueuedSec
);
523 VerifyRecordedSendingCount(4);
524 VerifyDataSentToWire("4th call");