OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "google_apis/gcm/engine/mcs_client.h" | 5 #include "google_apis/gcm/engine/mcs_client.h" |
6 | 6 |
| 7 #include <stddef.h> |
| 8 #include <stdint.h> |
| 9 |
7 #include "base/bind.h" | 10 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
9 #include "base/command_line.h" | 12 #include "base/command_line.h" |
10 #include "base/files/scoped_temp_dir.h" | 13 #include "base/files/scoped_temp_dir.h" |
11 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
12 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
13 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
14 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
15 #include "base/test/simple_test_clock.h" | 18 #include "base/test/simple_test_clock.h" |
16 #include "base/timer/timer.h" | 19 #include "base/timer/timer.h" |
17 #include "google_apis/gcm/base/fake_encryptor.h" | 20 #include "google_apis/gcm/base/fake_encryptor.h" |
18 #include "google_apis/gcm/base/mcs_util.h" | 21 #include "google_apis/gcm/base/mcs_util.h" |
19 #include "google_apis/gcm/engine/fake_connection_factory.h" | 22 #include "google_apis/gcm/engine/fake_connection_factory.h" |
20 #include "google_apis/gcm/engine/fake_connection_handler.h" | 23 #include "google_apis/gcm/engine/fake_connection_handler.h" |
21 #include "google_apis/gcm/engine/gcm_store_impl.h" | 24 #include "google_apis/gcm/engine/gcm_store_impl.h" |
22 #include "google_apis/gcm/monitoring/fake_gcm_stats_recorder.h" | 25 #include "google_apis/gcm/monitoring/fake_gcm_stats_recorder.h" |
23 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
24 | 27 |
25 namespace gcm { | 28 namespace gcm { |
26 | 29 |
27 namespace { | 30 namespace { |
28 | 31 |
29 const uint64 kAndroidId = 54321; | 32 const uint64_t kAndroidId = 54321; |
30 const uint64 kSecurityToken = 12345; | 33 const uint64_t kSecurityToken = 12345; |
31 | 34 |
32 // Number of messages to send when testing batching. | 35 // Number of messages to send when testing batching. |
33 // Note: must be even for tests that split batches in half. | 36 // Note: must be even for tests that split batches in half. |
34 const int kMessageBatchSize = 6; | 37 const int kMessageBatchSize = 6; |
35 | 38 |
36 // The number of unacked messages the client will receive before sending a | 39 // The number of unacked messages the client will receive before sending a |
37 // stream ack. | 40 // stream ack. |
38 // TODO(zea): get this (and other constants) directly from the mcs client. | 41 // TODO(zea): get this (and other constants) directly from the mcs client. |
39 const int kAckLimitSize = 10; | 42 const int kAckLimitSize = 10; |
40 | 43 |
41 // TTL value for reliable messages. | 44 // TTL value for reliable messages. |
42 const int kTTLValue = 5 * 60; // 5 minutes. | 45 const int kTTLValue = 5 * 60; // 5 minutes. |
43 | 46 |
44 // Specifies whether immediate ACK should be requested. | 47 // Specifies whether immediate ACK should be requested. |
45 enum RequestImmediateAck { | 48 enum RequestImmediateAck { |
46 IMMEDIATE_ACK_IGNORE, // Ignores the field and does not set it. | 49 IMMEDIATE_ACK_IGNORE, // Ignores the field and does not set it. |
47 IMMEDIATE_ACK_NO, // Sets the field to false. | 50 IMMEDIATE_ACK_NO, // Sets the field to false. |
48 IMMEDIATE_ACK_YES // Sets the field to true. | 51 IMMEDIATE_ACK_YES // Sets the field to true. |
49 }; | 52 }; |
50 | 53 |
51 // Helper for building arbitrary data messages. | 54 // Helper for building arbitrary data messages. |
52 MCSMessage BuildDataMessage(const std::string& from, | 55 MCSMessage BuildDataMessage(const std::string& from, |
53 const std::string& category, | 56 const std::string& category, |
54 const std::string& message_id, | 57 const std::string& message_id, |
55 int last_stream_id_received, | 58 int last_stream_id_received, |
56 const std::string& persistent_id, | 59 const std::string& persistent_id, |
57 int ttl, | 60 int ttl, |
58 uint64 sent, | 61 uint64_t sent, |
59 int queued, | 62 int queued, |
60 const std::string& token, | 63 const std::string& token, |
61 const uint64& user_id, | 64 const uint64_t& user_id, |
62 RequestImmediateAck immediate_ack) { | 65 RequestImmediateAck immediate_ack) { |
63 mcs_proto::DataMessageStanza data_message; | 66 mcs_proto::DataMessageStanza data_message; |
64 data_message.set_id(message_id); | 67 data_message.set_id(message_id); |
65 data_message.set_from(from); | 68 data_message.set_from(from); |
66 data_message.set_category(category); | 69 data_message.set_category(category); |
67 data_message.set_last_stream_id_received(last_stream_id_received); | 70 data_message.set_last_stream_id_received(last_stream_id_received); |
68 if (!persistent_id.empty()) | 71 if (!persistent_id.empty()) |
69 data_message.set_persistent_id(persistent_id); | 72 data_message.set_persistent_id(persistent_id); |
70 data_message.set_ttl(ttl); | 73 data_message.set_ttl(ttl); |
71 data_message.set_sent(sent); | 74 data_message.set_sent(sent); |
(...skipping 15 matching lines...) Expand all Loading... |
87 gcm::GCMStatsRecorder* recorder) | 90 gcm::GCMStatsRecorder* recorder) |
88 : MCSClient("", clock, connection_factory, gcm_store, recorder), | 91 : MCSClient("", clock, connection_factory, gcm_store, recorder), |
89 next_id_(0) { | 92 next_id_(0) { |
90 } | 93 } |
91 | 94 |
92 std::string GetNextPersistentId() override { | 95 std::string GetNextPersistentId() override { |
93 return base::UintToString(++next_id_); | 96 return base::UintToString(++next_id_); |
94 } | 97 } |
95 | 98 |
96 private: | 99 private: |
97 uint32 next_id_; | 100 uint32_t next_id_; |
98 }; | 101 }; |
99 | 102 |
100 class TestConnectionListener : public ConnectionFactory::ConnectionListener { | 103 class TestConnectionListener : public ConnectionFactory::ConnectionListener { |
101 public: | 104 public: |
102 TestConnectionListener() : disconnect_counter_(0) { } | 105 TestConnectionListener() : disconnect_counter_(0) { } |
103 ~TestConnectionListener() override { } | 106 ~TestConnectionListener() override { } |
104 | 107 |
105 void OnConnected(const GURL& current_server, | 108 void OnConnected(const GURL& current_server, |
106 const net::IPEndPoint& ip_endpoint) override { } | 109 const net::IPEndPoint& ip_endpoint) override { } |
107 void OnDisconnected() override { | 110 void OnDisconnected() override { |
(...skipping 21 matching lines...) Expand all Loading... |
129 int heartbeat_interval_ms); | 132 int heartbeat_interval_ms); |
130 void AddExpectedLoginRequest(const std::vector<std::string>& acknowledged_ids, | 133 void AddExpectedLoginRequest(const std::vector<std::string>& acknowledged_ids, |
131 int heartbeat_interval_ms); | 134 int heartbeat_interval_ms); |
132 | 135 |
133 base::SimpleTestClock* clock() { return &clock_; } | 136 base::SimpleTestClock* clock() { return &clock_; } |
134 TestMCSClient* mcs_client() const { return mcs_client_.get(); } | 137 TestMCSClient* mcs_client() const { return mcs_client_.get(); } |
135 FakeConnectionFactory* connection_factory() { | 138 FakeConnectionFactory* connection_factory() { |
136 return &connection_factory_; | 139 return &connection_factory_; |
137 } | 140 } |
138 bool init_success() const { return init_success_; } | 141 bool init_success() const { return init_success_; } |
139 uint64 restored_android_id() const { return restored_android_id_; } | 142 uint64_t restored_android_id() const { return restored_android_id_; } |
140 uint64 restored_security_token() const { return restored_security_token_; } | 143 uint64_t restored_security_token() const { return restored_security_token_; } |
141 MCSMessage* received_message() const { return received_message_.get(); } | 144 MCSMessage* received_message() const { return received_message_.get(); } |
142 std::string sent_message_id() const { return sent_message_id_;} | 145 std::string sent_message_id() const { return sent_message_id_;} |
143 MCSClient::MessageSendStatus message_send_status() const { | 146 MCSClient::MessageSendStatus message_send_status() const { |
144 return message_send_status_; | 147 return message_send_status_; |
145 } | 148 } |
146 | 149 |
147 void SetDeviceCredentialsCallback(bool success); | 150 void SetDeviceCredentialsCallback(bool success); |
148 | 151 |
149 FakeConnectionHandler* GetFakeHandler() const; | 152 FakeConnectionHandler* GetFakeHandler() const; |
150 | 153 |
151 void WaitForMCSEvent(); | 154 void WaitForMCSEvent(); |
152 void PumpLoop(); | 155 void PumpLoop(); |
153 | 156 |
154 private: | 157 private: |
155 void ErrorCallback(); | 158 void ErrorCallback(); |
156 void MessageReceivedCallback(const MCSMessage& message); | 159 void MessageReceivedCallback(const MCSMessage& message); |
157 void MessageSentCallback(int64 user_serial_number, | 160 void MessageSentCallback(int64_t user_serial_number, |
158 const std::string& app_id, | 161 const std::string& app_id, |
159 const std::string& message_id, | 162 const std::string& message_id, |
160 MCSClient::MessageSendStatus status); | 163 MCSClient::MessageSendStatus status); |
161 | 164 |
162 base::SimpleTestClock clock_; | 165 base::SimpleTestClock clock_; |
163 | 166 |
164 base::ScopedTempDir temp_directory_; | 167 base::ScopedTempDir temp_directory_; |
165 base::MessageLoop message_loop_; | 168 base::MessageLoop message_loop_; |
166 scoped_ptr<base::RunLoop> run_loop_; | 169 scoped_ptr<base::RunLoop> run_loop_; |
167 scoped_ptr<GCMStore> gcm_store_; | 170 scoped_ptr<GCMStore> gcm_store_; |
168 | 171 |
169 FakeConnectionFactory connection_factory_; | 172 FakeConnectionFactory connection_factory_; |
170 scoped_ptr<TestMCSClient> mcs_client_; | 173 scoped_ptr<TestMCSClient> mcs_client_; |
171 bool init_success_; | 174 bool init_success_; |
172 uint64 restored_android_id_; | 175 uint64_t restored_android_id_; |
173 uint64 restored_security_token_; | 176 uint64_t restored_security_token_; |
174 scoped_ptr<MCSMessage> received_message_; | 177 scoped_ptr<MCSMessage> received_message_; |
175 std::string sent_message_id_; | 178 std::string sent_message_id_; |
176 MCSClient::MessageSendStatus message_send_status_; | 179 MCSClient::MessageSendStatus message_send_status_; |
177 | 180 |
178 gcm::FakeGCMStatsRecorder recorder_; | 181 gcm::FakeGCMStatsRecorder recorder_; |
179 }; | 182 }; |
180 | 183 |
181 MCSClientTest::MCSClientTest() | 184 MCSClientTest::MCSClientTest() |
182 : run_loop_(new base::RunLoop()), | 185 : run_loop_(new base::RunLoop()), |
183 init_success_(true), | 186 init_success_(true), |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 DVLOG(1) << "Error callback invoked, killing loop."; | 283 DVLOG(1) << "Error callback invoked, killing loop."; |
281 run_loop_->Quit(); | 284 run_loop_->Quit(); |
282 } | 285 } |
283 | 286 |
284 void MCSClientTest::MessageReceivedCallback(const MCSMessage& message) { | 287 void MCSClientTest::MessageReceivedCallback(const MCSMessage& message) { |
285 received_message_.reset(new MCSMessage(message)); | 288 received_message_.reset(new MCSMessage(message)); |
286 DVLOG(1) << "Message received callback invoked, killing loop."; | 289 DVLOG(1) << "Message received callback invoked, killing loop."; |
287 run_loop_->Quit(); | 290 run_loop_->Quit(); |
288 } | 291 } |
289 | 292 |
290 void MCSClientTest::MessageSentCallback(int64 user_serial_number, | 293 void MCSClientTest::MessageSentCallback(int64_t user_serial_number, |
291 const std::string& app_id, | 294 const std::string& app_id, |
292 const std::string& message_id, | 295 const std::string& message_id, |
293 MCSClient::MessageSendStatus status) { | 296 MCSClient::MessageSendStatus status) { |
294 DVLOG(1) << "Message sent callback invoked, killing loop."; | 297 DVLOG(1) << "Message sent callback invoked, killing loop."; |
295 sent_message_id_ = message_id; | 298 sent_message_id_ = message_id; |
296 message_send_status_ = status; | 299 message_send_status_ = status; |
297 run_loop_->Quit(); | 300 run_loop_->Quit(); |
298 } | 301 } |
299 | 302 |
300 void MCSClientTest::SetDeviceCredentialsCallback(bool success) { | 303 void MCSClientTest::SetDeviceCredentialsCallback(bool success) { |
(...skipping 872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1173 GetFakeHandler()->ReceiveMessage(message); | 1176 GetFakeHandler()->ReceiveMessage(message); |
1174 WaitForMCSEvent(); | 1177 WaitForMCSEvent(); |
1175 PumpLoop(); | 1178 PumpLoop(); |
1176 | 1179 |
1177 EXPECT_TRUE(GetFakeHandler()->AllOutgoingMessagesReceived()); | 1180 EXPECT_TRUE(GetFakeHandler()->AllOutgoingMessagesReceived()); |
1178 } | 1181 } |
1179 | 1182 |
1180 } // namespace | 1183 } // namespace |
1181 | 1184 |
1182 } // namespace gcm | 1185 } // namespace gcm |
OLD | NEW |