summaryrefslogtreecommitdiffstats
path: root/jingle
diff options
context:
space:
mode:
authorrsimha@chromium.org <rsimha@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-07 22:28:23 +0000
committerrsimha@chromium.org <rsimha@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-07 22:28:23 +0000
commit4cbf13c20a9e18538515e2a83c2fbfd01659eaad (patch)
tree8a663789a02817f284f4848fca2ecf42faf5f3a7 /jingle
parent90eaf71823e9e5480f7e542421cccbba969044c7 (diff)
downloadchromium_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.gyp3
-rw-r--r--jingle/notifier/base/notification_method.cc52
-rw-r--r--jingle/notifier/base/notification_method.h68
-rw-r--r--jingle/notifier/base/notifier_options.h47
-rw-r--r--jingle/notifier/listener/mediator_thread_impl.cc47
-rw-r--r--jingle/notifier/listener/mediator_thread_impl.h6
-rw-r--r--jingle/notifier/listener/talk_mediator_unittest.cc8
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(