| 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 cc2e0f96f934c0ffabbb63d97d48b9ebdcf70e30..085f13673a5012251d11bfe503c26dca6f44c66c 100644
|
| --- a/google_apis/gcm/engine/mcs_client_unittest.cc
|
| +++ b/google_apis/gcm/engine/mcs_client_unittest.cc
|
| @@ -43,7 +43,9 @@ MCSMessage BuildDataMessage(const std::string& from,
|
| const std::string& persistent_id,
|
| int ttl,
|
| uint64 sent,
|
| - int queued) {
|
| + int queued,
|
| + const std::string& token,
|
| + const uint64& user_id) {
|
| mcs_proto::DataMessageStanza data_message;
|
| data_message.set_id(message_id);
|
| data_message.set_from(from);
|
| @@ -54,6 +56,8 @@ 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);
|
| + data_message.set_device_user_id(user_id);
|
| return MCSMessage(kDataMessageStanzaTag, data_message);
|
| }
|
|
|
| @@ -286,7 +290,8 @@ 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, "", 0));
|
| GetFakeHandler()->ExpectOutgoingMessage(message);
|
| mcs_client()->SendMessage(message);
|
| EXPECT_TRUE(GetFakeHandler()->AllOutgoingMessagesReceived());
|
| @@ -299,7 +304,8 @@ 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, "", 0));
|
| mcs_client()->SendMessage(message);
|
|
|
| // Message sent callback should be invoked, but no message should actually
|
| @@ -314,8 +320,8 @@ 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, "", 0));
|
| GetFakeHandler()->ExpectOutgoingMessage(message);
|
| mcs_client()->SendMessage(message);
|
| EXPECT_TRUE(GetFakeHandler()->AllOutgoingMessagesReceived());
|
| @@ -328,8 +334,8 @@ 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, "", 0));
|
|
|
| // The initial (failed) send.
|
| GetFakeHandler()->ExpectOutgoingMessage(message);
|
| @@ -340,14 +346,8 @@ TEST_F(MCSClientTest, SendMessageRMQWhileDisconnected) {
|
| BuildLoginRequest(kAndroidId, kSecurityToken).
|
| PassAs<const google::protobuf::MessageLite>()));
|
| // The second (re)send.
|
| - MCSMessage message2(BuildDataMessage("from",
|
| - "category",
|
| - "X",
|
| - 1,
|
| - "1",
|
| - kTTLValue,
|
| - 1,
|
| - kTTLValue - 1));
|
| + MCSMessage message2(BuildDataMessage(
|
| + "from", "category", "X", 1, "1", kTTLValue, 1, kTTLValue - 1, "", 0));
|
| GetFakeHandler()->ExpectOutgoingMessage(message2);
|
| mcs_client()->SendMessage(message);
|
| PumpLoop(); // Wait for the queuing to happen.
|
| @@ -368,8 +368,8 @@ 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, "", 0));
|
|
|
| // The initial (failed) send.
|
| GetFakeHandler()->ExpectOutgoingMessage(message);
|
| @@ -384,14 +384,8 @@ TEST_F(MCSClientTest, SendMessageRMQOnRestart) {
|
| InitializeClient();
|
|
|
| clock()->Advance(base::TimeDelta::FromSeconds(kTTLValue - 1));
|
| - MCSMessage message2(BuildDataMessage("from",
|
| - "category",
|
| - "X",
|
| - 1,
|
| - "1",
|
| - kTTLValue,
|
| - 1,
|
| - kTTLValue - 1));
|
| + MCSMessage message2(BuildDataMessage(
|
| + "from", "category", "X", 1, "1", kTTLValue, 1, kTTLValue - 1, "", 0));
|
| LoginClient(std::vector<std::string>());
|
| GetFakeHandler()->ExpectOutgoingMessage(message2);
|
| PumpLoop();
|
| @@ -407,15 +401,16 @@ 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,
|
| + "",
|
| + 0));
|
| GetFakeHandler()->ExpectOutgoingMessage(message);
|
| mcs_client()->SendMessage(message);
|
| PumpLoop();
|
| @@ -449,15 +444,16 @@ 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,
|
| + "",
|
| + 0));
|
| GetFakeHandler()->ExpectOutgoingMessage(message);
|
| mcs_client()->SendMessage(message);
|
| PumpLoop();
|
| @@ -489,15 +485,16 @@ 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,
|
| + "",
|
| + 0));
|
| GetFakeHandler()->ExpectOutgoingMessage(message);
|
| mcs_client()->SendMessage(message);
|
| PumpLoop();
|
| @@ -519,14 +516,16 @@ TEST_F(MCSClientTest, SendMessageRMQPartialAckOnReconnect) {
|
| id_list.begin() + kMessageBatchSize / 2,
|
| id_list.end());
|
| for (int i = 1; i <= kMessageBatchSize / 2; ++i) {
|
| - MCSMessage message(
|
| - BuildDataMessage("from",
|
| - "category",
|
| - remaining_ids[i - 1],
|
| - 2,
|
| - remaining_ids[i - 1],
|
| - kTTLValue,
|
| - 1, 0));
|
| + MCSMessage message(BuildDataMessage("from",
|
| + "category",
|
| + remaining_ids[i - 1],
|
| + 2,
|
| + remaining_ids[i - 1],
|
| + kTTLValue,
|
| + 1,
|
| + 0,
|
| + "",
|
| + 0));
|
| GetFakeHandler()->ExpectOutgoingMessage(message);
|
| }
|
| scoped_ptr<mcs_proto::IqStanza> ack(BuildSelectiveAck(acked_ids));
|
| @@ -549,15 +548,8 @@ 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, "", 0));
|
| GetFakeHandler()->ReceiveMessage(message);
|
| WaitForMCSEvent();
|
| PumpLoop();
|
| @@ -581,28 +573,31 @@ 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,
|
| + "",
|
| + 0));
|
| GetFakeHandler()->ReceiveMessage(message);
|
| PumpLoop();
|
| }
|
|
|
| // Trigger a message send, which should acknowledge via stream ack.
|
| - MCSMessage message(
|
| - BuildDataMessage("from",
|
| - "category",
|
| - "X",
|
| - kMessageBatchSize + 1,
|
| - "1",
|
| - kTTLValue,
|
| - 1, 0));
|
| + MCSMessage message(BuildDataMessage("from",
|
| + "category",
|
| + "X",
|
| + kMessageBatchSize + 1,
|
| + "1",
|
| + kTTLValue,
|
| + 1,
|
| + 0,
|
| + "",
|
| + 0));
|
| GetFakeHandler()->ExpectOutgoingMessage(message);
|
| mcs_client()->SendMessage(message);
|
| EXPECT_TRUE(GetFakeHandler()->AllOutgoingMessagesReceived());
|
| @@ -626,15 +621,16 @@ 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,
|
| + "",
|
| + 0));
|
| GetFakeHandler()->ReceiveMessage(message);
|
| WaitForMCSEvent();
|
| PumpLoop();
|
| @@ -673,8 +669,8 @@ 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, "", 0));
|
|
|
| // Advance time to after the TTL.
|
| clock()->Advance(base::TimeDelta::FromSeconds(kTTLValue + 2));
|
| @@ -692,8 +688,8 @@ 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, "", 0));
|
|
|
| // The initial (failed) send.
|
| GetFakeHandler()->ExpectOutgoingMessage(message);
|
| @@ -715,6 +711,78 @@ 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", "app", "message id 1", 1, "1", kTTLValue, 1, 0, "token", 0));
|
| + mcs_client()->SendMessage(message);
|
| +
|
| + MCSMessage message2(BuildDataMessage(
|
| + "from", "app", "message id 2", 1, "1", kTTLValue, 1, 0, "token", 0));
|
| + 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", "app", "message id 1", 1, "1", kTTLValue, 1, 0, "token", 0));
|
| + mcs_client()->SendMessage(message);
|
| +
|
| + MCSMessage message2(BuildDataMessage("from",
|
| + "app 2",
|
| + "message id 2",
|
| + 1,
|
| + "2",
|
| + kTTLValue,
|
| + 1,
|
| + 0,
|
| + "token",
|
| + 0));
|
| + mcs_client()->SendMessage(message2);
|
| +
|
| + LoginClient(std::vector<std::string>());
|
| + GetFakeHandler()->ExpectOutgoingMessage(message);
|
| + GetFakeHandler()->ExpectOutgoingMessage(message2);
|
| + PumpLoop();
|
| +}
|
| +
|
| +// Sending two messages with the same collapse key and app id, but different
|
| +// user, while disconnected, should not perform any collapsing.
|
| +TEST_F(MCSClientTest, CollapseKeysDifferentUser) {
|
| + BuildMCSClient();
|
| + InitializeClient();
|
| + MCSMessage message(BuildDataMessage(
|
| + "from", "app", "message id 1", 1, "1", kTTLValue, 1, 0, "token", 0));
|
| + mcs_client()->SendMessage(message);
|
| +
|
| + MCSMessage message2(BuildDataMessage("from",
|
| + "app",
|
| + "message id 2",
|
| + 1,
|
| + "2",
|
| + kTTLValue,
|
| + 1,
|
| + 0,
|
| + "token",
|
| + 1));
|
| + mcs_client()->SendMessage(message2);
|
| +
|
| + LoginClient(std::vector<std::string>());
|
| + GetFakeHandler()->ExpectOutgoingMessage(message);
|
| + GetFakeHandler()->ExpectOutgoingMessage(message2);
|
| + PumpLoop();
|
| +}
|
| +
|
| } // namespace
|
|
|
| } // namespace gcm
|
|
|