1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/invalidation/ticl_profile_settings_provider.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "base/prefs/pref_service.h"
9#include "chrome/browser/profiles/profile.h"
10#include "chrome/browser/services/gcm/gcm_profile_service.h"
11#include "chrome/browser/services/gcm/gcm_profile_service_factory.h"
12#include "chrome/common/pref_names.h"
13#include "chrome/test/base/testing_profile.h"
14#include "components/invalidation/fake_invalidation_state_tracker.h"
15#include "components/invalidation/invalidation_state_tracker.h"
16#include "components/invalidation/ticl_invalidation_service.h"
17#include "components/invalidation/ticl_settings_provider.h"
18#include "content/public/test/test_browser_thread_bundle.h"
19#include "google_apis/gaia/fake_identity_provider.h"
20#include "google_apis/gaia/fake_oauth2_token_service.h"
21#include "google_apis/gaia/identity_provider.h"
22#include "net/url_request/url_request_context_getter.h"
23#include "testing/gtest/include/gtest/gtest.h"
24
25namespace invalidation {
26
27class TiclProfileSettingsProviderTest : public testing::Test {
28 protected:
29  TiclProfileSettingsProviderTest();
30  virtual ~TiclProfileSettingsProviderTest();
31
32  // testing::Test:
33  virtual void SetUp() OVERRIDE;
34  virtual void TearDown() OVERRIDE;
35
36  TiclInvalidationService::InvalidationNetworkChannel GetNetworkChannel();
37
38  content::TestBrowserThreadBundle thread_bundle_;
39  TestingProfile profile_;
40  FakeOAuth2TokenService token_service_;
41
42  scoped_ptr<TiclInvalidationService> invalidation_service_;
43
44 private:
45  DISALLOW_COPY_AND_ASSIGN(TiclProfileSettingsProviderTest);
46};
47
48TiclProfileSettingsProviderTest::TiclProfileSettingsProviderTest() {
49}
50
51TiclProfileSettingsProviderTest::~TiclProfileSettingsProviderTest() {
52}
53
54void TiclProfileSettingsProviderTest::SetUp() {
55  invalidation_service_.reset(new TiclInvalidationService(
56      "TestUserAgent",
57      scoped_ptr<IdentityProvider>(new FakeIdentityProvider(&token_service_)),
58      scoped_ptr<TiclSettingsProvider>(
59          new TiclProfileSettingsProvider(&profile_)),
60      gcm::GCMProfileServiceFactory::GetForProfile(&profile_)->driver(),
61      profile_.GetRequestContext()));
62  invalidation_service_->Init(scoped_ptr<syncer::InvalidationStateTracker>(
63      new syncer::FakeInvalidationStateTracker));
64}
65
66void TiclProfileSettingsProviderTest::TearDown() {
67  invalidation_service_.reset();
68}
69
70TiclInvalidationService::InvalidationNetworkChannel
71TiclProfileSettingsProviderTest::GetNetworkChannel() {
72  return invalidation_service_->network_channel_type_;
73}
74
75TEST_F(TiclProfileSettingsProviderTest, ChannelSelectionTest) {
76  // Default value should be GCM channel.
77  EXPECT_EQ(TiclInvalidationService::GCM_NETWORK_CHANNEL, GetNetworkChannel());
78  PrefService* prefs =  profile_.GetPrefs();
79
80  // If GCM is enabled and invalidation channel setting is not set or set to
81  // true then use GCM channel.
82  prefs->SetBoolean(prefs::kGCMChannelEnabled, true);
83  prefs->SetBoolean(prefs::kInvalidationServiceUseGCMChannel, true);
84  EXPECT_EQ(TiclInvalidationService::GCM_NETWORK_CHANNEL, GetNetworkChannel());
85
86  prefs->SetBoolean(prefs::kGCMChannelEnabled, true);
87  prefs->ClearPref(prefs::kInvalidationServiceUseGCMChannel);
88  EXPECT_EQ(TiclInvalidationService::GCM_NETWORK_CHANNEL, GetNetworkChannel());
89
90  prefs->ClearPref(prefs::kGCMChannelEnabled);
91  prefs->SetBoolean(prefs::kInvalidationServiceUseGCMChannel, true);
92  EXPECT_EQ(TiclInvalidationService::GCM_NETWORK_CHANNEL, GetNetworkChannel());
93
94  // If invalidation channel setting is set to false, fall back to push channel.
95  prefs->SetBoolean(prefs::kGCMChannelEnabled, true);
96  prefs->SetBoolean(prefs::kInvalidationServiceUseGCMChannel, false);
97  EXPECT_EQ(TiclInvalidationService::PUSH_CLIENT_CHANNEL, GetNetworkChannel());
98
99  // If invalidation channel setting says use GCM but GCM is not enabled, fall
100  // back to push channel.
101  prefs->SetBoolean(prefs::kGCMChannelEnabled, false);
102  prefs->SetBoolean(prefs::kInvalidationServiceUseGCMChannel, true);
103  EXPECT_EQ(TiclInvalidationService::PUSH_CLIENT_CHANNEL, GetNetworkChannel());
104}
105
106}  // namespace invalidation
107