1 // Copyright (c) 2012 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.
5 #include "sync/notifier/push_client_channel.h"
10 #include "base/compiler_specific.h"
11 #include "jingle/notifier/listener/fake_push_client.h"
12 #include "jingle/notifier/listener/notification_defines.h"
13 #include "testing/gtest/include/gtest/gtest.h"
18 class PushClientChannelTest
19 : public ::testing::Test
,
20 public SyncNetworkChannel::Observer
{
22 PushClientChannelTest()
23 : fake_push_client_(new notifier::FakePushClient()),
25 scoped_ptr
<notifier::PushClient
>(fake_push_client_
)),
26 last_invalidator_state_(DEFAULT_INVALIDATION_ERROR
) {
27 push_client_channel_
.AddObserver(this);
28 push_client_channel_
.SetMessageReceiver(
29 invalidation::NewPermanentCallback(
30 this, &PushClientChannelTest::OnIncomingMessage
));
31 push_client_channel_
.SetSystemResources(NULL
);
34 virtual ~PushClientChannelTest() {
35 push_client_channel_
.RemoveObserver(this);
38 virtual void OnNetworkChannelStateChanged(
39 InvalidatorState invalidator_state
) OVERRIDE
{
40 last_invalidator_state_
= invalidator_state
;
43 void OnIncomingMessage(std::string incoming_message
) {
44 last_message_
= incoming_message
;
47 notifier::FakePushClient
* fake_push_client_
;
48 PushClientChannel push_client_channel_
;
49 std::string last_message_
;
50 InvalidatorState last_invalidator_state_
;
53 const char kMessage
[] = "message";
54 const char kServiceContext
[] = "service context";
55 const int64 kSchedulingHash
= 100;
57 // Make sure the channel subscribes to the correct notifications
58 // channel on construction.
59 TEST_F(PushClientChannelTest
, Subscriptions
) {
60 notifier::Subscription expected_subscription
;
61 expected_subscription
.channel
= "tango_raw";
62 EXPECT_TRUE(notifier::SubscriptionListsEqual(
63 fake_push_client_
->subscriptions(),
64 notifier::SubscriptionList(1, expected_subscription
)));
67 // Call UpdateCredentials on the channel. It should propagate it to
69 TEST_F(PushClientChannelTest
, UpdateCredentials
) {
70 const char kEmail
[] = "foo@bar.com";
71 const char kToken
[] = "token";
72 EXPECT_TRUE(fake_push_client_
->email().empty());
73 EXPECT_TRUE(fake_push_client_
->token().empty());
74 push_client_channel_
.UpdateCredentials(kEmail
, kToken
);
75 EXPECT_EQ(kEmail
, fake_push_client_
->email());
76 EXPECT_EQ(kToken
, fake_push_client_
->token());
79 // Simulate push client state changes on the push client. It should
80 // propagate to the channel.
81 TEST_F(PushClientChannelTest
, OnPushClientStateChange
) {
82 EXPECT_EQ(DEFAULT_INVALIDATION_ERROR
, last_invalidator_state_
);
83 fake_push_client_
->EnableNotifications();
84 EXPECT_EQ(INVALIDATIONS_ENABLED
, last_invalidator_state_
);
85 fake_push_client_
->DisableNotifications(
86 notifier::TRANSIENT_NOTIFICATION_ERROR
);
87 EXPECT_EQ(TRANSIENT_INVALIDATION_ERROR
, last_invalidator_state_
);
88 fake_push_client_
->DisableNotifications(
89 notifier::NOTIFICATION_CREDENTIALS_REJECTED
);
90 EXPECT_EQ(INVALIDATION_CREDENTIALS_REJECTED
, last_invalidator_state_
);
93 // Call SendMessage on the channel. It should propagate it to the
95 TEST_F(PushClientChannelTest
, SendMessage
) {
96 EXPECT_TRUE(fake_push_client_
->sent_notifications().empty());
97 push_client_channel_
.SendMessage(kMessage
);
98 ASSERT_EQ(1u, fake_push_client_
->sent_notifications().size());
101 // Simulate an incoming notification. It should be decoded properly
103 TEST_F(PushClientChannelTest
, OnIncomingNotification
) {
104 notifier::Notification notification
;
106 PushClientChannel::EncodeMessageForTest(
107 kMessage
, kServiceContext
, kSchedulingHash
);
109 fake_push_client_
->SimulateIncomingNotification(notification
);
110 EXPECT_EQ(kServiceContext
,
111 push_client_channel_
.GetServiceContextForTest());
112 EXPECT_EQ(kSchedulingHash
,
113 push_client_channel_
.GetSchedulingHashForTest());
114 EXPECT_EQ(kMessage
, last_message_
);
118 } // namespace syncer