15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/non_blocking_push_client.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstddef> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/base/fake_base_task.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/fake_push_client.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/fake_push_client_observer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/listener/push_client_observer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace notifier { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NonBlockingPushClientTest : public testing::Test { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonBlockingPushClientTest() : fake_push_client_(NULL) {} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NonBlockingPushClientTest() {} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_.reset( 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new NonBlockingPushClient( 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessageLoopProxy::current(), 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NonBlockingPushClientTest::CreateFakePushClient, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)))); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->AddObserver(&fake_observer_); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pump message loop to run CreateFakePushClient. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear out any pending notifications before removing observers. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->RemoveObserver(&fake_observer_); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_.reset(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Then pump message loop to run 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NonBlockingPushClient::DestroyOnDelegateThread(). 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PushClient> CreateFakePushClient() { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fake_push_client_) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scoped_ptr<PushClient>(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_push_client_ = new FakePushClient(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scoped_ptr<PushClient>(fake_push_client_); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop message_loop_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakePushClientObserver fake_observer_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<NonBlockingPushClient> push_client_; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Owned by |push_client_|. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakePushClient* fake_push_client_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure UpdateSubscriptions() gets delegated properly. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NonBlockingPushClientTest, UpdateSubscriptions) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubscriptionList subscriptions(10); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subscriptions[0].channel = "channel"; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subscriptions[9].from = "from"; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->UpdateSubscriptions(subscriptions); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_push_client_->subscriptions().empty()); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SubscriptionListsEqual( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_push_client_->subscriptions(), subscriptions)); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure UpdateCredentials() gets delegated properly. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NonBlockingPushClientTest, UpdateCredentials) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kEmail[] = "foo@bar.com"; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kToken[] = "baz"; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->UpdateCredentials(kEmail, kToken); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_push_client_->email().empty()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_push_client_->token().empty()); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kEmail, fake_push_client_->email()); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kToken, fake_push_client_->token()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Notification MakeTestNotification() { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Notification notification; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification.channel = "channel"; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification.recipients.resize(10); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification.recipients[0].to = "to"; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification.recipients[9].user_specific_data = "user_specific_data"; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notification.data = "data"; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return notification; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure SendNotification() gets delegated properly. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NonBlockingPushClientTest, SendNotification) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Notification notification = MakeTestNotification(); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->SendNotification(notification); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_push_client_->sent_notifications().empty()); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, fake_push_client_->sent_notifications().size()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_push_client_->sent_notifications()[0].Equals(notification)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure SendPing() gets delegated properly. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NonBlockingPushClientTest, SendPing) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) push_client_->SendPing(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, fake_push_client_->sent_pings()); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, fake_push_client_->sent_pings()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure notification state changes get propagated back to the 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parent. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NonBlockingPushClientTest, NotificationStateChange) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(DEFAULT_NOTIFICATION_ERROR, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_observer_.last_notifications_disabled_reason()); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_push_client_->EnableNotifications(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NO_NOTIFICATION_ERROR, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_observer_.last_notifications_disabled_reason()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_push_client_->DisableNotifications( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIFICATION_CREDENTIALS_REJECTED); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NOTIFICATION_CREDENTIALS_REJECTED, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_observer_.last_notifications_disabled_reason()); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure incoming notifications get propagated back to the parent. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NonBlockingPushClientTest, OnIncomingNotification) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Notification notification = MakeTestNotification(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_push_client_->SimulateIncomingNotification(notification); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_.RunUntilIdle(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_observer_.last_incoming_notification().Equals(notification)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace notifier 152