Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / remoting / jingle_glue / chromium_socket_factory_unittest.cc
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 "remoting/jingle_glue/chromium_socket_factory.h"
6
7 #include "base/message_loop/message_loop.h"
8 #include "base/run_loop.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "third_party/libjingle/source/talk/base/asyncpacketsocket.h"
12 #include "third_party/libjingle/source/talk/base/socketaddress.h"
13
14 namespace remoting {
15
16 class ChromiumSocketFactoryTest : public testing::Test,
17                                   public sigslot::has_slots<> {
18  public:
19   virtual void SetUp() OVERRIDE {
20     socket_factory_.reset(new ChromiumPacketSocketFactory());
21
22     socket_.reset(socket_factory_->CreateUdpSocket(
23         talk_base::SocketAddress("127.0.0.1", 0), 0, 0));
24     ASSERT_TRUE(socket_.get() != NULL);
25     EXPECT_EQ(socket_->GetState(), talk_base::AsyncPacketSocket::STATE_BOUND);
26     socket_->SignalReadPacket.connect(
27         this, &ChromiumSocketFactoryTest::OnPacket);
28   }
29
30   void OnPacket(talk_base::AsyncPacketSocket* socket,
31                 const char* data, size_t size,
32                 const talk_base::SocketAddress& address,
33                 const talk_base::PacketTime& packet_time) {
34     EXPECT_EQ(socket, socket_.get());
35     last_packet_.assign(data, data + size);
36     last_address_ = address;
37     run_loop_.Quit();
38   }
39
40  protected:
41   base::MessageLoopForIO message_loop_;
42   base::RunLoop run_loop_;
43
44   scoped_ptr<talk_base::PacketSocketFactory> socket_factory_;
45   scoped_ptr<talk_base::AsyncPacketSocket> socket_;
46
47   std::string last_packet_;
48   talk_base::SocketAddress last_address_;
49 };
50
51 TEST_F(ChromiumSocketFactoryTest, SendAndReceive) {
52   // UDP packets may be lost, so we have to retry sending it more than once.
53   const int kMaxAttempts = 3;
54   const base::TimeDelta kAttemptPeriod = base::TimeDelta::FromSeconds(1);
55
56   scoped_ptr<talk_base::AsyncPacketSocket> sending_socket;
57   talk_base::SocketAddress address;
58
59   sending_socket.reset(socket_factory_->CreateUdpSocket(
60       talk_base::SocketAddress("127.0.0.1", 0), 0, 0));
61   ASSERT_TRUE(sending_socket.get() != NULL);
62   EXPECT_EQ(sending_socket->GetState(),
63             talk_base::AsyncPacketSocket::STATE_BOUND);
64   address = sending_socket->GetLocalAddress();
65
66   std::string test_packet("TEST PACKET");
67   int attempts = 0;
68   talk_base::PacketOptions options;
69   while (last_packet_.empty() && attempts++ < kMaxAttempts) {
70     sending_socket->SendTo(test_packet.data(), test_packet.size(),
71                            socket_->GetLocalAddress(), options);
72     message_loop_.PostDelayedTask(FROM_HERE, run_loop_.QuitClosure(),
73                                   kAttemptPeriod);
74     run_loop_.Run();
75   }
76   EXPECT_EQ(test_packet, last_packet_);
77   EXPECT_EQ(address, last_address_);
78 }
79
80 TEST_F(ChromiumSocketFactoryTest, SetOptions) {
81   EXPECT_EQ(0, socket_->SetOption(talk_base::Socket::OPT_SNDBUF, 4096));
82   EXPECT_EQ(0, socket_->SetOption(talk_base::Socket::OPT_RCVBUF, 4096));
83 }
84
85 TEST_F(ChromiumSocketFactoryTest, PortRange) {
86   const int kMinPort = 12400;
87   const int kMaxPort = 12410;
88   socket_.reset(socket_factory_->CreateUdpSocket(
89       talk_base::SocketAddress("127.0.0.1", 0), kMaxPort, kMaxPort));
90   ASSERT_TRUE(socket_.get() != NULL);
91   EXPECT_EQ(socket_->GetState(), talk_base::AsyncPacketSocket::STATE_BOUND);
92   EXPECT_GE(socket_->GetLocalAddress().port(), kMinPort);
93   EXPECT_LE(socket_->GetLocalAddress().port(), kMaxPort);
94 }
95
96 }  // namespace remoting