Chromium Code Reviews| 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 |