diff options
-rw-r--r-- | chrome/chrome_tests.gypi | 2 | ||||
-rw-r--r-- | content/content_renderer.gypi | 2 | ||||
-rw-r--r-- | content/renderer/p2p/ipc_network_manager.h | 6 | ||||
-rw-r--r-- | content/renderer/p2p/p2p_transport_impl.cc | 161 | ||||
-rw-r--r-- | content/renderer/p2p/p2p_transport_impl.h | 77 | ||||
-rw-r--r-- | content/renderer/p2p/p2p_transport_impl_unittest.cc | 304 | ||||
-rw-r--r-- | jingle/glue/fake_network_manager.cc | 31 | ||||
-rw-r--r-- | jingle/glue/fake_network_manager.h | 34 | ||||
-rw-r--r-- | jingle/glue/thread_wrapper.cc | 23 | ||||
-rw-r--r-- | jingle/glue/thread_wrapper.h | 4 | ||||
-rw-r--r-- | jingle/glue/thread_wrapper_unittest.cc | 31 | ||||
-rw-r--r-- | jingle/jingle.gyp | 2 | ||||
-rw-r--r-- | tools/valgrind/gtest_exclude/unit_tests.gtest.txt | 7 | ||||
-rw-r--r-- | webkit/glue/p2p_transport.h | 25 |
14 files changed, 31 insertions, 678 deletions
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 7f20398..21d8cd6 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1154,7 +1154,6 @@ '../content/content.gyp:content_gpu', '../gpu/gpu.gyp:gpu_unittest_utils', '../ipc/ipc.gyp:ipc', - '../jingle/jingle.gyp:jingle_glue_test_util', '../media/media.gyp:media_test_support', '../net/net.gyp:net_resources', '../net/net.gyp:net_test_support', @@ -1900,7 +1899,6 @@ '../content/renderer/audio_message_filter_unittest.cc', '../content/renderer/gpu_video_decoder_host_unittest.cc', '../content/renderer/media/audio_renderer_impl_unittest.cc', - '../content/renderer/p2p/p2p_transport_impl_unittest.cc', '../content/renderer/paint_aggregator_unittest.cc', '../content/renderer/render_widget_unittest.cc', '../testing/gtest_mac_unittest.mm', diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi index 4f773c6..3a8b5d5 100644 --- a/content/content_renderer.gypi +++ b/content/content_renderer.gypi @@ -63,8 +63,6 @@ 'renderer/p2p/ipc_network_manager.h', 'renderer/p2p/ipc_socket_factory.cc', 'renderer/p2p/ipc_socket_factory.h', - 'renderer/p2p/p2p_transport_impl.cc', - 'renderer/p2p/p2p_transport_impl.h', 'renderer/p2p/socket_client.cc', 'renderer/p2p/socket_client.h', 'renderer/p2p/socket_dispatcher.cc', diff --git a/content/renderer/p2p/ipc_network_manager.h b/content/renderer/p2p/ipc_network_manager.h index a22cb81..9a1bbcb 100644 --- a/content/renderer/p2p/ipc_network_manager.h +++ b/content/renderer/p2p/ipc_network_manager.h @@ -22,9 +22,9 @@ class IpcNetworkManager : public talk_base::NetworkManager { protected: // Fills the supplied list with all usable networks. - virtual bool EnumNetworks( - bool include_ignored, - std::vector<talk_base::Network*>* networks) OVERRIDE; + virtual bool EnumNetworks(bool include_ignored, + std::vector<talk_base::Network*>* networks) + OVERRIDE; P2PSocketDispatcher* socket_dispatcher_; }; diff --git a/content/renderer/p2p/p2p_transport_impl.cc b/content/renderer/p2p/p2p_transport_impl.cc deleted file mode 100644 index d5f2afe..0000000 --- a/content/renderer/p2p/p2p_transport_impl.cc +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) 2011 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 "content/renderer/p2p/p2p_transport_impl.h" - -#include "base/values.h" -#include "content/renderer/p2p/ipc_network_manager.h" -#include "content/renderer/p2p/ipc_socket_factory.h" -#include "content/renderer/render_view.h" -#include "chrome/common/json_value_serializer.h" -#include "jingle/glue/channel_socket_adapter.h" -#include "jingle/glue/thread_wrapper.h" -#include "third_party/libjingle/source/talk/p2p/base/p2ptransportchannel.h" -#include "third_party/libjingle/source/talk/p2p/client/basicportallocator.h" - -P2PTransportImpl::P2PTransportImpl( - talk_base::NetworkManager* network_manager, - talk_base::PacketSocketFactory* socket_factory) - : event_handler_(NULL), - state_(STATE_NONE), - network_manager_(network_manager), - socket_factory_(socket_factory) { -} - -P2PTransportImpl::~P2PTransportImpl() { -} - -bool P2PTransportImpl::Init(const std::string& name, const std::string& config, - EventHandler* event_handler) { - DCHECK(event_handler); - - // Before proceeding, ensure we have libjingle thread wrapper for - // the current thread. - jingle_glue::JingleThreadWrapper::EnsureForCurrentThread(); - - name_ = name; - event_handler_ = event_handler; - - // TODO(sergeyu): Implement PortAllocator that can parse |config| - // and use it here instead of BasicPortAllocator. - allocator_.reset(new cricket::BasicPortAllocator( - network_manager_, socket_factory_)); - - channel_.reset(new cricket::P2PTransportChannel( - name, "", NULL, allocator_.get())); - channel_->SignalRequestSignaling.connect( - this, &P2PTransportImpl::OnRequestSignaling); - channel_->SignalWritableState.connect( - this, &P2PTransportImpl::OnReadableState); - channel_->SignalWritableState.connect( - this, &P2PTransportImpl::OnWriteableState); - channel_->SignalCandidateReady.connect( - this, &P2PTransportImpl::OnCandidateReady); - - channel_adapter_.reset(new jingle_glue::TransportChannelSocketAdapter( - channel_.get())); - - channel_->Connect(); - - return true; -} - -bool P2PTransportImpl::AddRemoteCandidate(const std::string& address) { - cricket::Candidate candidate; - if (!DeserializeCandidate(address, &candidate)) { - return false; - } - - channel_->OnCandidate(candidate); - return true; -} - -void P2PTransportImpl::OnRequestSignaling() { - channel_->OnSignalingReady(); -} - -void P2PTransportImpl::OnCandidateReady( - cricket::TransportChannelImpl* channel, - const cricket::Candidate& candidate) { - event_handler_->OnCandidateReady(SerializeCandidate(candidate)); -} - -void P2PTransportImpl::OnReadableState(cricket::TransportChannel* channel) { - state_ = static_cast<State>(state_ | STATE_READABLE); - event_handler_->OnStateChange(state_); -} - -void P2PTransportImpl::OnWriteableState(cricket::TransportChannel* channel) { - state_ = static_cast<State>(state_ | STATE_WRITABLE); - event_handler_->OnStateChange(state_); -} - -std::string P2PTransportImpl::SerializeCandidate( - const cricket::Candidate& candidate) { - - // TODO(sergeyu): Use SDP to format candidates? - DictionaryValue value; - value.SetString("name", candidate.name()); - value.SetString("ip", candidate.address().IPAsString()); - value.SetInteger("port", candidate.address().port()); - value.SetString("type", candidate.type()); - value.SetString("protocol", candidate.protocol()); - value.SetString("username", candidate.username()); - value.SetString("password", candidate.password()); - value.SetDouble("preference", candidate.preference()); - value.SetInteger("generation", candidate.generation()); - - std::string result; - JSONStringValueSerializer serializer(&result); - serializer.Serialize(value); - return result; -} - -bool P2PTransportImpl::DeserializeCandidate(const std::string& address, - cricket::Candidate* candidate) { - JSONStringValueSerializer deserializer(address); - scoped_ptr<Value> value(deserializer.Deserialize(NULL, NULL)); - if (!value.get() || !value->IsType(Value::TYPE_DICTIONARY)) { - return false; - } - - DictionaryValue* dic_value = static_cast<DictionaryValue*>(value.get()); - - std::string name; - std::string ip; - int port; - std::string type; - std::string protocol; - std::string username; - std::string password; - double preference; - int generation; - - if (!dic_value->GetString("name", &name) || - !dic_value->GetString("ip", &ip) || - !dic_value->GetInteger("port", &port) || - !dic_value->GetString("type", &type) || - !dic_value->GetString("protocol", &protocol) || - !dic_value->GetString("username", &username) || - !dic_value->GetString("password", &password) || - !dic_value->GetDouble("preference", &preference) || - !dic_value->GetInteger("generation", &generation)) { - return false; - } - - candidate->set_name(name); - candidate->set_address(talk_base::SocketAddress(ip, port)); - candidate->set_type(type); - candidate->set_protocol(protocol); - candidate->set_username(username); - candidate->set_password(password); - candidate->set_preference(static_cast<float>(preference)); - candidate->set_generation(generation); - - return true; -} - -net::Socket* P2PTransportImpl::GetChannel() { - return channel_adapter_.get(); -} diff --git a/content/renderer/p2p/p2p_transport_impl.h b/content/renderer/p2p/p2p_transport_impl.h deleted file mode 100644 index d473614..0000000 --- a/content/renderer/p2p/p2p_transport_impl.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2011 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 CONTENT_RENDERER_P2P_P2P_TRANSPORT_IMPL_H_ -#define CONTENT_RENDERER_P2P_P2P_TRANSPORT_IMPL_H_ - -#include "base/basictypes.h" -#include "base/scoped_ptr.h" -#include "third_party/libjingle/source/talk/base/sigslot.h" -#include "webkit/glue/p2p_transport.h" - -class RenderView; - -namespace cricket { -class Candidate; -class PortAllocator; -class P2PTransportChannel; -class TransportChannel; -class TransportChannelImpl; -} // namespace cricket - -namespace jingle_glue { -class TransportChannelSocketAdapter; -} // namespace jingle_glue - -namespace talk_base { -class NetworkManager; -class PacketSocketFactory; -} // namespace talk_base - -class P2PTransportImpl : public webkit_glue::P2PTransport, - public sigslot::has_slots<> { - public: - // Create P2PTransportImpl using specified NetworkManager and - // PacketSocketFactory. Caller keeps ownership of |network_manager| - // and |socket_factory|. - P2PTransportImpl(talk_base::NetworkManager* network_manager, - talk_base::PacketSocketFactory* socket_factory); - - virtual ~P2PTransportImpl(); - - // webkit_glue::P2PTransport interface. - virtual bool Init(const std::string& name, const std::string& config, - EventHandler* event_handler) OVERRIDE; - virtual bool AddRemoteCandidate(const std::string& address) OVERRIDE; - virtual net::Socket* GetChannel() OVERRIDE; - - private: - class ChannelAdapter; - - void OnRequestSignaling(); - void OnCandidateReady(cricket::TransportChannelImpl* channel, - const cricket::Candidate& candidate); - void OnReadableState(cricket::TransportChannel* channel); - void OnWriteableState(cricket::TransportChannel* channel); - - std::string SerializeCandidate(const cricket::Candidate& candidate); - bool DeserializeCandidate(const std::string& address, - cricket::Candidate* candidate); - - std::string name_; - EventHandler* event_handler_; - State state_; - - talk_base::NetworkManager* network_manager_; - talk_base::PacketSocketFactory* socket_factory_; - - scoped_ptr<cricket::PortAllocator> allocator_; - scoped_ptr<cricket::P2PTransportChannel> channel_; - - scoped_ptr<jingle_glue::TransportChannelSocketAdapter> channel_adapter_; - - DISALLOW_COPY_AND_ASSIGN(P2PTransportImpl); -}; - -#endif // CONTENT_RENDERER_P2P_P2P_TRANSPORT_IMPL_H_ diff --git a/content/renderer/p2p/p2p_transport_impl_unittest.cc b/content/renderer/p2p/p2p_transport_impl_unittest.cc deleted file mode 100644 index fc87fb6..0000000 --- a/content/renderer/p2p/p2p_transport_impl_unittest.cc +++ /dev/null @@ -1,304 +0,0 @@ -// Copyright (c) 2011 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 "base/compiler_specific.h" -#include "base/memory/ref_counted.h" -#include "base/message_loop.h" -#include "base/test/test_timeouts.h" -#include "content/renderer/p2p/p2p_transport_impl.h" -#include "jingle/glue/fake_network_manager.h" -#include "jingle/glue/fake_socket_factory.h" -#include "jingle/glue/thread_wrapper.h" -#include "net/base/completion_callback.h" -#include "net/base/io_buffer.h" -#include "net/base/net_errors.h" -#include "net/base/net_util.h" -#include "net/socket/socket.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -using testing::_; -using testing::AtMost; -using testing::Exactly; -using testing::Invoke; - -using webkit_glue::P2PTransport; - -namespace { -const char kTestAddress1[] = "192.168.15.12"; -const char kTestAddress2[] = "192.168.15.33"; - -const char kTransportName1[] = "tr1"; -const char kTransportName2[] = "tr2"; - -const char kTestConfig[] = ""; - -// Send 10 packets 10 bytes each. Packets are sent with 10ms delay -// between packets (about 100 ms for 10 messages). -const int kMessageSize = 10; -const int kMessages = 10; -const int kUdpWriteDelayMs = 10; - -class ChannelTester : public base::RefCountedThreadSafe<ChannelTester> { - public: - ChannelTester(MessageLoop* message_loop, - net::Socket* write_socket, - net::Socket* read_socket) - : message_loop_(message_loop), - write_socket_(write_socket), - read_socket_(read_socket), - done_(false), - ALLOW_THIS_IN_INITIALIZER_LIST( - write_cb_(this, &ChannelTester::OnWritten)), - ALLOW_THIS_IN_INITIALIZER_LIST( - read_cb_(this, &ChannelTester::OnRead)), - write_errors_(0), - read_errors_(0), - packets_sent_(0), - packets_received_(0), - broken_packets_(0) { - } - - virtual ~ChannelTester() { } - - void Start() { - message_loop_->PostTask( - FROM_HERE, NewRunnableMethod(this, &ChannelTester::DoStart)); - } - - void CheckResults() { - EXPECT_EQ(0, write_errors_); - EXPECT_EQ(0, read_errors_); - - EXPECT_EQ(0, broken_packets_); - - // Verify that we've received at least one packet. - EXPECT_GT(packets_received_, 0); - LOG(INFO) << "Received " << packets_received_ << " packets out of " - << kMessages; - } - - protected: - void Done() { - done_ = true; - message_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask()); - } - - void DoStart() { - DoRead(); - DoWrite(); - } - - void DoWrite() { - if (packets_sent_ >= kMessages) { - Done(); - return; - } - - scoped_refptr<net::IOBuffer> packet(new net::IOBuffer(kMessageSize)); - memset(packet->data(), 123, kMessageSize); - sent_packets_[packets_sent_] = packet; - // Put index of this packet in the beginning of the packet body. - memcpy(packet->data(), &packets_sent_, sizeof(packets_sent_)); - - int result = write_socket_->Write(packet, kMessageSize, &write_cb_); - HandleWriteResult(result); - } - - void OnWritten(int result) { - HandleWriteResult(result); - } - - void HandleWriteResult(int result) { - if (result <= 0 && result != net::ERR_IO_PENDING) { - LOG(ERROR) << "Received error " << result << " when trying to write"; - write_errors_++; - Done(); - } else if (result > 0) { - EXPECT_EQ(kMessageSize, result); - packets_sent_++; - message_loop_->PostDelayedTask( - FROM_HERE, NewRunnableMethod(this, &ChannelTester::DoWrite), - kUdpWriteDelayMs); - } - } - - void DoRead() { - int result = 1; - while (result > 0) { - int kReadSize = kMessageSize * 2; - read_buffer_ = new net::IOBuffer(kReadSize); - - result = read_socket_->Read(read_buffer_, kReadSize, &read_cb_); - HandleReadResult(result); - }; - } - - void OnRead(int result) { - HandleReadResult(result); - DoRead(); - } - - void HandleReadResult(int result) { - if (result <= 0 && result != net::ERR_IO_PENDING) { - // Error will be received after the socket is closed. - if (!done_) { - LOG(ERROR) << "Received error " << result << " when trying to read"; - read_errors_++; - Done(); - } - } else if (result > 0) { - packets_received_++; - if (kMessageSize != result) { - // Invalid packet size; - broken_packets_++; - } else { - // Validate packet body. - int packet_id; - memcpy(&packet_id, read_buffer_->data(), sizeof(packet_id)); - if (packet_id < 0 || packet_id >= kMessages) { - broken_packets_++; - } else { - if (memcmp(read_buffer_->data(), sent_packets_[packet_id]->data(), - kMessageSize) != 0) - broken_packets_++; - } - } - } - } - - private: - MessageLoop* message_loop_; - net::Socket* write_socket_; - net::Socket* read_socket_; - bool done_; - - scoped_refptr<net::IOBuffer> sent_packets_[kMessages]; - scoped_refptr<net::IOBuffer> read_buffer_; - - net::CompletionCallbackImpl<ChannelTester> write_cb_; - net::CompletionCallbackImpl<ChannelTester> read_cb_; - int write_errors_; - int read_errors_; - int packets_sent_; - int packets_received_; - int broken_packets_; -}; - -} // namespace - -class MockP2PEventHandler : public P2PTransport::EventHandler { - public: - MOCK_METHOD1(OnCandidateReady, void(const std::string& address)); - MOCK_METHOD1(OnStateChange, void(P2PTransport::State state)); -}; - -class P2PTransportImplTest : public testing::Test { - public: - - protected: - void SetUp() OVERRIDE { - socket_manager_ = new jingle_glue::FakeSocketManager(); - - net::IPAddressNumber ip; - ASSERT(net::ParseIPLiteralToNumber(kTestAddress1, &ip)); - network_manager1_.reset(new jingle_glue::FakeNetworkManager(ip)); - socket_factory1_.reset( - new jingle_glue::FakeSocketFactory(socket_manager_, ip)); - transport1_.reset(new P2PTransportImpl(network_manager1_.get(), - socket_factory1_.get())); - - ASSERT(net::ParseIPLiteralToNumber(kTestAddress2, &ip)); - network_manager2_.reset(new jingle_glue::FakeNetworkManager(ip)); - socket_factory2_.reset( - new jingle_glue::FakeSocketFactory(socket_manager_, ip)); - transport2_.reset(new P2PTransportImpl(network_manager2_.get(), - socket_factory2_.get())); - } - - MessageLoop message_loop_; - - scoped_ptr<jingle_glue::FakeNetworkManager> network_manager1_; - scoped_ptr<jingle_glue::FakeNetworkManager> network_manager2_; - scoped_refptr<jingle_glue::FakeSocketManager> socket_manager_; - scoped_ptr<jingle_glue::FakeSocketFactory> socket_factory1_; - scoped_ptr<jingle_glue::FakeSocketFactory> socket_factory2_; - - scoped_ptr<P2PTransportImpl> transport1_; - MockP2PEventHandler event_handler1_; - scoped_ptr<P2PTransportImpl> transport2_; - MockP2PEventHandler event_handler2_; -}; - -TEST_F(P2PTransportImplTest, Create) { - ASSERT_TRUE(transport1_->Init( - kTransportName1, kTestConfig, &event_handler1_)); - ASSERT_TRUE(transport2_->Init( - kTransportName2, kTestConfig, &event_handler2_)); - - EXPECT_CALL(event_handler1_, OnCandidateReady(_)); - EXPECT_CALL(event_handler2_, OnCandidateReady(_)); - - message_loop_.RunAllPending(); -} - -ACTION_P(AddRemoteCandidate, transport) { - EXPECT_TRUE(transport->AddRemoteCandidate(arg0)); -} - -TEST_F(P2PTransportImplTest, Connect) { - ASSERT_TRUE(transport1_->Init( - kTransportName1, kTestConfig, &event_handler1_)); - ASSERT_TRUE(transport2_->Init( - kTransportName2, kTestConfig, &event_handler2_)); - - EXPECT_CALL(event_handler1_, OnCandidateReady(_)).WillRepeatedly( - AddRemoteCandidate(transport2_.get())); - EXPECT_CALL(event_handler2_, OnCandidateReady(_)).WillRepeatedly( - AddRemoteCandidate(transport1_.get())); - - message_loop_.RunAllPending(); -} - -TEST_F(P2PTransportImplTest, SendData) { - ASSERT_TRUE(transport1_->Init( - kTransportName1, kTestConfig, &event_handler1_)); - ASSERT_TRUE(transport2_->Init( - kTransportName2, kTestConfig, &event_handler2_)); - - EXPECT_CALL(event_handler1_, OnCandidateReady(_)).WillRepeatedly( - AddRemoteCandidate(transport2_.get())); - EXPECT_CALL(event_handler2_, OnCandidateReady(_)).WillRepeatedly( - AddRemoteCandidate(transport1_.get())); - - // Transport may first become ether readable or writable, but - // eventually it must be readable and writable. - EXPECT_CALL(event_handler1_, OnStateChange(P2PTransport::STATE_READABLE)) - .Times(AtMost(1)); - EXPECT_CALL(event_handler1_, OnStateChange(P2PTransport::STATE_WRITABLE)) - .Times(AtMost(1)); - EXPECT_CALL(event_handler1_, OnStateChange( - static_cast<P2PTransport::State>(P2PTransport::STATE_READABLE | - P2PTransport::STATE_WRITABLE))) - .Times(Exactly(1)); - - EXPECT_CALL(event_handler2_, OnStateChange(P2PTransport::STATE_READABLE)) - .Times(AtMost(1)); - EXPECT_CALL(event_handler2_, OnStateChange(P2PTransport::STATE_WRITABLE)) - .Times(AtMost(1)); - EXPECT_CALL(event_handler2_, OnStateChange( - static_cast<P2PTransport::State>(P2PTransport::STATE_READABLE | - P2PTransport::STATE_WRITABLE))) - .Times(Exactly(1)); - - scoped_refptr<ChannelTester> channel_tester = new ChannelTester( - &message_loop_, transport1_->GetChannel(), transport2_->GetChannel()); - - message_loop_.PostDelayedTask(FROM_HERE, new MessageLoop::QuitTask(), - TestTimeouts::action_max_timeout_ms()); - - channel_tester->Start(); - message_loop_.Run(); - channel_tester->CheckResults(); -} diff --git a/jingle/glue/fake_network_manager.cc b/jingle/glue/fake_network_manager.cc deleted file mode 100644 index f37208d..0000000 --- a/jingle/glue/fake_network_manager.cc +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2011 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/glue/fake_network_manager.h" - -#include "base/logging.h" -#include "net/base/ip_endpoint.h" -#include "jingle/glue/utils.h" -#include "third_party/libjingle/source/talk/base/socketaddress.h" - -namespace jingle_glue { - -FakeNetworkManager::FakeNetworkManager(const net::IPAddressNumber& address) - : address_(address) { -} - -FakeNetworkManager::~FakeNetworkManager() { -} - -bool FakeNetworkManager::EnumNetworks( - bool include_ignored, std::vector<talk_base::Network*>* networks) { - net::IPEndPoint endpoint(address_, 0); - talk_base::SocketAddress address; - CHECK(IPEndPointToSocketAddress(endpoint, &address)); - networks->push_back(new talk_base::Network( - "fake", "Fake Network", address.ip(), 0)); - return true; -} - -} // namespace jingle_glue diff --git a/jingle/glue/fake_network_manager.h b/jingle/glue/fake_network_manager.h deleted file mode 100644 index f099c3c..0000000 --- a/jingle/glue/fake_network_manager.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2011 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_GLUE_FAKE_NETWORK_MANAGER_H_ -#define JINGLE_GLUE_FAKE_NETWORK_MANAGER_H_ - -#include <vector> - -#include "base/compiler_specific.h" -#include "net/base/net_util.h" -#include "third_party/libjingle/source/talk/base/network.h" - -namespace jingle_glue { - -// FakeNetworkManager always returns one interface with the IP address -// specified in the constructor. -class FakeNetworkManager : public talk_base::NetworkManager { - public: - FakeNetworkManager(const net::IPAddressNumber& address); - virtual ~FakeNetworkManager(); - - protected: - // Override from talk_base::NetworkManager. - virtual bool EnumNetworks( - bool include_ignored, - std::vector<talk_base::Network*>* networks) OVERRIDE; - - net::IPAddressNumber address_; -}; - -} // namespace jingle_glue - -#endif // JINGLE_GLUE_FAKE_NETWORK_MANAGER_H_ diff --git a/jingle/glue/thread_wrapper.cc b/jingle/glue/thread_wrapper.cc index fe26094..f4551de 100644 --- a/jingle/glue/thread_wrapper.cc +++ b/jingle/glue/thread_wrapper.cc @@ -6,25 +6,6 @@ namespace jingle_glue { -// static -void JingleThreadWrapper::EnsureForCurrentThread() { - talk_base::Thread* current_thread = talk_base::Thread::Current(); - // If JingleThreadWrapper already exists for the current thread then - // it is returned by talk_base::Thread::Current(). - // talk_base::Thread::Current() may also return non-null value for - // the main thread because talk_base::ThreadManager creates - // talk_base::Thread object for it. IsOwned() allows to distinguish - // talk_base::Thread object created by talk_base::ThreadManager from - // other talk_base::Thread objects. Because talk_base::Thread - // objects should never created by chromium code, we can assume that - // if talk_base::Thread::Current() returns non-null value and it - // isn't the object created by talk_base::ThreadManager then - // JingleThreadWrapper already exists for the current thread. - if (current_thread == NULL || !current_thread->IsOwned()) { - new JingleThreadWrapper(MessageLoop::current()); - } -} - JingleThreadWrapper::JingleThreadWrapper(MessageLoop* message_loop) : message_loop_(message_loop) { DCHECK_EQ(message_loop_, MessageLoop::current()); @@ -114,8 +95,10 @@ void JingleThreadWrapper::RunTask(int task_id) { } } - if (have_message) + if (have_message) { message.phandler->OnMessage(&message); + delete message.pdata; + } } // All methods below are marked as not reached. See comments in the diff --git a/jingle/glue/thread_wrapper.h b/jingle/glue/thread_wrapper.h index 5b5cf08..755d047 100644 --- a/jingle/glue/thread_wrapper.h +++ b/jingle/glue/thread_wrapper.h @@ -24,10 +24,6 @@ class JingleThreadWrapper : public MessageLoop::DestructionObserver, public talk_base::Thread { public: - // Create JingleThreadWrapper for the current thread if it hasn't - // been created yet. - static void EnsureForCurrentThread(); - JingleThreadWrapper(MessageLoop* message_loop); // MessageLoop::DestructionObserver implementation. diff --git a/jingle/glue/thread_wrapper_unittest.cc b/jingle/glue/thread_wrapper_unittest.cc index 18f8bb4..1c8943a 100644 --- a/jingle/glue/thread_wrapper_unittest.cc +++ b/jingle/glue/thread_wrapper_unittest.cc @@ -49,8 +49,7 @@ TEST_F(ThreadWrapperTest, Create) { EXPECT_EQ(thread(), static_cast<talk_base::Thread*>(wrapper_)); } -MATCHER_P3(MatchMessageAndDeleteData, handler, message_id, data, "") { - delete arg->pdata; +MATCHER_P3(MatchMessage, handler, message_id, data, "") { return arg->phandler == handler && arg->message_id == message_id && arg->pdata == data; @@ -70,13 +69,13 @@ TEST_F(ThreadWrapperTest, Post) { InSequence in_seq; EXPECT_CALL(handler1_, OnMessage( - MatchMessageAndDeleteData(&handler1_, kTestMessage1, data1_))); + MatchMessage(&handler1_, kTestMessage1, data1_))); EXPECT_CALL(handler1_, OnMessage( - MatchMessageAndDeleteData(&handler1_, kTestMessage2, data2_))); + MatchMessage(&handler1_, kTestMessage2, data2_))); EXPECT_CALL(handler2_, OnMessage( - MatchMessageAndDeleteData(&handler2_, kTestMessage1, data3_))); + MatchMessage(&handler2_, kTestMessage1, data3_))); EXPECT_CALL(handler2_, OnMessage( - MatchMessageAndDeleteData(&handler2_, kTestMessage1, data4_))); + MatchMessage(&handler2_, kTestMessage1, data4_))); message_loop_.RunAllPending(); } @@ -97,13 +96,13 @@ TEST_F(ThreadWrapperTest, PostDelayed) { InSequence in_seq; EXPECT_CALL(handler1_, OnMessage( - MatchMessageAndDeleteData(&handler1_, kTestMessage1, data1_))); + MatchMessage(&handler1_, kTestMessage1, data1_))); EXPECT_CALL(handler1_, OnMessage( - MatchMessageAndDeleteData(&handler1_, kTestMessage2, data2_))); + MatchMessage(&handler1_, kTestMessage2, data2_))); EXPECT_CALL(handler2_, OnMessage( - MatchMessageAndDeleteData(&handler2_, kTestMessage1, data3_))); + MatchMessage(&handler2_, kTestMessage1, data3_))); EXPECT_CALL(handler2_, OnMessage( - MatchMessageAndDeleteData(&handler2_, kTestMessage1, data4_))); + MatchMessage(&handler2_, kTestMessage1, data4_))); message_loop_.PostDelayedTask(FROM_HERE, new MessageLoop::QuitTask(), kMaxTestDelay); @@ -122,11 +121,11 @@ TEST_F(ThreadWrapperTest, Clear) { talk_base::MessageData* null_data = NULL; EXPECT_CALL(handler1_, OnMessage( - MatchMessageAndDeleteData(&handler1_, kTestMessage1, null_data))); + MatchMessage(&handler1_, kTestMessage1, null_data))); EXPECT_CALL(handler2_, OnMessage( - MatchMessageAndDeleteData(&handler2_, kTestMessage1, null_data))); + MatchMessage(&handler2_, kTestMessage1, null_data))); EXPECT_CALL(handler2_, OnMessage( - MatchMessageAndDeleteData(&handler2_, kTestMessage2, null_data))); + MatchMessage(&handler2_, kTestMessage2, null_data))); message_loop_.RunAllPending(); } @@ -145,11 +144,11 @@ TEST_F(ThreadWrapperTest, ClearDelayed) { talk_base::MessageData* null_data = NULL; EXPECT_CALL(handler1_, OnMessage( - MatchMessageAndDeleteData(&handler1_, kTestMessage1, null_data))); + MatchMessage(&handler1_, kTestMessage1, null_data))); EXPECT_CALL(handler2_, OnMessage( - MatchMessageAndDeleteData(&handler2_, kTestMessage1, null_data))); + MatchMessage(&handler2_, kTestMessage1, null_data))); EXPECT_CALL(handler2_, OnMessage( - MatchMessageAndDeleteData(&handler2_, kTestMessage1, null_data))); + MatchMessage(&handler2_, kTestMessage1, null_data))); message_loop_.PostDelayedTask(FROM_HERE, new MessageLoop::QuitTask(), kMaxTestDelay); diff --git a/jingle/jingle.gyp b/jingle/jingle.gyp index fece532..29c6c82 100644 --- a/jingle/jingle.gyp +++ b/jingle/jingle.gyp @@ -128,8 +128,6 @@ 'target_name': 'jingle_glue_test_util', 'type': '<(library)', 'sources': [ - 'glue/fake_network_manager.cc', - 'glue/fake_network_manager.h', 'glue/fake_socket_factory.cc', 'glue/fake_socket_factory.h', ], diff --git a/tools/valgrind/gtest_exclude/unit_tests.gtest.txt b/tools/valgrind/gtest_exclude/unit_tests.gtest.txt index 9328143..cd41df9 100644 --- a/tools/valgrind/gtest_exclude/unit_tests.gtest.txt +++ b/tools/valgrind/gtest_exclude/unit_tests.gtest.txt @@ -8,10 +8,3 @@ RenderViewTest.ImeComposition PredictorTest.MassiveConcurrentLookupTest # Pure virtual method called: see http://crbug.com/50950 ConnectionTesterTest.RunAllTests - -# Following two tests fail under valgrind because libjingle has hardcoded -# timeouts for P2P connections, and it makes these tests fail under valgrind. -# TODO(sergeyu): Remove hardcoded timeouts from libjingle. -P2PTransportImplTest.Create -P2PTransportImplTest.Connect -P2PTransportImplTest.SendData diff --git a/webkit/glue/p2p_transport.h b/webkit/glue/p2p_transport.h index e80ffb5..5cd30c5 100644 --- a/webkit/glue/p2p_transport.h +++ b/webkit/glue/p2p_transport.h @@ -7,10 +7,6 @@ #include <string> -namespace net { -class Socket; -} // namespace net - namespace webkit_glue { // Interface for P2P transport. @@ -31,24 +27,23 @@ class P2PTransport { // Called when readable of writable state of the stream changes. virtual void OnStateChange(State state) = 0; + + // Called when a message received from the peer. P2PTransport keeps + // owneship of |data|. + virtual void OnMessageReceived(const char* data, size_t data_size) = 0; }; virtual ~P2PTransport() {} - // Initialize transport using specified configuration. Returns true - // if initialization succeeded. - virtual bool Init(const std::string& name, - const std::string& config, + // Initialize transport using specified configuration. + virtual void Init(const std::string& config, EventHandler* event_handler) = 0; - // Add candidate received from the remote peer. Returns false if the - // provided address is not in a valid format. - virtual bool AddRemoteCandidate(const std::string& address) = 0; + // Add candidate received from the remote peer. + virtual void AddRemoteCandidate(const std::string& address) = 0; - // Returns socket interface that can be used to send/receive - // data. Returned object is owned by the transport. Pending calls on - // the socket are canceled when the transport is destroyed. - virtual net::Socket* GetChannel() = 0; + // Send data to the other end. Caller keeps ownership of |data|. + virtual void Send(const char* data, int data_size) = 0; }; } // namespace webkit_glue |