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 1b6d2ef61fa9e787a1a78ee91a880bfda745b34d..644c702ab76f7b50503163e4c93b6052c5fa11e8 100644 |
--- a/google_apis/gcm/engine/mcs_client_unittest.cc |
+++ b/google_apis/gcm/engine/mcs_client_unittest.cc |
@@ -113,8 +113,11 @@ class MCSClientTest : public testing::Test { |
void InitializeClient(); |
void StoreCredentials(); |
void LoginClient(const std::vector<std::string>& acknowledged_ids); |
+ void LoginClientWithHeartbeat( |
+ const std::vector<std::string>& acknowledged_ids, |
+ int heartbeat_interval_ms); |
void AddExpectedLoginRequest(const std::vector<std::string>& acknowledged_ids, |
- int custom_heartbeat_interval); |
+ int heartbeat_interval_ms); |
base::SimpleTestClock* clock() { return &clock_; } |
TestMCSClient* mcs_client() const { return mcs_client_.get(); } |
@@ -209,7 +212,13 @@ void MCSClientTest::InitializeClient() { |
void MCSClientTest::LoginClient( |
const std::vector<std::string>& acknowledged_ids) { |
- AddExpectedLoginRequest(acknowledged_ids, 0); |
+ LoginClientWithHeartbeat(acknowledged_ids, 0); |
+} |
+ |
+void MCSClientTest::LoginClientWithHeartbeat( |
+ const std::vector<std::string>& acknowledged_ids, |
+ int heartbeat_interval_ms) { |
+ AddExpectedLoginRequest(acknowledged_ids, heartbeat_interval_ms); |
mcs_client_->Login(kAndroidId, kSecurityToken); |
run_loop_->Run(); |
run_loop_.reset(new base::RunLoop()); |
@@ -217,15 +226,15 @@ void MCSClientTest::LoginClient( |
void MCSClientTest::AddExpectedLoginRequest( |
const std::vector<std::string>& acknowledged_ids, |
- int custom_heartbeat_interval) { |
+ int heartbeat_interval_ms) { |
scoped_ptr<mcs_proto::LoginRequest> login_request = |
BuildLoginRequest(kAndroidId, kSecurityToken, ""); |
for (size_t i = 0; i < acknowledged_ids.size(); ++i) |
login_request->add_received_persistent_id(acknowledged_ids[i]); |
- if (custom_heartbeat_interval) { |
+ if (heartbeat_interval_ms) { |
mcs_proto::Setting* setting = login_request->add_setting(); |
setting->set_name("hbping"); |
- setting->set_value(base::IntToString(custom_heartbeat_interval)); |
+ setting->set_value(base::IntToString(heartbeat_interval_ms)); |
} |
GetFakeHandler()->ExpectOutgoingMessage( |
MCSMessage(kLoginRequestTag, login_request.Pass())); |
@@ -898,97 +907,272 @@ TEST_F(MCSClientTest, CollapseKeysDifferentUser) { |
PumpLoop(); |
} |
-// Tests adding and removing custom heartbeat interval. |
-TEST_F(MCSClientTest, CustomHeartbeatInterval) { |
+// Test case for setting a custom heartbeat interval, when it is too short. |
+// Covers both connection restart and storing of custom intervals. |
+TEST_F(MCSClientTest, CustomHeartbeatIntervalTooShort) { |
BuildMCSClient(); |
InitializeClient(); |
LoginClient(std::vector<std::string>()); |
+ PumpLoop(); |
+ StoreCredentials(); |
- TestConnectionListener test_connection_listener; |
- connection_factory()->SetConnectionListener(&test_connection_listener); |
- |
- HeartbeatManager& hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ HeartbeatManager* hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
// By default custom client interval is not set. |
- EXPECT_FALSE(hb_manager.HasClientHeartbeatInterval()); |
+ EXPECT_FALSE(hb_manager->HasClientHeartbeatInterval()); |
const std::string component_1 = "component1"; |
int interval_ms = 30 * 1000; // 30 seconds, too low. |
mcs_client()->AddHeartbeatInterval(component_1, interval_ms); |
// Setting was too low so it was ignored. |
- EXPECT_FALSE(hb_manager.HasClientHeartbeatInterval()); |
+ EXPECT_FALSE(hb_manager->HasClientHeartbeatInterval()); |
+ |
+ // Restore and check again to make sure that nothing was set in store. |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClientWithHeartbeat(std::vector<std::string>(), 0); |
+ PumpLoop(); |
+ |
+ hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ EXPECT_FALSE(hb_manager->HasClientHeartbeatInterval()); |
+} |
- interval_ms = 60 * 60 * 1000; // 1 hour, too high. |
+// Test case for setting a custom heartbeat interval, when it is too long. |
+// Covers both connection restart and storing of custom intervals. |
+TEST_F(MCSClientTest, CustomHeartbeatIntervalTooLong) { |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClient(std::vector<std::string>()); |
+ PumpLoop(); |
+ StoreCredentials(); |
+ |
+ HeartbeatManager* hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ |
+ const std::string component_1 = "component1"; |
+ int interval_ms = 60 * 60 * 1000; // 1 hour, too high. |
mcs_client()->AddHeartbeatInterval(component_1, interval_ms); |
// Setting was too high, again it was ignored. |
- EXPECT_FALSE(hb_manager.HasClientHeartbeatInterval()); |
+ EXPECT_FALSE(hb_manager->HasClientHeartbeatInterval()); |
+ |
+ // Restore and check again to make sure that nothing was set in store. |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClientWithHeartbeat(std::vector<std::string>(), 0); |
+ PumpLoop(); |
+ |
+ // Setting was too high, again it was ignored. |
+ hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ EXPECT_FALSE(hb_manager->HasClientHeartbeatInterval()); |
+} |
- int expected_disconnect_counter = 0; |
- EXPECT_EQ(expected_disconnect_counter, |
- test_connection_listener.get_disconnect_counter()); |
+// Tests adding and removing custom heartbeat interval. |
+// Covers both connection restart and storing of custom intervals. |
+TEST_F(MCSClientTest, CustomHeartbeatIntervalSingleInterval) { |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClient(std::vector<std::string>()); |
+ PumpLoop(); |
+ StoreCredentials(); |
+ |
+ TestConnectionListener test_connection_listener; |
+ connection_factory()->SetConnectionListener(&test_connection_listener); |
+ |
+ HeartbeatManager* hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ |
+ const std::string component_1 = "component1"; |
+ int interval_ms = 5 * 60 * 1000; // 5 minutes. A valid setting. |
- interval_ms = 5 * 60 * 1000; // 5 minutes. A valid setting. |
AddExpectedLoginRequest(std::vector<std::string>(), interval_ms); |
mcs_client()->AddHeartbeatInterval(component_1, interval_ms); |
- // Setting was OK. HearbeatManager should get that setting now. |
- EXPECT_TRUE(hb_manager.HasClientHeartbeatInterval()); |
- EXPECT_EQ(interval_ms, hb_manager.GetClientHeartbeatIntervalMs()); |
+ PumpLoop(); |
+ |
+ // Interval was OK. HearbeatManager should get that setting now. |
+ EXPECT_TRUE(hb_manager->HasClientHeartbeatInterval()); |
+ EXPECT_EQ(interval_ms, hb_manager->GetClientHeartbeatIntervalMs()); |
+ EXPECT_EQ(1, test_connection_listener.get_disconnect_counter()); |
+ |
+ // Check that setting was persisted and will take effect upon restart. |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClientWithHeartbeat(std::vector<std::string>(), interval_ms); |
+ PumpLoop(); |
+ |
+ // HB manger uses the shortest persisted interval after restart. |
+ hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ EXPECT_TRUE(hb_manager->HasClientHeartbeatInterval()); |
+ EXPECT_EQ(interval_ms, hb_manager->GetClientHeartbeatIntervalMs()); |
+ |
+ mcs_client()->RemoveHeartbeatInterval(component_1); |
+ PumpLoop(); |
+ |
+ // Check that setting was persisted and will take effect upon restart. |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClientWithHeartbeat(std::vector<std::string>(), 0); |
+ PumpLoop(); |
+ |
+ hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ EXPECT_FALSE(hb_manager->HasClientHeartbeatInterval()); |
+} |
+ |
+// Tests adding custom heartbeat interval before connection is initialized. |
+TEST_F(MCSClientTest, CustomHeartbeatIntervalSetBeforeInitialize) { |
+ BuildMCSClient(); |
+ |
+ const std::string component_1 = "component1"; |
+ int interval_ms = 5 * 60 * 1000; // 5 minutes. A valid setting. |
+ mcs_client()->AddHeartbeatInterval(component_1, interval_ms); |
+ InitializeClient(); |
+ LoginClientWithHeartbeat(std::vector<std::string>(), interval_ms); |
+ HeartbeatManager* hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ EXPECT_TRUE(hb_manager->HasClientHeartbeatInterval()); |
+} |
+ |
+// Tests adding custom heartbeat interval after connection is initialized, but |
+// but before login is sent. |
+TEST_F(MCSClientTest, CustomHeartbeatIntervalSetBeforeLogin) { |
+ BuildMCSClient(); |
+ |
+ const std::string component_1 = "component1"; |
+ int interval_ms = 5 * 60 * 1000; // 5 minutes. A valid setting. |
+ InitializeClient(); |
+ mcs_client()->AddHeartbeatInterval(component_1, interval_ms); |
+ LoginClientWithHeartbeat(std::vector<std::string>(), interval_ms); |
+ HeartbeatManager* hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ EXPECT_TRUE(hb_manager->HasClientHeartbeatInterval()); |
+} |
+ |
+// Tests situation when two heartbeat intervals are set and second is longer. |
+// Covers both connection restart and storing of custom intervals. |
+TEST_F(MCSClientTest, CustomHeartbeatIntervalSecondIntervalLonger) { |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClient(std::vector<std::string>()); |
+ PumpLoop(); |
+ StoreCredentials(); |
+ |
+ TestConnectionListener test_connection_listener; |
+ connection_factory()->SetConnectionListener(&test_connection_listener); |
+ |
+ HeartbeatManager* hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
- ++expected_disconnect_counter; |
- EXPECT_EQ(expected_disconnect_counter, |
- test_connection_listener.get_disconnect_counter()); |
+ const std::string component_1 = "component1"; |
+ int interval_ms = 5 * 60 * 1000; // 5 minutes. A valid setting. |
+ |
+ AddExpectedLoginRequest(std::vector<std::string>(), interval_ms); |
+ mcs_client()->AddHeartbeatInterval(component_1, interval_ms); |
+ PumpLoop(); |
const std::string component_2 = "component2"; |
int other_interval_ms = 10 * 60 * 1000; // 10 minutes. A valid setting. |
mcs_client()->AddHeartbeatInterval(component_2, other_interval_ms); |
- // Setting was OK, but higher than the previous setting and HearbeatManager |
- // will not be updated. |
- EXPECT_TRUE(hb_manager.HasClientHeartbeatInterval()); |
- EXPECT_EQ(interval_ms, hb_manager.GetClientHeartbeatIntervalMs()); |
- // No connection reset expected. |
- EXPECT_EQ(expected_disconnect_counter, |
- test_connection_listener.get_disconnect_counter()); |
+ PumpLoop(); |
+ |
+ // Interval was OK, but longer. HearbeatManager will use the first one. |
+ EXPECT_TRUE(hb_manager->HasClientHeartbeatInterval()); |
+ EXPECT_EQ(interval_ms, hb_manager->GetClientHeartbeatIntervalMs()); |
+ EXPECT_EQ(1, test_connection_listener.get_disconnect_counter()); |
+ |
+ // Check that setting was persisted and will take effect upon restart. |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClientWithHeartbeat(std::vector<std::string>(), interval_ms); |
+ PumpLoop(); |
- other_interval_ms = 3 * 60 * 1000; // 3 minutes. A valid setting. |
+ // HB manger uses the shortest persisted interval after restart. |
+ hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ EXPECT_TRUE(hb_manager->HasClientHeartbeatInterval()); |
+ EXPECT_EQ(interval_ms, hb_manager->GetClientHeartbeatIntervalMs()); |
+} |
+ |
+// Tests situation when two heartbeat intervals are set and second is shorter. |
+// Covers both connection restart and storing of custom intervals. |
+TEST_F(MCSClientTest, CustomHeartbeatIntervalSecondIntervalShorter) { |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClient(std::vector<std::string>()); |
+ PumpLoop(); |
+ StoreCredentials(); |
+ |
+ TestConnectionListener test_connection_listener; |
+ connection_factory()->SetConnectionListener(&test_connection_listener); |
+ |
+ HeartbeatManager* hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ |
+ const std::string component_1 = "component1"; |
+ int interval_ms = 5 * 60 * 1000; // 5 minutes. A valid setting. |
+ |
+ AddExpectedLoginRequest(std::vector<std::string>(), interval_ms); |
+ mcs_client()->AddHeartbeatInterval(component_1, interval_ms); |
+ PumpLoop(); |
+ |
+ const std::string component_2 = "component2"; |
+ int other_interval_ms = 3 * 60 * 1000; // 3 minutes. A valid setting. |
AddExpectedLoginRequest(std::vector<std::string>(), other_interval_ms); |
mcs_client()->AddHeartbeatInterval(component_2, other_interval_ms); |
- // Setting was OK and lower then present setting. HearbeatManager should get |
- // that setting now. |
- EXPECT_TRUE(hb_manager.HasClientHeartbeatInterval()); |
- EXPECT_EQ(other_interval_ms, hb_manager.GetClientHeartbeatIntervalMs()); |
- ++expected_disconnect_counter; |
- EXPECT_EQ(expected_disconnect_counter, |
- test_connection_listener.get_disconnect_counter()); |
+ PumpLoop(); |
+ // Interval was OK. HearbeatManager should get that setting now. |
+ EXPECT_TRUE(hb_manager->HasClientHeartbeatInterval()); |
+ EXPECT_EQ(other_interval_ms, hb_manager->GetClientHeartbeatIntervalMs()); |
+ EXPECT_EQ(2, test_connection_listener.get_disconnect_counter()); |
- mcs_client()->RemoveHeartbeatInterval(component_2); |
- // Removing the lowest setting reverts to second lowest. |
- EXPECT_TRUE(hb_manager.HasClientHeartbeatInterval()); |
- EXPECT_EQ(interval_ms, hb_manager.GetClientHeartbeatIntervalMs()); |
- // No connection reset expected. |
- EXPECT_EQ(expected_disconnect_counter, |
- test_connection_listener.get_disconnect_counter()); |
+ // Check that setting was persisted and will take effect upon restart. |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClientWithHeartbeat(std::vector<std::string>(), other_interval_ms); |
+ PumpLoop(); |
- mcs_client()->RemoveHeartbeatInterval(component_1); |
- // Removing all of the intervals, removes it from the HeartbeatManager. |
- EXPECT_FALSE(hb_manager.HasClientHeartbeatInterval()); |
- // No connection reset expected. |
- EXPECT_EQ(expected_disconnect_counter, |
- test_connection_listener.get_disconnect_counter()); |
+ // HB manger uses the shortest persisted interval after restart. |
+ hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ EXPECT_TRUE(hb_manager->HasClientHeartbeatInterval()); |
+ EXPECT_EQ(other_interval_ms, hb_manager->GetClientHeartbeatIntervalMs()); |
+} |
- mcs_client()->AddHeartbeatInterval(component_2, other_interval_ms); |
+// Tests situation shorter of two intervals is removed. |
+// Covers both connection restart and storing of custom intervals. |
+TEST_F(MCSClientTest, CustomHeartbeatIntervalRemoveShorterInterval) { |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClient(std::vector<std::string>()); |
+ PumpLoop(); |
+ StoreCredentials(); |
+ |
+ TestConnectionListener test_connection_listener; |
+ connection_factory()->SetConnectionListener(&test_connection_listener); |
+ |
+ HeartbeatManager* hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ |
+ const std::string component_1 = "component1"; |
+ int interval_ms = 5 * 60 * 1000; // 5 minutes. A valid setting. |
+ |
+ AddExpectedLoginRequest(std::vector<std::string>(), interval_ms); |
mcs_client()->AddHeartbeatInterval(component_1, interval_ms); |
- EXPECT_TRUE(hb_manager.HasClientHeartbeatInterval()); |
- EXPECT_EQ(other_interval_ms, hb_manager.GetClientHeartbeatIntervalMs()); |
- // No connection reset expected. |
- EXPECT_EQ(expected_disconnect_counter, |
- test_connection_listener.get_disconnect_counter()); |
+ PumpLoop(); |
- // Removing interval other than lowest does not change anything. |
- mcs_client()->RemoveHeartbeatInterval(component_1); |
- EXPECT_TRUE(hb_manager.HasClientHeartbeatInterval()); |
- EXPECT_EQ(other_interval_ms, hb_manager.GetClientHeartbeatIntervalMs()); |
+ const std::string component_2 = "component2"; |
+ int other_interval_ms = 3 * 60 * 1000; // 3 minutes. A valid setting. |
+ AddExpectedLoginRequest(std::vector<std::string>(), other_interval_ms); |
+ mcs_client()->AddHeartbeatInterval(component_2, other_interval_ms); |
+ PumpLoop(); |
+ |
+ mcs_client()->RemoveHeartbeatInterval(component_2); |
+ PumpLoop(); |
+ |
+ // Removing the lowest setting reverts to second lowest. |
+ EXPECT_TRUE(hb_manager->HasClientHeartbeatInterval()); |
+ EXPECT_EQ(interval_ms, hb_manager->GetClientHeartbeatIntervalMs()); |
// No connection reset expected. |
- EXPECT_EQ(expected_disconnect_counter, |
- test_connection_listener.get_disconnect_counter()); |
+ EXPECT_EQ(2, test_connection_listener.get_disconnect_counter()); |
+ |
+ // Check that setting was persisted and will take effect upon restart. |
+ BuildMCSClient(); |
+ InitializeClient(); |
+ LoginClientWithHeartbeat(std::vector<std::string>(), interval_ms); |
+ PumpLoop(); |
+ |
+ // HB manger uses the shortest persisted interval after restart. |
+ hb_manager = mcs_client()->GetHeartbeatManagerForTesting(); |
+ EXPECT_TRUE(hb_manager->HasClientHeartbeatInterval()); |
+ EXPECT_EQ(interval_ms, hb_manager->GetClientHeartbeatIntervalMs()); |
} |
} // namespace |