337cc64cd082bef7ba0414ac9c796a7da346e32c
[platform/framework/web/crosswalk.git] / src / net / tools / quic / test_tools / server_thread.cc
1 // Copyright 2013 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 "net/tools/quic/test_tools/server_thread.h"
6
7 #include "net/tools/quic/test_tools/quic_server_peer.h"
8
9 namespace net {
10 namespace tools {
11 namespace test {
12
13 ServerThread::ServerThread(QuicServer* server,
14                            IPEndPoint address,
15                            bool strike_register_no_startup_period)
16     : SimpleThread("server_thread"),
17       confirmed_(true, false),
18       pause_(true, false),
19       paused_(true, false),
20       resume_(true, false),
21       quit_(true, false),
22       server_(server),
23       address_(address),
24       port_(0),
25       initialized_(false) {
26   if (strike_register_no_startup_period) {
27     server_->SetStrikeRegisterNoStartupPeriod();
28   }
29 }
30
31 ServerThread::~ServerThread() {}
32
33 void ServerThread::Initialize() {
34   if (initialized_) {
35     return;
36   }
37
38   server_->Listen(address_);
39
40   port_lock_.Acquire();
41   port_ = server_->port();
42   port_lock_.Release();
43
44   initialized_ = true;
45 }
46
47 void ServerThread::Run() {
48   if (!initialized_) {
49     Initialize();
50   }
51
52   while (!quit_.IsSignaled()) {
53     if (pause_.IsSignaled() && !resume_.IsSignaled()) {
54       paused_.Signal();
55       resume_.Wait();
56     }
57     server_->WaitForEvents();
58     MaybeNotifyOfHandshakeConfirmation();
59   }
60
61   server_->Shutdown();
62 }
63
64 int ServerThread::GetPort() {
65   port_lock_.Acquire();
66   int rc = port_;
67   port_lock_.Release();
68   return rc;
69 }
70
71 void ServerThread::WaitForCryptoHandshakeConfirmed() {
72   confirmed_.Wait();
73 }
74
75 void ServerThread::Pause() {
76   DCHECK(!pause_.IsSignaled());
77   pause_.Signal();
78   paused_.Wait();
79 }
80
81 void ServerThread::Resume() {
82   DCHECK(!resume_.IsSignaled());
83   DCHECK(pause_.IsSignaled());
84   resume_.Signal();
85 }
86
87 void ServerThread::Quit() {
88   if (pause_.IsSignaled() && !resume_.IsSignaled()) {
89     resume_.Signal();
90   }
91   quit_.Signal();
92 }
93
94 void ServerThread::MaybeNotifyOfHandshakeConfirmation() {
95   if (confirmed_.IsSignaled()) {
96     // Only notify once.
97     return;
98   }
99   QuicDispatcher* dispatcher = QuicServerPeer::GetDispatcher(server());
100   if (dispatcher->session_map().empty()) {
101     // Wait for a session to be created.
102     return;
103   }
104   QuicSession* session = dispatcher->session_map().begin()->second;
105   if (session->IsCryptoHandshakeConfirmed()) {
106     confirmed_.Signal();
107   }
108 }
109
110 }  // namespace test
111 }  // namespace tools
112 }  // namespace net