Index: google_apis/gcm/engine/mcs_client_unittest.cc |
diff --git a/google_apis/gcm/engine/mcs_client_unittest.cc b/google_apis/gcm/engine/mcs_client_unittest.cc |
index 7ba590487dc8cfc36fa04b66d8ee7802a528810f..9276e62945e85ae73c409f43e762fdba72bb4d84 100644 |
--- a/google_apis/gcm/engine/mcs_client_unittest.cc |
+++ b/google_apis/gcm/engine/mcs_client_unittest.cc |
@@ -43,7 +43,8 @@ MCSMessage BuildDataMessage(const std::string& from, |
const std::string& persistent_id, |
int ttl, |
uint64 sent, |
- int queued) { |
+ int queued, |
+ const std::string& token) { |
mcs_proto::DataMessageStanza data_message; |
data_message.set_id(message_id); |
data_message.set_from(from); |
@@ -54,6 +55,7 @@ MCSMessage BuildDataMessage(const std::string& from, |
data_message.set_ttl(ttl); |
data_message.set_sent(sent); |
data_message.set_queued(queued); |
+ data_message.set_token(token); |
return MCSMessage(kDataMessageStanzaTag, data_message); |
} |
@@ -286,7 +288,16 @@ TEST_F(MCSClientTest, SendMessageNoRMQ) { |
BuildMCSClient(); |
InitializeClient(); |
LoginClient(std::vector<std::string>()); |
- MCSMessage message(BuildDataMessage("from", "category", "X", 1, "", 0, 1, 0)); |
+ MCSMessage message( |
+ BuildDataMessage("from", |
+ "category", |
+ "X", |
+ 1, |
+ "", |
+ 0, |
+ 1, |
+ 0, |
+ "")); |
GetFakeHandler()->ExpectOutgoingMessage(message); |
mcs_client()->SendMessage(message); |
EXPECT_TRUE(GetFakeHandler()->AllOutgoingMessagesReceived()); |
@@ -299,7 +310,16 @@ TEST_F(MCSClientTest, SendMessageNoRMQWhileDisconnected) { |
InitializeClient(); |
EXPECT_TRUE(sent_message_id().empty()); |
- MCSMessage message(BuildDataMessage("from", "category", "X", 1, "", 0, 1, 0)); |
+ MCSMessage message( |
+ BuildDataMessage("from", |
+ "category", |
+ "X", |
+ 1, |
+ "", |
+ 0, |
+ 1, |
+ 0, |
+ "")); |
mcs_client()->SendMessage(message); |
// Message sent callback should be invoked, but no message should actually |
@@ -314,8 +334,15 @@ TEST_F(MCSClientTest, SendMessageRMQ) { |
BuildMCSClient(); |
InitializeClient(); |
LoginClient(std::vector<std::string>()); |
- MCSMessage message( |
- BuildDataMessage("from", "category", "X", 1, "1", kTTLValue, 1, 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ "X", |
+ 1, |
+ "1", |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
GetFakeHandler()->ExpectOutgoingMessage(message); |
mcs_client()->SendMessage(message); |
EXPECT_TRUE(GetFakeHandler()->AllOutgoingMessagesReceived()); |
@@ -328,8 +355,15 @@ TEST_F(MCSClientTest, SendMessageRMQWhileDisconnected) { |
InitializeClient(); |
LoginClient(std::vector<std::string>()); |
GetFakeHandler()->set_fail_send(true); |
- MCSMessage message( |
- BuildDataMessage("from", "category", "X", 1, "1", kTTLValue, 1, 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ "X", |
+ 1, |
+ "1", |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
// The initial (failed) send. |
GetFakeHandler()->ExpectOutgoingMessage(message); |
@@ -346,7 +380,8 @@ TEST_F(MCSClientTest, SendMessageRMQWhileDisconnected) { |
"1", |
kTTLValue, |
1, |
- kTTLValue - 1)); |
+ kTTLValue - 1, |
+ "")); |
GetFakeHandler()->ExpectOutgoingMessage(message2); |
mcs_client()->SendMessage(message); |
EXPECT_FALSE(GetFakeHandler()->AllOutgoingMessagesReceived()); |
@@ -365,8 +400,15 @@ TEST_F(MCSClientTest, SendMessageRMQOnRestart) { |
InitializeClient(); |
LoginClient(std::vector<std::string>()); |
GetFakeHandler()->set_fail_send(true); |
- MCSMessage message( |
- BuildDataMessage("from", "category", "X", 1, "1", kTTLValue, 1, 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ "X", |
+ 1, |
+ "1", |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
// The initial (failed) send. |
GetFakeHandler()->ExpectOutgoingMessage(message); |
@@ -387,7 +429,8 @@ TEST_F(MCSClientTest, SendMessageRMQOnRestart) { |
"1", |
kTTLValue, |
1, |
- kTTLValue - 1)); |
+ kTTLValue - 1, |
+ "")); |
LoginClient(std::vector<std::string>()); |
GetFakeHandler()->ExpectOutgoingMessage(message2); |
PumpLoop(); |
@@ -403,15 +446,15 @@ TEST_F(MCSClientTest, SendMessageRMQWithStreamAck) { |
// Send some messages. |
for (int i = 1; i <= kMessageBatchSize; ++i) { |
- MCSMessage message( |
- BuildDataMessage("from", |
- "category", |
- "X", |
- 1, |
- base::IntToString(i), |
- kTTLValue, |
- 1, |
- 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ "X", |
+ 1, |
+ base::IntToString(i), |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
GetFakeHandler()->ExpectOutgoingMessage(message); |
mcs_client()->SendMessage(message); |
} |
@@ -444,15 +487,15 @@ TEST_F(MCSClientTest, SendMessageRMQAckOnReconnect) { |
std::vector<std::string> id_list; |
for (int i = 1; i <= kMessageBatchSize; ++i) { |
id_list.push_back(base::IntToString(i)); |
- MCSMessage message( |
- BuildDataMessage("from", |
- "category", |
- id_list.back(), |
- 1, |
- id_list.back(), |
- kTTLValue, |
- 1, |
- 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ id_list.back(), |
+ 1, |
+ id_list.back(), |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
GetFakeHandler()->ExpectOutgoingMessage(message); |
mcs_client()->SendMessage(message); |
} |
@@ -483,15 +526,15 @@ TEST_F(MCSClientTest, SendMessageRMQPartialAckOnReconnect) { |
std::vector<std::string> id_list; |
for (int i = 1; i <= kMessageBatchSize; ++i) { |
id_list.push_back(base::IntToString(i)); |
- MCSMessage message( |
- BuildDataMessage("from", |
- "category", |
- id_list.back(), |
- 1, |
- id_list.back(), |
- kTTLValue, |
- 1, |
- 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ id_list.back(), |
+ 1, |
+ id_list.back(), |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
GetFakeHandler()->ExpectOutgoingMessage(message); |
mcs_client()->SendMessage(message); |
} |
@@ -519,7 +562,8 @@ TEST_F(MCSClientTest, SendMessageRMQPartialAckOnReconnect) { |
2, |
remaining_ids[i - 1], |
kTTLValue, |
- 1, 0)); |
+ 1, 0, |
+ "")); |
GetFakeHandler()->ExpectOutgoingMessage(message); |
} |
scoped_ptr<mcs_proto::IqStanza> ack(BuildSelectiveAck(acked_ids)); |
@@ -542,15 +586,15 @@ TEST_F(MCSClientTest, AckOnLogin) { |
std::vector<std::string> id_list; |
for (int i = 1; i <= kMessageBatchSize; ++i) { |
id_list.push_back(base::IntToString(i)); |
- MCSMessage message( |
- BuildDataMessage("from", |
- "category", |
- "X", |
- 1, |
- id_list.back(), |
- kTTLValue, |
- 1, |
- 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ "X", |
+ 1, |
+ id_list.back(), |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
GetFakeHandler()->ReceiveMessage(message); |
WaitForMCSEvent(); |
PumpLoop(); |
@@ -574,15 +618,15 @@ TEST_F(MCSClientTest, AckOnSend) { |
std::vector<std::string> id_list; |
for (int i = 1; i <= kMessageBatchSize; ++i) { |
id_list.push_back(base::IntToString(i)); |
- MCSMessage message( |
- BuildDataMessage("from", |
- "category", |
- id_list.back(), |
- 1, |
- id_list.back(), |
- kTTLValue, |
- 1, |
- 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ id_list.back(), |
+ 1, |
+ id_list.back(), |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
GetFakeHandler()->ReceiveMessage(message); |
PumpLoop(); |
} |
@@ -595,7 +639,8 @@ TEST_F(MCSClientTest, AckOnSend) { |
kMessageBatchSize + 1, |
"1", |
kTTLValue, |
- 1, 0)); |
+ 1, 0, |
+ "")); |
GetFakeHandler()->ExpectOutgoingMessage(message); |
mcs_client()->SendMessage(message); |
EXPECT_TRUE(GetFakeHandler()->AllOutgoingMessagesReceived()); |
@@ -619,15 +664,15 @@ TEST_F(MCSClientTest, AckWhenLimitReachedWithHeartbeat) { |
std::vector<std::string> id_list; |
for (int i = 1; i <= kAckLimitSize; ++i) { |
id_list.push_back(base::IntToString(i)); |
- MCSMessage message( |
- BuildDataMessage("from", |
- "category", |
- id_list.back(), |
- 1, |
- id_list.back(), |
- kTTLValue, |
- 1, |
- 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ id_list.back(), |
+ 1, |
+ id_list.back(), |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
GetFakeHandler()->ReceiveMessage(message); |
WaitForMCSEvent(); |
PumpLoop(); |
@@ -666,8 +711,15 @@ TEST_F(MCSClientTest, ExpiredTTLOnSend) { |
BuildMCSClient(); |
InitializeClient(); |
LoginClient(std::vector<std::string>()); |
- MCSMessage message( |
- BuildDataMessage("from", "category", "X", 1, "1", kTTLValue, 1, 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ "X", |
+ 1, |
+ "1", |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
// Advance time to after the TTL. |
clock()->Advance(base::TimeDelta::FromSeconds(kTTLValue + 2)); |
@@ -685,8 +737,15 @@ TEST_F(MCSClientTest, ExpiredTTLOnRestart) { |
InitializeClient(); |
LoginClient(std::vector<std::string>()); |
GetFakeHandler()->set_fail_send(true); |
- MCSMessage message( |
- BuildDataMessage("from", "category", "X", 1, "1", kTTLValue, 1, 0)); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ "X", |
+ 1, |
+ "1", |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "")); |
// The initial (failed) send. |
GetFakeHandler()->ExpectOutgoingMessage(message); |
@@ -707,6 +766,71 @@ TEST_F(MCSClientTest, ExpiredTTLOnRestart) { |
EXPECT_TRUE(GetFakeHandler()->AllOutgoingMessagesReceived()); |
} |
+// Sending two messages with the same collapse key and same app id while |
+// disconnected should only send the latter of the two on reconnection. |
+TEST_F(MCSClientTest, CollapseKeysSameApp) { |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ "message id 1", |
+ 1, |
+ "1", |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "token")); |
+ mcs_client()->SendMessage(message); |
fgorski
2014/01/28 18:10:27
Speaking to the earlier comment. If connection bre
Nicolas Zea
2014/01/31 11:58:43
Correct, they're treated as completely independent
|
+ |
+ MCSMessage message2(BuildDataMessage("from", |
+ "category", |
+ "message id 2", |
+ 1, |
+ "1", |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "token")); |
+ mcs_client()->SendMessage(message2); |
+ |
+ LoginClient(std::vector<std::string>()); |
+ GetFakeHandler()->ExpectOutgoingMessage(message2); |
+ PumpLoop(); |
+} |
+ |
+// Sending two messages with the same collapse key and different app id while |
+// disconnected should not perform any collapsing. |
+TEST_F(MCSClientTest, CollapseKeysDifferentApp) { |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ MCSMessage message(BuildDataMessage("from", |
+ "category", |
+ "message id 1", |
+ 1, |
+ "1", |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "token")); |
+ mcs_client()->SendMessage(message); |
+ |
+ MCSMessage message2(BuildDataMessage("from a differnt app", |
+ "category", |
+ "message id 2", |
+ 1, |
+ "2", |
+ kTTLValue, |
+ 1, |
+ 0, |
+ "token")); |
+ mcs_client()->SendMessage(message2); |
+ |
+ LoginClient(std::vector<std::string>()); |
+ GetFakeHandler()->ExpectOutgoingMessage(message); |
+ GetFakeHandler()->ExpectOutgoingMessage(message2); |
+ PumpLoop(); |
+} |
+ |
} // namespace |
} // namespace gcm |