diff options
author | rsimha@chromium.org <rsimha@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-07 22:28:23 +0000 |
---|---|---|
committer | rsimha@chromium.org <rsimha@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-07 22:28:23 +0000 |
commit | 4cbf13c20a9e18538515e2a83c2fbfd01659eaad (patch) | |
tree | 8a663789a02817f284f4848fca2ecf42faf5f3a7 /jingle | |
parent | 90eaf71823e9e5480f7e542421cccbba969044c7 (diff) | |
download | chromium_src-4cbf13c20a9e18538515e2a83c2fbfd01659eaad.zip chromium_src-4cbf13c20a9e18538515e2a83c2fbfd01659eaad.tar.gz chromium_src-4cbf13c20a9e18538515e2a83c2fbfd01659eaad.tar.bz2 |
Adding the sync-notification-host command line parameter to the integration tests.
The sync integration tests currently access the network to communicate
with the notification server. We need to move to a model where all
server accesses are stubbed out by local servers. This is the first step
towards implementing a local notification server.
BUG=53933,53931
TEST=sync_integration_tests
Review URL: http://codereview.chromium.org/3326007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@58768 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'jingle')
-rw-r--r-- | jingle/jingle.gyp | 3 | ||||
-rw-r--r-- | jingle/notifier/base/notification_method.cc | 52 | ||||
-rw-r--r-- | jingle/notifier/base/notification_method.h | 68 | ||||
-rw-r--r-- | jingle/notifier/base/notifier_options.h | 47 | ||||
-rw-r--r-- | jingle/notifier/listener/mediator_thread_impl.cc | 47 | ||||
-rw-r--r-- | jingle/notifier/listener/mediator_thread_impl.h | 6 | ||||
-rw-r--r-- | jingle/notifier/listener/talk_mediator_unittest.cc | 8 |
7 files changed, 204 insertions, 27 deletions
diff --git a/jingle/jingle.gyp b/jingle/jingle.gyp index dd76e04..2f01fff 100644 --- a/jingle/jingle.gyp +++ b/jingle/jingle.gyp @@ -22,6 +22,9 @@ 'notifier/base/ssl_adapter.cc', 'notifier/base/fake_ssl_client_socket.cc', 'notifier/base/fake_ssl_client_socket.h', + 'notifier/base/notification_method.h', + 'notifier/base/notification_method.cc', + 'notifier/base/notifier_options.h', 'notifier/base/static_assert.h', 'notifier/base/task_pump.cc', 'notifier/base/task_pump.h', diff --git a/jingle/notifier/base/notification_method.cc b/jingle/notifier/base/notification_method.cc new file mode 100644 index 0000000..08feb4a --- /dev/null +++ b/jingle/notifier/base/notification_method.cc @@ -0,0 +1,52 @@ +// Copyright (c) 2010 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 "jingle/notifier/base/notification_method.h" + +#include "base/logging.h" + +namespace notifier { + +const NotificationMethod kDefaultNotificationMethod = NOTIFICATION_SERVER; + +std::string NotificationMethodToString( + NotificationMethod notification_method) { + switch (notification_method) { + case NOTIFICATION_LEGACY: + return "NOTIFICATION_LEGACY"; + break; + case NOTIFICATION_TRANSITIONAL: + return "NOTIFICATION_TRANSITIONAL"; + break; + case NOTIFICATION_NEW: + return "NOTIFICATION_NEW"; + break; + case NOTIFICATION_SERVER: + return "NOTIFICATION_SERVER"; + break; + default: + LOG(WARNING) << "Unknown value for notification method: " + << notification_method; + break; + } + return "<unknown notification method>"; +} + +NotificationMethod StringToNotificationMethod(const std::string& str) { + if (str == "legacy") { + return NOTIFICATION_LEGACY; + } else if (str == "transitional") { + return NOTIFICATION_TRANSITIONAL; + } else if (str == "new") { + return NOTIFICATION_NEW; + } else if (str == "server") { + return NOTIFICATION_SERVER; + } + LOG(WARNING) << "Unknown notification method \"" << str + << "\"; using method " + << NotificationMethodToString(kDefaultNotificationMethod); + return kDefaultNotificationMethod; +} + +} // namespace notifier diff --git a/jingle/notifier/base/notification_method.h b/jingle/notifier/base/notification_method.h new file mode 100644 index 0000000..aedc11d --- /dev/null +++ b/jingle/notifier/base/notification_method.h @@ -0,0 +1,68 @@ +// Copyright (c) 2010 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. + +#ifndef JINGLE_NOTIFIER_BASE_NOTIFICATION_METHOD_H_ +#define JINGLE_NOTIFIER_BASE_NOTIFICATION_METHOD_H_ +#pragma once + +#include <string> + +namespace notifier { + +// This is the matrix for the interaction between clients with +// different notification methods (except for NOTIFICATION_SERVER): +// +// Listen +// L T N +// +-------+ +// L | E E E | +// Send T | Y Y Y | +// N | E Y Y | +// +-------+ +// +// 'Y' means a client listening with the column notification method +// will receive notifications from a client sending with the row +// notification method. 'E' means means that the notification will be +// an empty one, which may be dropped by the server in the future. +// +// As for NOTIFICATION_SERVER, server-issued notifications will also +// simulate a peer-issued notification, so that any client with +// NOTIFICATION_TRANSITIONAL or NOTIFICATION_NEW will be able to +// receive those, too. This support will be removed once everyone is +// on NOTIFICATION_SERVER. + +enum NotificationMethod { + // Old, broken notification method. Works only if notification + // servers don't drop empty notifications. + NOTIFICATION_LEGACY, + // Compatible with new notifications. Also compatible with legacy + // notifications if the notification servers don't drop empty + // notifications. + NOTIFICATION_TRANSITIONAL, + // New notification method. Compatible only with transitional + // notifications. + // + // NOTE: "New" is kind of a misnomer, as it refers only to + // peer-issued notifications; the plan is to migrate everyone to + // using NOTIFICATION_SERVER. + NOTIFICATION_NEW, + + // Server-issued notifications. Compatible only with transitional + // notifications. + NOTIFICATION_SERVER, +}; + +extern const NotificationMethod kDefaultNotificationMethod; + +std::string NotificationMethodToString( + NotificationMethod notification_method); + +// If the given string is not one of "legacy", "transitional", "new", +// or "server", returns kDefaultNotificationMethod. +NotificationMethod StringToNotificationMethod(const std::string& str); + +} // namespace notifier + +#endif // JINGLE_NOTIFIER_BASE_NOTIFICATION_METHOD_H_ + diff --git a/jingle/notifier/base/notifier_options.h b/jingle/notifier/base/notifier_options.h new file mode 100644 index 0000000..32374cf --- /dev/null +++ b/jingle/notifier/base/notifier_options.h @@ -0,0 +1,47 @@ +// Copyright (c) 2010 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. + +#ifndef JINGLE_NOTIFIER_BASE_NOTIFIER_OPTIONS_H_ +#define JINGLE_NOTIFIER_BASE_NOTIFIER_OPTIONS_H_ + +#include "jingle/notifier/base/notification_method.h" +#include "net/base/host_port_pair.h" + +namespace notifier { + +struct NotifierOptions { + NotifierOptions() + : use_chrome_async_socket(true), + try_ssltcp_first(false), + notification_method(kDefaultNotificationMethod) {} + + NotifierOptions(const bool use_chrome_async_socket, + const bool try_ssltcp_first, + const net::HostPortPair& xmpp_host_port, + NotificationMethod notification_method) + : use_chrome_async_socket(use_chrome_async_socket), + try_ssltcp_first(try_ssltcp_first), + xmpp_host_port(xmpp_host_port), + notification_method(notification_method) {} + + // Indicates whether to use the chrome-socket-based buzz::AsyncSocket + // implementation for notifications. + bool use_chrome_async_socket; + + // Indicates that the SSLTCP port (443) is to be tried before the the XMPP + // port (5222) during login. + bool try_ssltcp_first; + + // Contains a custom URL and port for the notification server, if one is to + // be used. Empty otherwise. + net::HostPortPair xmpp_host_port; + + // Indicates the method used by sync clients while sending and listening to + // notifications. + NotificationMethod notification_method; +}; + +} // namespace notifier + +#endif // JINGLE_NOTIFIER_BASE_NOTIFIER_OPTIONS_H_ diff --git a/jingle/notifier/listener/mediator_thread_impl.cc b/jingle/notifier/listener/mediator_thread_impl.cc index 63e404e..02d48fb1 100644 --- a/jingle/notifier/listener/mediator_thread_impl.cc +++ b/jingle/notifier/listener/mediator_thread_impl.cc @@ -26,12 +26,10 @@ DISABLE_RUNNABLE_METHOD_REFCOUNT(notifier::MediatorThreadImpl); namespace notifier { -MediatorThreadImpl::MediatorThreadImpl(bool use_chrome_async_socket, - bool try_ssltcp_first) +MediatorThreadImpl::MediatorThreadImpl(const NotifierOptions& notifier_options) : delegate_(NULL), parent_message_loop_(MessageLoop::current()), - use_chrome_async_socket_(use_chrome_async_socket), - try_ssltcp_first_(try_ssltcp_first), + notifier_options_(notifier_options), worker_thread_("MediatorThread worker thread") { DCHECK(parent_message_loop_); } @@ -53,7 +51,7 @@ void MediatorThreadImpl::Start() { // TODO(akalin): Make this function return a bool and remove this // CHECK(). CHECK(worker_thread_.StartWithOptions(options)); - if (!use_chrome_async_socket_) { + if (!notifier_options_.use_chrome_async_socket) { worker_message_loop()->PostTask( FROM_HERE, NewRunnableMethod(this, &MediatorThreadImpl::StartLibjingleThread)); @@ -62,7 +60,7 @@ void MediatorThreadImpl::Start() { void MediatorThreadImpl::StartLibjingleThread() { DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - DCHECK(!use_chrome_async_socket_); + DCHECK(!notifier_options_.use_chrome_async_socket); socket_server_.reset(new talk_base::PhysicalSocketServer()); libjingle_thread_.reset(new talk_base::Thread()); talk_base::ThreadManager::SetCurrent(libjingle_thread_.get()); @@ -73,7 +71,7 @@ void MediatorThreadImpl::StartLibjingleThread() { void MediatorThreadImpl::StopLibjingleThread() { DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - DCHECK(!use_chrome_async_socket_); + DCHECK(!notifier_options_.use_chrome_async_socket); talk_base::ThreadManager::SetCurrent(NULL); libjingle_thread_.reset(); socket_server_.reset(); @@ -81,7 +79,7 @@ void MediatorThreadImpl::StopLibjingleThread() { void MediatorThreadImpl::PumpLibjingleLoop() { DCHECK_EQ(MessageLoop::current(), worker_message_loop()); - DCHECK(!use_chrome_async_socket_); + DCHECK(!notifier_options_.use_chrome_async_socket); // Pump the libjingle message loop 100ms at a time. if (!libjingle_thread_.get()) { // StopLibjingleThread() was called. @@ -105,7 +103,7 @@ void MediatorThreadImpl::Logout() { worker_message_loop()->PostTask( FROM_HERE, NewRunnableMethod(this, &MediatorThreadImpl::DoDisconnect)); - if (!use_chrome_async_socket_) { + if (!notifier_options_.use_chrome_async_socket) { worker_message_loop()->PostTask( FROM_HERE, NewRunnableMethod(this, &MediatorThreadImpl::StopLibjingleThread)); @@ -182,15 +180,24 @@ void MediatorThreadImpl::DoLogin( pump_.reset(new notifier::TaskPump()); notifier::ServerInformation server_list[2]; - int server_list_count = 2; - - // The default servers know how to serve over port 443 (that's the magic). - server_list[0].server = net::HostPortPair("talk.google.com", - notifier::kDefaultXmppPort); - server_list[0].special_port_magic = true; - server_list[1].server = net::HostPortPair("talkx.l.google.com", - notifier::kDefaultXmppPort); - server_list[1].special_port_magic = true; + int server_list_count = 0; + + // Override the default servers with a test notification server if one was + // provided. + if(!notifier_options_.xmpp_host_port.host().empty()) { + server_list[0].server = notifier_options_.xmpp_host_port; + server_list[0].special_port_magic = false; + server_list_count = 1; + } else { + // The default servers know how to serve over port 443 (that's the magic). + server_list[0].server = net::HostPortPair("talk.google.com", + notifier::kDefaultXmppPort); + server_list[0].special_port_magic = true; + server_list[1].server = net::HostPortPair("talkx.l.google.com", + notifier::kDefaultXmppPort); + server_list[1].special_port_magic = true; + server_list_count = 2; + } // Autodetect proxy is on by default. notifier::ConnectionOptions options; @@ -198,7 +205,7 @@ void MediatorThreadImpl::DoLogin( // Language is not used in the stanza so we default to |en|. std::string lang = "en"; login_.reset(new notifier::Login(pump_.get(), - use_chrome_async_socket_, + notifier_options_.use_chrome_async_socket, settings, options, lang, @@ -207,7 +214,7 @@ void MediatorThreadImpl::DoLogin( server_list_count, // talk_base::FirewallManager* is NULL. NULL, - try_ssltcp_first_, + notifier_options_.try_ssltcp_first, // Both the proxy and a non-proxy route // will be attempted. false)); diff --git a/jingle/notifier/listener/mediator_thread_impl.h b/jingle/notifier/listener/mediator_thread_impl.h index 39eca59..755731e 100644 --- a/jingle/notifier/listener/mediator_thread_impl.h +++ b/jingle/notifier/listener/mediator_thread_impl.h @@ -27,6 +27,7 @@ #include "base/ref_counted.h" #include "base/scoped_ptr.h" #include "base/thread.h" +#include "jingle/notifier/base/notifier_options.h" #include "jingle/notifier/communicator/login.h" #include "jingle/notifier/communicator/login_connection_state.h" #include "jingle/notifier/communicator/login_failure.h" @@ -59,7 +60,7 @@ class MediatorThreadImpl : public MediatorThread, public sigslot::has_slots<> { public: - MediatorThreadImpl(bool use_chrome_async_socket, bool try_ssltcp_first); + explicit MediatorThreadImpl(const NotifierOptions& notifier_options); virtual ~MediatorThreadImpl(); virtual void SetDelegate(Delegate* delegate); @@ -124,8 +125,7 @@ class MediatorThreadImpl void OnSubscriptionStateChangeOnParentThread( bool success); - const bool use_chrome_async_socket_; - const bool try_ssltcp_first_; + const NotifierOptions notifier_options_; base::Thread worker_thread_; scoped_refptr<net::HostResolver> host_resolver_; diff --git a/jingle/notifier/listener/talk_mediator_unittest.cc b/jingle/notifier/listener/talk_mediator_unittest.cc index a138052..36bc94b 100644 --- a/jingle/notifier/listener/talk_mediator_unittest.cc +++ b/jingle/notifier/listener/talk_mediator_unittest.cc @@ -6,6 +6,7 @@ #include "base/basictypes.h" #include "base/message_loop.h" +#include "jingle/notifier/base/notifier_options.h" #include "jingle/notifier/listener/mediator_thread_mock.h" #include "jingle/notifier/listener/mediator_thread_impl.h" #include "jingle/notifier/listener/talk_mediator_impl.h" @@ -38,14 +39,13 @@ class TalkMediatorImplTest : public testing::Test { virtual ~TalkMediatorImplTest() {} TalkMediatorImpl* NewTalkMediator() { - const bool kUseChromeAsyncSocket = false; - const bool kTrySslTcpFirst = false; + const notifier::NotifierOptions kNotifierOptions; const bool kInitializeSsl = true; const bool kConnectImmediately = false; const bool kInvalidateXmppAuthToken = false; return new TalkMediatorImpl( - new MediatorThreadImpl(kUseChromeAsyncSocket, kTrySslTcpFirst), - kInitializeSsl, kConnectImmediately, kInvalidateXmppAuthToken); + new MediatorThreadImpl(kNotifierOptions), kInitializeSsl, + kConnectImmediately, kInvalidateXmppAuthToken); } TalkMediatorImpl* NewMockedTalkMediator( |