Home | History | Annotate | Download | only in notifier
      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.
      4 
      5 #include "sync/notifier/push_client_channel.h"
      6 
      7 #include <cstddef>
      8 #include <string>
      9 
     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"
     14 
     15 namespace syncer {
     16 namespace {
     17 
     18 class PushClientChannelTest
     19     : public ::testing::Test,
     20       public SyncNetworkChannel::Observer {
     21  protected:
     22   PushClientChannelTest()
     23       : fake_push_client_(new notifier::FakePushClient()),
     24         push_client_channel_(
     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);
     32   }
     33 
     34   virtual ~PushClientChannelTest() {
     35     push_client_channel_.RemoveObserver(this);
     36   }
     37 
     38   virtual void OnNetworkChannelStateChanged(
     39       InvalidatorState invalidator_state) OVERRIDE {
     40     last_invalidator_state_ = invalidator_state;
     41   }
     42 
     43   void OnIncomingMessage(std::string incoming_message) {
     44     last_message_ = incoming_message;
     45   }
     46 
     47   notifier::FakePushClient* fake_push_client_;
     48   PushClientChannel push_client_channel_;
     49   std::string last_message_;
     50   InvalidatorState last_invalidator_state_;
     51 };
     52 
     53 const char kMessage[] = "message";
     54 const char kServiceContext[] = "service context";
     55 const int64 kSchedulingHash = 100;
     56 
     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)));
     65 }
     66 
     67 // Call UpdateCredentials on the channel.  It should propagate it to
     68 // the push client.
     69 TEST_F(PushClientChannelTest, UpdateCredentials) {
     70   const char kEmail[] = "foo (at) 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());
     77 }
     78 
     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_);
     91 }
     92 
     93 // Call SendMessage on the channel.  It should propagate it to the
     94 // push client.
     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());
     99 }
    100 
    101 // Simulate an incoming notification.  It should be decoded properly
    102 // by the channel.
    103 TEST_F(PushClientChannelTest, OnIncomingNotification) {
    104   notifier::Notification notification;
    105   notification.data =
    106       PushClientChannel::EncodeMessageForTest(
    107           kMessage, kServiceContext, kSchedulingHash);
    108 
    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_);
    115 }
    116 
    117 }  // namespace
    118 }  // namespace syncer
    119