Index: sync/notifier/gcm_network_channel_unittest.cc |
diff --git a/sync/notifier/gcm_network_channel_unittest.cc b/sync/notifier/gcm_network_channel_unittest.cc |
index e648c5838139c683dca00b068c70449645b40f68..ef5b6e9f579611c36acb436df28c6d374cb9bae8 100644 |
--- a/sync/notifier/gcm_network_channel_unittest.cc |
+++ b/sync/notifier/gcm_network_channel_unittest.cc |
@@ -118,8 +118,8 @@ class GCMNetworkChannelTest |
public: |
GCMNetworkChannelTest() |
: delegate_(NULL), |
- url_fetchers_created_count_(0) { |
- } |
+ url_fetchers_created_count_(0), |
+ last_invalidator_state_(TRANSIENT_INVALIDATION_ERROR) {} |
virtual ~GCMNetworkChannelTest() { |
} |
@@ -164,6 +164,7 @@ class GCMNetworkChannelTest |
virtual void OnNetworkChannelStateChanged( |
InvalidatorState invalidator_state) OVERRIDE { |
+ last_invalidator_state_ = invalidator_state; |
} |
void OnIncomingMessage(std::string incoming_message) { |
@@ -204,6 +205,10 @@ class GCMNetworkChannelTest |
return last_echo_token_; |
} |
+ InvalidatorState get_last_invalidator_state() { |
+ return last_invalidator_state_; |
+ } |
+ |
void RunLoopUntilIdle() { |
base::RunLoop run_loop; |
run_loop.RunUntilIdle(); |
@@ -217,6 +222,7 @@ class GCMNetworkChannelTest |
scoped_ptr<net::FakeURLFetcherFactory> url_fetcher_factory_; |
int url_fetchers_created_count_; |
std::string last_echo_token_; |
+ InvalidatorState last_invalidator_state_; |
}; |
void TestNetworkChannelURLFetcher::AddExtraRequestHeader( |
@@ -233,10 +239,11 @@ void TestNetworkChannelURLFetcher::AddExtraRequestHeader( |
} |
TEST_F(GCMNetworkChannelTest, HappyCase) { |
+ EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR, get_last_invalidator_state()); |
EXPECT_FALSE(delegate()->message_callback.is_null()); |
url_fetcher_factory()->SetFakeResponse(GURL("http://test.url.com"), |
std::string(), |
- net::HTTP_OK, |
+ net::HTTP_NO_CONTENT, |
net::URLRequestStatus::SUCCESS); |
// After construction GCMNetworkChannel should have called Register. |
@@ -261,6 +268,7 @@ TEST_F(GCMNetworkChannelTest, HappyCase) { |
GoogleServiceAuthError::AuthErrorNone(), "access.token2"); |
RunLoopUntilIdle(); |
EXPECT_EQ(url_fetchers_created_count(), 1); |
+ EXPECT_EQ(INVALIDATIONS_ENABLED, get_last_invalidator_state()); |
} |
TEST_F(GCMNetworkChannelTest, FailedRegister) { |
@@ -287,7 +295,7 @@ TEST_F(GCMNetworkChannelTest, FailedRegister) { |
TEST_F(GCMNetworkChannelTest, RegisterFinishesAfterSendMessage) { |
url_fetcher_factory()->SetFakeResponse(GURL("http://test.url.com"), |
"", |
- net::HTTP_OK, |
+ net::HTTP_NO_CONTENT, |
net::URLRequestStatus::SUCCESS); |
// After construction GCMNetworkChannel should have called Register. |
@@ -411,6 +419,37 @@ TEST_F(GCMNetworkChannelTest, Base64EncodeDecode) { |
EXPECT_EQ(input, plain); |
} |
+TEST_F(GCMNetworkChannelTest, TransientError) { |
+ EXPECT_FALSE(delegate()->message_callback.is_null()); |
+ // POST will fail. |
+ url_fetcher_factory()->SetFakeResponse(GURL("http://test.url.com"), |
+ std::string(), |
+ net::HTTP_SERVICE_UNAVAILABLE, |
+ net::URLRequestStatus::SUCCESS); |
+ |
+ delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS); |
+ |
+ network_channel()->SendMessage("abra.cadabra"); |
+ EXPECT_FALSE(delegate()->request_token_callback.is_null()); |
+ delegate()->request_token_callback.Run( |
+ GoogleServiceAuthError::AuthErrorNone(), "access.token"); |
+ RunLoopUntilIdle(); |
+ EXPECT_EQ(url_fetchers_created_count(), 1); |
+ // Failing HTTP POST should cause TRANSIENT_INVALIDATION_ERROR. |
+ EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR, get_last_invalidator_state()); |
+ // Network change to CONNECTION_NONE shouldn't affect invalidator state. |
+ network_channel()->OnNetworkChanged( |
+ net::NetworkChangeNotifier::CONNECTION_NONE); |
+ EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR, get_last_invalidator_state()); |
+ // Network change to something else should trigger retry. |
+ network_channel()->OnNetworkChanged( |
+ net::NetworkChangeNotifier::CONNECTION_WIFI); |
+ EXPECT_EQ(INVALIDATIONS_ENABLED, get_last_invalidator_state()); |
+ network_channel()->OnNetworkChanged( |
+ net::NetworkChangeNotifier::CONNECTION_NONE); |
+ EXPECT_EQ(INVALIDATIONS_ENABLED, get_last_invalidator_state()); |
+} |
+ |
#if !defined(ANDROID) |
TEST_F(GCMNetworkChannelTest, EchoToken) { |
url_fetcher_factory()->SetFakeResponse(GURL("http://test.url.com"), |