10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/gcm_driver/gcm_stats_recorder_impl.h"
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <deque>
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <string>
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <vector>
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "google_apis/gcm/engine/mcs_client.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace gcm {
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace {
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static uint64 kAndroidId = 4U;
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char kCheckinStatus[] = "URL_FETCHING_FAILED";
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kHost[] = "www.example.com";
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const char kAppId[] = "app id 1";
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kFrom[] = "from";
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kSenderIds[] = "s1,s2";
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const char kReceiverId[] = "receiver 1";
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const char kMessageId[] = "message id 1";
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const int kQueuedSec = 5;
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const gcm::MCSClient::MessageSendStatus kMessageSendStatus =
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    gcm::MCSClient::QUEUED;
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const int kByteSize = 99;
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const int kTTL = 7;
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const int kRetries = 3;
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const int64 kDelay = 15000;
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const ConnectionFactory::ConnectionResetReason kReason =
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ConnectionFactory::NETWORK_CHANGE;
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const int kNetworkError = 1;
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const RegistrationRequest::Status kRegistrationStatus =
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    RegistrationRequest::SUCCESS;
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const UnregistrationRequest::Status kUnregistrationStatus =
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    UnregistrationRequest::SUCCESS;
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char kCheckinInitiatedEvent[] = "Checkin initiated";
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char kCheckinInitiatedDetails[] = "Android Id: 4";
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char kCheckinDelayedDueToBackoffEvent[] = "Checkin backoff";
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char kCheckinDelayedDueToBackoffDetails[] =
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    "Delayed for 15000 msec";
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char kCheckinSuccessEvent[] = "Checkin succeeded";
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char kCheckinSuccessDetails[] = "";
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char kCheckinFailureEvent[] = "Checkin failed";
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static const char kCheckinFailureDetails[] = "URL_FETCHING_FAILED. Will retry.";
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kConnectionInitiatedEvent[] = "Connection initiated";
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kConnectionInitiatedDetails[] = "www.example.com";
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kConnectionDelayedDueToBackoffEvent[] = "Connection backoff";
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kConnectionDelayedDueToBackoffDetails[] =
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    "Delayed for 15000 msec";
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kConnectionSuccessEvent[] = "Connection succeeded";
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kConnectionSuccessDetails[] = "";
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kConnectionFailureEvent[] = "Connection failed";
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kConnectionFailureDetails[] = "With network error 1";
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kConnectionResetSignaledEvent[] = "Connection reset";
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kConnectionResetSignaledDetails[] = "NETWORK_CHANGE";
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kRegistrationSentEvent[] = "Registration request sent";
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kRegistrationSentDetails[] = "";
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kRegistrationResponseEvent[] =
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    "Registration response received";
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kRegistrationResponseDetails[] = "SUCCESS";
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kRegistrationRetryRequestedEvent[] =
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    "Registration retry requested";
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kRegistrationRetryRequestedDetails[] = "Retries left: 3";
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kUnregistrationSentEvent[] = "Unregistration request sent";
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kUnregistrationSentDetails[] = "";
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kUnregistrationResponseEvent[] =
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    "Unregistration response received";
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kUnregistrationResponseDetails[] = "SUCCESS";
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kUnregistrationRetryDelayedEvent[] =
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    "Unregistration retry delayed";
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kUnregistrationRetryDelayedDetails[] =
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    "Delayed for 15000 msec";
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kDataReceivedEvent[] = "Data msg received";
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kDataReceivedDetails[] = "";
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kDataReceivedNotRegisteredEvent[] = "Data msg received";
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kDataReceivedNotRegisteredDetails[] =
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    "No such registered app found";
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kDataDeletedMessageEvent[] = "Data msg received";
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustatic const char kDataDeletedMessageDetails[] =
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    "Message has been deleted on server";
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const char kDataSentToWireEvent[] = "Data msg sent to wire";
920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const char kSentToWireDetails[] = "Msg queued for 5 seconds";
930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const char kNotifySendStatusEvent[] = "SEND status: QUEUED";
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const char kNotifySendStatusDetails[] = "Msg size: 99 bytes, TTL: 7";
950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const char kIncomingSendErrorEvent[] = "Received 'send error' msg";
960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic const char kIncomingSendErrorDetails[] = "";
970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace
990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class GCMStatsRecorderImplTest : public testing::Test {
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GCMStatsRecorderImplTest();
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~GCMStatsRecorderImplTest();
1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void SetUp() OVERRIDE;
1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void VerifyRecordedCheckinCount(int expected_count) {
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(expected_count,
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              static_cast<int>(recorder_.checkin_activities().size()));
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyRecordedConnectionCount(int expected_count) {
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(expected_count,
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              static_cast<int>(recorder_.connection_activities().size()));
1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyRecordedRegistrationCount(int expected_count) {
1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(expected_count,
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              static_cast<int>(recorder_.registration_activities().size()));
1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyRecordedReceivingCount(int expected_count) {
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(expected_count,
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              static_cast<int>(recorder_.receiving_activities().size()));
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void VerifyRecordedSendingCount(int expected_count) {
1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(expected_count,
1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch              static_cast<int>(recorder_.sending_activities().size()));
1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void VerifyAllActivityQueueEmpty(const std::string& remark) {
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(recorder_.checkin_activities().empty()) << remark;
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(recorder_.connection_activities().empty()) << remark;
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(recorder_.registration_activities().empty()) << remark;
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(recorder_.receiving_activities().empty()) << remark;
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(recorder_.sending_activities().empty()) << remark;
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void VerifyCheckinInitiated(const std::string& remark) {
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    VerifyCheckin(recorder_.checkin_activities(),
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kCheckinInitiatedEvent,
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kCheckinInitiatedDetails,
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  remark);
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void VerifyCheckinDelayedDueToBackoff(const std::string& remark) {
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    VerifyCheckin(recorder_.checkin_activities(),
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kCheckinDelayedDueToBackoffEvent,
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kCheckinDelayedDueToBackoffDetails,
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  remark);
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void VerifyCheckinSuccess(const std::string& remark) {
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    VerifyCheckin(recorder_.checkin_activities(),
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kCheckinSuccessEvent,
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kCheckinSuccessDetails,
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  remark);
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void VerifyCheckinFailure(const std::string& remark) {
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    VerifyCheckin(recorder_.checkin_activities(),
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kCheckinFailureEvent,
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  kCheckinFailureDetails,
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  remark);
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyConnectionInitiated(const std::string& remark) {
1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyConnection(recorder_.connection_activities(),
1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     kConnectionInitiatedEvent,
1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     kConnectionInitiatedDetails,
1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     remark);
1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyConnectionDelayedDueToBackoff(const std::string& remark) {
1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyConnection(recorder_.connection_activities(),
1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     kConnectionDelayedDueToBackoffEvent,
1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     kConnectionDelayedDueToBackoffDetails,
1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     remark);
1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyConnectionSuccess(const std::string& remark) {
1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyConnection(recorder_.connection_activities(),
1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     kConnectionSuccessEvent,
1795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     kConnectionSuccessDetails,
1805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     remark);
1815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyConnectionFailure(const std::string& remark) {
1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyConnection(recorder_.connection_activities(),
1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     kConnectionFailureEvent,
1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     kConnectionFailureDetails,
1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     remark);
1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyConnectionResetSignaled(const std::string& remark) {
1915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyConnection(recorder_.connection_activities(),
1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     kConnectionResetSignaledEvent,
1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     kConnectionResetSignaledDetails,
1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     remark);
1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyRegistrationSent(const std::string& remark) {
1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyRegistration(recorder_.registration_activities(),
1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kSenderIds,
2005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kRegistrationSentEvent,
2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kRegistrationSentDetails,
2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       remark);
2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyRegistrationResponse(const std::string& remark) {
2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyRegistration(recorder_.registration_activities(),
2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kSenderIds,
2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kRegistrationResponseEvent,
2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kRegistrationResponseDetails,
2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       remark);
2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyRegistrationRetryRequested(const std::string& remark) {
2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyRegistration(recorder_.registration_activities(),
2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kSenderIds,
2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kRegistrationRetryRequestedEvent,
2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kRegistrationRetryRequestedDetails,
2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       remark);
2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyUnregistrationSent(const std::string& remark) {
2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyRegistration(recorder_.registration_activities(),
2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       std::string(),
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kUnregistrationSentEvent,
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kUnregistrationSentDetails,
2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       remark);
2275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyUnregistrationResponse(const std::string& remark) {
2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyRegistration(recorder_.registration_activities(),
2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       std::string(),
2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kUnregistrationResponseEvent,
2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kUnregistrationResponseDetails,
2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       remark);
2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyUnregistrationRetryDelayed(const std::string& remark) {
2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyRegistration(recorder_.registration_activities(),
2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       std::string(),
2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kUnregistrationRetryDelayedEvent,
2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       kUnregistrationRetryDelayedDetails,
2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       remark);
2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void VerifyDataMessageReceived(const std::string& remark) {
2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyReceivingData(recorder_.receiving_activities(),
2475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        kDataReceivedEvent,
2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        kDataReceivedDetails,
2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        remark);
2505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyDataDeletedMessage(const std::string& remark) {
2535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyReceivingData(recorder_.receiving_activities(),
2545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        kDataDeletedMessageEvent,
2555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        kDataDeletedMessageDetails,
2565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        remark);
2575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void VerifyDataMessageReceivedNotRegistered(const std::string& remark) {
2605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifyReceivingData(recorder_.receiving_activities(),
2615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        kDataReceivedNotRegisteredEvent,
2625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        kDataReceivedNotRegisteredDetails,
2635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                        remark);
2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyDataSentToWire(const std::string& remark) {
2675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifySendingData(recorder_.sending_activities(),
2685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      kDataSentToWireEvent,
2695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      kSentToWireDetails,
2705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      remark);
2715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyNotifySendStatus(const std::string& remark) {
2745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifySendingData(recorder_.sending_activities(),
2755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      kNotifySendStatusEvent,
2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      kNotifySendStatusDetails,
2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      remark);
2785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyIncomingSendError(const std::string& remark) {
2815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    VerifySendingData(recorder_.sending_activities(),
2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      kIncomingSendErrorEvent,
2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      kIncomingSendErrorDetails,
2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                      remark);
2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected:
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void VerifyCheckin(
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const std::deque<CheckinActivity>& queue,
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string& event,
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string& details,
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string& remark) {
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(event, queue.front().event) << remark;
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_EQ(details, queue.front().details) << remark;
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyConnection(
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const std::deque<ConnectionActivity>& queue,
2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& event,
3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& details,
3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& remark) {
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(event, queue.front().event) << remark;
3035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(details, queue.front().details) << remark;
3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
3055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyRegistration(
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const std::deque<RegistrationActivity>& queue,
3085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& sender_ids,
3095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& event,
3105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& details,
3115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& remark) {
3125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(kAppId, queue.front().app_id) << remark;
3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(sender_ids, queue.front().sender_ids) << remark;
3145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(event, queue.front().event) << remark;
3155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(details, queue.front().details) << remark;
3165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
3175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifyReceivingData(
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const std::deque<ReceivingActivity>& queue,
3205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& event,
3215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& details,
3225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& remark) {
3235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(kAppId, queue.front().app_id) << remark;
3245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(kFrom, queue.front().from) << remark;
3255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(kByteSize, queue.front().message_byte_size) << remark;
3265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(event, queue.front().event) << remark;
3275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(details, queue.front().details) << remark;
3285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void VerifySendingData(
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const std::deque<SendingActivity>& queue,
3325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& event, const std::string& details,
3335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      const std::string& remark) {
3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(kAppId, queue.front().app_id) << remark;
3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(kReceiverId, queue.front().receiver_id) << remark;
3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(kMessageId, queue.front().message_id) << remark;
3370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(event, queue.front().event) << remark;
3380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(details, queue.front().details) << remark;
3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::vector<std::string> sender_ids_;
34246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GCMStatsRecorderImpl recorder_;
3430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
3440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GCMStatsRecorderImplTest::GCMStatsRecorderImplTest(){
3460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
34846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GCMStatsRecorderImplTest::~GCMStatsRecorderImplTest() {}
3490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
35046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void GCMStatsRecorderImplTest::SetUp(){
3515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  sender_ids_.push_back("s1");
3525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  sender_ids_.push_back("s2");
3530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.SetRecording(true);
3540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(GCMStatsRecorderImplTest, StartStopRecordingTest) {
3570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(recorder_.is_recording());
3580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.RecordDataSentToWire(kAppId, kReceiverId, kMessageId, kQueuedSec);
3590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyRecordedSendingCount(1);
3600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyDataSentToWire("1st call");
3610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.SetRecording(false);
3630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(recorder_.is_recording());
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.Clear();
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyAllActivityQueueEmpty("all cleared");
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Exercise every recording method below and verify that nothing is recorded.
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordCheckinInitiated(kAndroidId);
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordCheckinDelayedDueToBackoff(kDelay);
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordCheckinSuccess();
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordCheckinFailure(kCheckinStatus, true);
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyAllActivityQueueEmpty("no checkin");
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordConnectionInitiated(kHost);
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordConnectionDelayedDueToBackoff(kDelay);
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordConnectionSuccess();
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordConnectionFailure(kNetworkError);
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordConnectionResetSignaled(kReason);
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyAllActivityQueueEmpty("no registration");
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordRegistrationSent(kAppId, kSenderIds);
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordRegistrationResponse(kAppId, sender_ids_,
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       kRegistrationStatus);
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordRegistrationRetryRequested(kAppId, sender_ids_, kRetries);
385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordUnregistrationSent(kAppId);
386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordUnregistrationResponse(kAppId, kUnregistrationStatus);
387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordUnregistrationRetryDelayed(kAppId, kDelay);
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyAllActivityQueueEmpty("no unregistration");
389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true,
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      GCMStatsRecorder::DATA_MESSAGE);
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true,
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      GCMStatsRecorder::DELETED_MESSAGES);
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, false,
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      GCMStatsRecorder::DATA_MESSAGE);
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyAllActivityQueueEmpty("no receiving");
397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.RecordDataSentToWire(kAppId, kReceiverId, kMessageId, kQueuedSec);
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordNotifySendStatus(kAppId, kReceiverId, kMessageId,
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                   kMessageSendStatus, kByteSize, kTTL);
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordIncomingSendError(kAppId, kReceiverId, kMessageId);
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  recorder_.RecordDataSentToWire(kAppId, kReceiverId, kMessageId, kQueuedSec);
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  VerifyAllActivityQueueEmpty("no sending");
4040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
40646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(GCMStatsRecorderImplTest, ClearLogTest) {
4070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.RecordDataSentToWire(kAppId, kReceiverId, kMessageId, kQueuedSec);
4080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyRecordedSendingCount(1);
4090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyDataSentToWire("1st call");
4100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.RecordNotifySendStatus(kAppId, kReceiverId, kMessageId,
4120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                   kMessageSendStatus, kByteSize, kTTL);
4130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyRecordedSendingCount(2);
4140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyNotifySendStatus("2nd call");
4150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.Clear();
4170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyRecordedSendingCount(0);
4180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
42046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(GCMStatsRecorderImplTest, CheckinTest) {
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  recorder_.RecordCheckinInitiated(kAndroidId);
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyRecordedCheckinCount(1);
423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyCheckinInitiated("1st call");
424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  recorder_.RecordCheckinDelayedDueToBackoff(kDelay);
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyRecordedCheckinCount(2);
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyCheckinDelayedDueToBackoff("2nd call");
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  recorder_.RecordCheckinSuccess();
430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyRecordedCheckinCount(3);
431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyCheckinSuccess("3rd call");
432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  recorder_.RecordCheckinFailure(kCheckinStatus, true);
434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyRecordedCheckinCount(4);
435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyCheckinFailure("4th call");
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(GCMStatsRecorderImplTest, ConnectionTest) {
4395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordConnectionInitiated(kHost);
4405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedConnectionCount(1);
4415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyConnectionInitiated("1st call");
4425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordConnectionDelayedDueToBackoff(kDelay);
4445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedConnectionCount(2);
4455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyConnectionDelayedDueToBackoff("2nd call");
4465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordConnectionSuccess();
4485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedConnectionCount(3);
4495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyConnectionSuccess("3rd call");
4505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordConnectionFailure(kNetworkError);
4525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedConnectionCount(4);
4535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyConnectionFailure("4th call");
4545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordConnectionResetSignaled(kReason);
4565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedConnectionCount(5);
4575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyConnectionResetSignaled("5th call");
4585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
46046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(GCMStatsRecorderImplTest, RegistrationTest) {
4615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordRegistrationSent(kAppId, kSenderIds);
4625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedRegistrationCount(1);
4635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRegistrationSent("1st call");
4645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordRegistrationResponse(kAppId, sender_ids_,
4665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       kRegistrationStatus);
4675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedRegistrationCount(2);
4685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRegistrationResponse("2nd call");
4695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordRegistrationRetryRequested(kAppId, sender_ids_, kRetries);
4715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedRegistrationCount(3);
4725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRegistrationRetryRequested("3rd call");
4735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordUnregistrationSent(kAppId);
4755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedRegistrationCount(4);
4765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyUnregistrationSent("4th call");
4775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordUnregistrationResponse(kAppId, kUnregistrationStatus);
4795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedRegistrationCount(5);
4805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyUnregistrationResponse("5th call");
4815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  recorder_.RecordUnregistrationRetryDelayed(kAppId, kDelay);
4835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedRegistrationCount(6);
4845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyUnregistrationRetryDelayed("6th call");
4855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(GCMStatsRecorderImplTest, RecordReceivingTest) {
488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true,
4895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      GCMStatsRecorder::DATA_MESSAGE);
4905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedReceivingCount(1);
491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyDataMessageReceived("1st call");
4925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, true,
4945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      GCMStatsRecorder::DELETED_MESSAGES);
4955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedReceivingCount(2);
4965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyDataDeletedMessage("2nd call");
4975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  recorder_.RecordDataMessageReceived(kAppId, kFrom, kByteSize, false,
4995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                      GCMStatsRecorder::DATA_MESSAGE);
5005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  VerifyRecordedReceivingCount(3);
501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VerifyDataMessageReceivedNotRegistered("3rd call");
5025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
5035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
50446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(GCMStatsRecorderImplTest, RecordSendingTest) {
5050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.RecordDataSentToWire(kAppId, kReceiverId, kMessageId, kQueuedSec);
5060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyRecordedSendingCount(1);
5070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyDataSentToWire("1st call");
5080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.RecordNotifySendStatus(kAppId, kReceiverId, kMessageId,
5100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                   kMessageSendStatus, kByteSize, kTTL);
5110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyRecordedSendingCount(2);
5120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyNotifySendStatus("2nd call");
5130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.RecordIncomingSendError(kAppId, kReceiverId, kMessageId);
5150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyRecordedSendingCount(3);
5160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyIncomingSendError("3rd call");
5170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  recorder_.RecordDataSentToWire(kAppId, kReceiverId, kMessageId, kQueuedSec);
5190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyRecordedSendingCount(4);
5200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  VerifyDataSentToWire("4th call");
5210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
5220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace gcm
524