diff options
author | rlarocque@chromium.org <rlarocque@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-02 23:16:34 +0000 |
---|---|---|
committer | rlarocque@chromium.org <rlarocque@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-02 23:16:34 +0000 |
commit | d1929aaf01ac9c3166d31b3eeaaf2676629cebcb (patch) | |
tree | 4218d03dcb01b02a41a2eef448e5009202035855 /components/invalidation/gcm_network_channel_unittest.cc | |
parent | 713eac6708cdadc256d996e6695a4ee9d09212d8 (diff) | |
download | chromium_src-d1929aaf01ac9c3166d31b3eeaaf2676629cebcb.zip chromium_src-d1929aaf01ac9c3166d31b3eeaaf2676629cebcb.tar.gz chromium_src-d1929aaf01ac9c3166d31b3eeaaf2676629cebcb.tar.bz2 |
Revert of Move some sync/notifier to components/invalidation (https://codereview.chromium.org/294123004/)
Reason for revert:
Passed the CQ but broke the buildbot.
Original issue's description:
> Move some sync/notifier to components/invalidation
>
> Moves many of the files in sync/notifier to components/invalidation.
>
> This change does not introduce any new dependencies. The relevant
> dependency rules both before and after this change should be:
> - chrome/browser/invalidation and chrome in general depend on
> components/invalidation.
> - components/invalidation depends on sync/notifier and sync in
> general.
> - sync/notifier, components/invalidation, and various parts of
> chrome all depend on sync/internal_api/public.
>
> The eventual goal is to move all of sync/notifier into
> components/invalidation. The invalidation-related parts of
> sync/internal_api/public should be moved to components/invalidation,
> too. This will allow us to remove the deopendencies from
> components/invalidation to sync, and remove sync's dependencies on
> cacheinvalidation and libjingle.
>
> This change is a regression in terms of shared library componentization.
> the files in the sync/notifier folder could be built as a shared
> library. The files in compononents/invalidation do not support this
> yet. The SYNC_EXPORT declarations in the moved files have been changed
> to INVALIDATION_EXPORT so as to not lose this information, but the
> macros are currently #defined to no-ops.
>
> This change does not attempt to rename any classes or namespaces.
> Many of the files ported from sync/notifier still use the syncer
> namespace. Some, like SyncSystemResources, still have names tied
> to their sync heritage. This will be addressed in future CLs.
>
> Some non-trivial or non-obvious changes include:
> - invalidator_state.h was moved to sync/internal_api/public/base so it
> could be shared by both sync/ and components/invalidation. This should
> be fixed in a future CL.
> - FromNotifierReason was split out of invalidator_state.h and moved to
> the newly-created components/invalidator_reason_util.h
>
> TBR=zea,rtenneti,mallinath,dcheng
> BUG=259559
>
> Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=274350
TBR=pavely@chromium.org,dcheng@chromium.org,zea@chromium.org,rtenneti@chromium.org,mallinath@chromium.org,maniscalco@chromium.org
NOTREECHECKS=true
NOTRY=true
BUG=259559
Review URL: https://codereview.chromium.org/308413002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@274364 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components/invalidation/gcm_network_channel_unittest.cc')
-rw-r--r-- | components/invalidation/gcm_network_channel_unittest.cc | 494 |
1 files changed, 0 insertions, 494 deletions
diff --git a/components/invalidation/gcm_network_channel_unittest.cc b/components/invalidation/gcm_network_channel_unittest.cc deleted file mode 100644 index 29cab07..0000000 --- a/components/invalidation/gcm_network_channel_unittest.cc +++ /dev/null @@ -1,494 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/run_loop.h" -#include "base/strings/string_util.h" -#include "components/invalidation/gcm_network_channel.h" -#include "google_apis/gaia/google_service_auth_error.h" -#include "net/url_request/test_url_fetcher_factory.h" -#include "net/url_request/url_request_test_util.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace syncer { - -class TestGCMNetworkChannelDelegate : public GCMNetworkChannelDelegate { - public: - TestGCMNetworkChannelDelegate() - : register_call_count_(0) {} - - virtual void Initialize() OVERRIDE {} - - virtual void RequestToken(RequestTokenCallback callback) OVERRIDE { - request_token_callback = callback; - } - - virtual void InvalidateToken(const std::string& token) OVERRIDE { - invalidated_token = token; - } - - virtual void Register(RegisterCallback callback) OVERRIDE { - ++register_call_count_; - register_callback = callback; - } - - virtual void SetMessageReceiver(MessageCallback callback) OVERRIDE { - message_callback = callback; - } - - RequestTokenCallback request_token_callback; - std::string invalidated_token; - RegisterCallback register_callback; - int register_call_count_; - MessageCallback message_callback; -}; - -// Backoff policy for test. Run first 5 retries without delay. -const net::BackoffEntry::Policy kTestBackoffPolicy = { - // Number of initial errors (in sequence) to ignore before applying - // exponential back-off rules. - 5, - - // Initial delay for exponential back-off in ms. - 2000, // 2 seconds. - - // Factor by which the waiting time will be multiplied. - 2, - - // Fuzzing percentage. ex: 10% will spread requests randomly - // between 90%-100% of the calculated time. - 0.2, // 20%. - - // Maximum amount of time we are willing to delay our request in ms. - 1000 * 3600 * 4, // 4 hours. - - // Time to keep an entry from being discarded even when it - // has no significant state, -1 to never discard. - -1, - - // Don't use initial delay unless the last request was an error. - false, -}; - -class TestGCMNetworkChannel : public GCMNetworkChannel { - public: - TestGCMNetworkChannel( - scoped_refptr<net::URLRequestContextGetter> request_context_getter, - scoped_ptr<GCMNetworkChannelDelegate> delegate) - : GCMNetworkChannel(request_context_getter, delegate.Pass()) { - ResetRegisterBackoffEntryForTest(&kTestBackoffPolicy); - } - - protected: - // On Android GCMNetworkChannel::BuildUrl hits NOTREACHED(). I still want - // tests to run. - virtual GURL BuildUrl(const std::string& registration_id) OVERRIDE { - return GURL("http://test.url.com"); - } -}; - -class GCMNetworkChannelTest; - -// Test needs to capture setting echo-token header on http request. -// This class is going to do that. -class TestNetworkChannelURLFetcher : public net::FakeURLFetcher { - public: - TestNetworkChannelURLFetcher(GCMNetworkChannelTest* test, - const GURL& url, - net::URLFetcherDelegate* delegate, - const std::string& response_data, - net::HttpStatusCode response_code, - net::URLRequestStatus::Status status) - : net::FakeURLFetcher(url, - delegate, - response_data, - response_code, - status), - test_(test) {} - - virtual void AddExtraRequestHeader(const std::string& header_line) OVERRIDE; - - private: - GCMNetworkChannelTest* test_; -}; - -class GCMNetworkChannelTest - : public ::testing::Test, - public SyncNetworkChannel::Observer { - public: - GCMNetworkChannelTest() - : delegate_(NULL), - url_fetchers_created_count_(0), - last_invalidator_state_(TRANSIENT_INVALIDATION_ERROR) {} - - virtual ~GCMNetworkChannelTest() { - } - - virtual void SetUp() { - request_context_getter_ = new net::TestURLRequestContextGetter( - base::MessageLoopProxy::current()); - // Ownership of delegate goes to GCNMentworkChannel but test needs pointer - // to it. - delegate_ = new TestGCMNetworkChannelDelegate(); - scoped_ptr<GCMNetworkChannelDelegate> delegate(delegate_); - gcm_network_channel_.reset(new TestGCMNetworkChannel( - request_context_getter_, - delegate.Pass())); - gcm_network_channel_->AddObserver(this); - gcm_network_channel_->SetMessageReceiver( - invalidation::NewPermanentCallback( - this, &GCMNetworkChannelTest::OnIncomingMessage)); - url_fetcher_factory_.reset(new net::FakeURLFetcherFactory(NULL, - base::Bind(&GCMNetworkChannelTest::CreateURLFetcher, - base::Unretained(this)))); - } - - virtual void TearDown() { - gcm_network_channel_->RemoveObserver(this); - } - - // Helper functions to call private methods from test - GURL BuildUrl(const std::string& registration_id) { - return gcm_network_channel_->GCMNetworkChannel::BuildUrl(registration_id); - } - - static void Base64EncodeURLSafe(const std::string& input, - std::string* output) { - GCMNetworkChannel::Base64EncodeURLSafe(input, output); - } - - static bool Base64DecodeURLSafe(const std::string& input, - std::string* output) { - return GCMNetworkChannel::Base64DecodeURLSafe(input, output); - } - - virtual void OnNetworkChannelStateChanged( - InvalidatorState invalidator_state) OVERRIDE { - last_invalidator_state_ = invalidator_state; - } - - void OnIncomingMessage(std::string incoming_message) { - } - - GCMNetworkChannel* network_channel() { - return gcm_network_channel_.get(); - } - - TestGCMNetworkChannelDelegate* delegate() { - return delegate_; - } - - int url_fetchers_created_count() { - return url_fetchers_created_count_; - } - - net::FakeURLFetcherFactory* url_fetcher_factory() { - return url_fetcher_factory_.get(); - } - - scoped_ptr<net::FakeURLFetcher> CreateURLFetcher( - const GURL& url, - net::URLFetcherDelegate* delegate, - const std::string& response_data, - net::HttpStatusCode response_code, - net::URLRequestStatus::Status status) { - ++url_fetchers_created_count_; - return scoped_ptr<net::FakeURLFetcher>(new TestNetworkChannelURLFetcher( - this, url, delegate, response_data, response_code, status)); - } - - void set_last_echo_token(const std::string& echo_token) { - last_echo_token_ = echo_token; - } - - const std::string& get_last_echo_token() { - return last_echo_token_; - } - - InvalidatorState get_last_invalidator_state() { - return last_invalidator_state_; - } - - void RunLoopUntilIdle() { - base::RunLoop run_loop; - run_loop.RunUntilIdle(); - } - - private: - base::MessageLoop message_loop_; - TestGCMNetworkChannelDelegate* delegate_; - scoped_ptr<GCMNetworkChannel> gcm_network_channel_; - scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_; - scoped_ptr<net::FakeURLFetcherFactory> url_fetcher_factory_; - int url_fetchers_created_count_; - std::string last_echo_token_; - InvalidatorState last_invalidator_state_; -}; - -void TestNetworkChannelURLFetcher::AddExtraRequestHeader( - const std::string& header_line) { - net::FakeURLFetcher::AddExtraRequestHeader(header_line); - std::string header_name("echo-token: "); - std::string echo_token; - if (StartsWithASCII(header_line, header_name, false)) { - echo_token = header_line; - ReplaceFirstSubstringAfterOffset( - &echo_token, 0, header_name, std::string()); - test_->set_last_echo_token(echo_token); - } -} - -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_NO_CONTENT, - net::URLRequestStatus::SUCCESS); - - // After construction GCMNetworkChannel should have called Register. - EXPECT_FALSE(delegate()->register_callback.is_null()); - // Return valid registration id. - delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS); - - network_channel()->SendMessage("abra.cadabra"); - // SendMessage should have triggered RequestToken. No HTTP request should be - // started yet. - EXPECT_FALSE(delegate()->request_token_callback.is_null()); - EXPECT_EQ(url_fetchers_created_count(), 0); - // Return valid access token. This should trigger HTTP request. - delegate()->request_token_callback.Run( - GoogleServiceAuthError::AuthErrorNone(), "access.token"); - RunLoopUntilIdle(); - EXPECT_EQ(url_fetchers_created_count(), 1); - - // Return another access token. Message should be cleared by now and shouldn't - // be sent. - delegate()->request_token_callback.Run( - GoogleServiceAuthError::AuthErrorNone(), "access.token2"); - RunLoopUntilIdle(); - EXPECT_EQ(url_fetchers_created_count(), 1); - EXPECT_EQ(INVALIDATIONS_ENABLED, get_last_invalidator_state()); -} - -TEST_F(GCMNetworkChannelTest, FailedRegister) { - // After construction GCMNetworkChannel should have called Register. - EXPECT_FALSE(delegate()->register_callback.is_null()); - EXPECT_EQ(1, delegate()->register_call_count_); - // Return transient error from Register call. - delegate()->register_callback.Run("", gcm::GCMClient::NETWORK_ERROR); - RunLoopUntilIdle(); - // GcmNetworkChannel should have scheduled Register retry. - EXPECT_EQ(2, delegate()->register_call_count_); - // Return persistent error from Register call. - delegate()->register_callback.Run("", gcm::GCMClient::NOT_SIGNED_IN); - RunLoopUntilIdle(); - // GcmNetworkChannel should give up trying. - EXPECT_EQ(2, delegate()->register_call_count_); - - network_channel()->SendMessage("abra.cadabra"); - // SendMessage shouldn't trigger RequestToken. - EXPECT_TRUE(delegate()->request_token_callback.is_null()); - EXPECT_EQ(0, url_fetchers_created_count()); -} - -TEST_F(GCMNetworkChannelTest, RegisterFinishesAfterSendMessage) { - url_fetcher_factory()->SetFakeResponse(GURL("http://test.url.com"), - "", - net::HTTP_NO_CONTENT, - net::URLRequestStatus::SUCCESS); - - // After construction GCMNetworkChannel should have called Register. - EXPECT_FALSE(delegate()->register_callback.is_null()); - - network_channel()->SendMessage("abra.cadabra"); - // SendMessage shouldn't trigger RequestToken. - EXPECT_TRUE(delegate()->request_token_callback.is_null()); - EXPECT_EQ(url_fetchers_created_count(), 0); - - // Return valid registration id. - delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS); - - EXPECT_FALSE(delegate()->request_token_callback.is_null()); - EXPECT_EQ(url_fetchers_created_count(), 0); - // Return valid access token. This should trigger HTTP request. - delegate()->request_token_callback.Run( - GoogleServiceAuthError::AuthErrorNone(), "access.token"); - RunLoopUntilIdle(); - EXPECT_EQ(url_fetchers_created_count(), 1); -} - -TEST_F(GCMNetworkChannelTest, RequestTokenFailure) { - // After construction GCMNetworkChannel should have called Register. - EXPECT_FALSE(delegate()->register_callback.is_null()); - // Return valid registration id. - delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS); - - network_channel()->SendMessage("abra.cadabra"); - // SendMessage should have triggered RequestToken. No HTTP request should be - // started yet. - EXPECT_FALSE(delegate()->request_token_callback.is_null()); - EXPECT_EQ(url_fetchers_created_count(), 0); - // RequestToken returns failure. - delegate()->request_token_callback.Run( - GoogleServiceAuthError::FromConnectionError(1), ""); - - // Should be no HTTP requests. - EXPECT_EQ(url_fetchers_created_count(), 0); -} - -TEST_F(GCMNetworkChannelTest, AuthErrorFromServer) { - // Setup fake response to return AUTH_ERROR. - url_fetcher_factory()->SetFakeResponse(GURL("http://test.url.com"), - "", - net::HTTP_UNAUTHORIZED, - net::URLRequestStatus::SUCCESS); - - // After construction GCMNetworkChannel should have called Register. - EXPECT_FALSE(delegate()->register_callback.is_null()); - // Return valid registration id. - delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS); - - network_channel()->SendMessage("abra.cadabra"); - // SendMessage should have triggered RequestToken. No HTTP request should be - // started yet. - EXPECT_FALSE(delegate()->request_token_callback.is_null()); - EXPECT_EQ(url_fetchers_created_count(), 0); - // Return valid access token. This should trigger HTTP request. - delegate()->request_token_callback.Run( - GoogleServiceAuthError::AuthErrorNone(), "access.token"); - RunLoopUntilIdle(); - EXPECT_EQ(url_fetchers_created_count(), 1); - EXPECT_EQ(delegate()->invalidated_token, "access.token"); -} - -// Following two tests are to check for memory leaks/crashes when Register and -// RequestToken don't complete by the teardown. -TEST_F(GCMNetworkChannelTest, RegisterNeverCompletes) { - network_channel()->SendMessage("abra.cadabra"); - // Register should be called by now. Let's not complete and see what happens. - EXPECT_FALSE(delegate()->register_callback.is_null()); -} - -TEST_F(GCMNetworkChannelTest, RequestTokenNeverCompletes) { - network_channel()->SendMessage("abra.cadabra"); - // Return valid registration id. - delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS); - // RequestToken should be called by now. Let's not complete and see what - // happens. - EXPECT_FALSE(delegate()->request_token_callback.is_null()); -} - -TEST_F(GCMNetworkChannelTest, Base64EncodeDecode) { - std::string input; - std::string plain; - std::string base64; - // Empty string. - Base64EncodeURLSafe(input, &base64); - EXPECT_TRUE(base64.empty()); - EXPECT_TRUE(Base64DecodeURLSafe(base64, &plain)); - EXPECT_EQ(input, plain); - // String length: 1..7. - for (int length = 1; length < 8; length++) { - input = "abra.cadabra"; - input.resize(length); - Base64EncodeURLSafe(input, &base64); - // Ensure no padding at the end. - EXPECT_NE(base64[base64.size() - 1], '='); - EXPECT_TRUE(Base64DecodeURLSafe(base64, &plain)); - EXPECT_EQ(input, plain); - } - // Presence of '-', '_'. - input = "\xfb\xff"; - Base64EncodeURLSafe(input, &base64); - EXPECT_EQ("-_8", base64); - EXPECT_TRUE(Base64DecodeURLSafe(base64, &plain)); - 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(OS_ANDROID) -TEST_F(GCMNetworkChannelTest, BuildUrl) { - GURL url = BuildUrl("registration.id"); - EXPECT_TRUE(url.SchemeIsHTTPOrHTTPS()); - EXPECT_FALSE(url.host().empty()); - EXPECT_FALSE(url.path().empty()); - std::vector<std::string> parts; - Tokenize(url.path(), "/", &parts); - std::string buffer; - EXPECT_TRUE(Base64DecodeURLSafe(parts[parts.size() - 1], &buffer)); -} - -TEST_F(GCMNetworkChannelTest, EchoToken) { - url_fetcher_factory()->SetFakeResponse(GURL("http://test.url.com"), - std::string(), - net::HTTP_OK, - net::URLRequestStatus::SUCCESS); - // After construction GCMNetworkChannel should have called Register. - // Return valid registration id. - delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS); - - network_channel()->SendMessage("abra.cadabra"); - // Return valid access token. This should trigger HTTP request. - delegate()->request_token_callback.Run( - GoogleServiceAuthError::AuthErrorNone(), "access.token"); - RunLoopUntilIdle(); - EXPECT_EQ(url_fetchers_created_count(), 1); - EXPECT_TRUE(get_last_echo_token().empty()); - - // Trigger response. - delegate()->message_callback.Run("abra.cadabra", "echo.token"); - // Send another message. - network_channel()->SendMessage("abra.cadabra"); - // Return valid access token. This should trigger HTTP request. - delegate()->request_token_callback.Run( - GoogleServiceAuthError::AuthErrorNone(), "access.token"); - RunLoopUntilIdle(); - EXPECT_EQ(url_fetchers_created_count(), 2); - EXPECT_EQ("echo.token", get_last_echo_token()); - - // Trigger response with empty echo token. - delegate()->message_callback.Run("abra.cadabra", ""); - // Send another message. - network_channel()->SendMessage("abra.cadabra"); - // Return valid access token. This should trigger HTTP request. - delegate()->request_token_callback.Run( - GoogleServiceAuthError::AuthErrorNone(), "access.token"); - RunLoopUntilIdle(); - EXPECT_EQ(url_fetchers_created_count(), 3); - // Echo_token should be from second message. - EXPECT_EQ("echo.token", get_last_echo_token()); -} -#endif - -} // namespace syncer |