Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / local_discovery / privet_url_fetcher_unittest.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 "chrome/browser/local_discovery/privet_url_fetcher.h"
6 #include "net/url_request/test_url_fetcher_factory.h"
7 #include "net/url_request/url_request_test_util.h"
8 #include "testing/gmock/include/gmock/gmock.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 using testing::StrictMock;
12
13 namespace local_discovery {
14
15 namespace {
16
17 const char kSamplePrivetURL[] =
18     "http://10.0.0.8:7676/privet/register?action=start";
19 const char kSamplePrivetToken[] = "MyToken";
20 const char kEmptyPrivetToken[] = "\"\"";
21
22 const char kSampleParsableJSON[] = "{ \"hello\" : 2 }";
23 const char kSampleUnparsableJSON[] = "{ \"hello\" : }";
24 const char kSampleJSONWithError[] = "{ \"error\" : \"unittest_example\" }";
25
26 class MockPrivetURLFetcherDelegate : public PrivetURLFetcher::Delegate {
27  public:
28   MockPrivetURLFetcherDelegate() : raw_mode_(false) {
29   }
30
31   virtual ~MockPrivetURLFetcherDelegate() {
32   }
33
34   virtual void OnError(PrivetURLFetcher* fetcher,
35                        PrivetURLFetcher::ErrorType error) OVERRIDE {
36     OnErrorInternal(error);
37   }
38
39   MOCK_METHOD1(OnErrorInternal, void(PrivetURLFetcher::ErrorType error));
40
41   virtual void OnParsedJson(PrivetURLFetcher* fetcher,
42                             const base::DictionaryValue* value,
43                             bool has_error) OVERRIDE {
44     saved_value_.reset(value->DeepCopy());
45     OnParsedJsonInternal(has_error);
46   }
47
48   MOCK_METHOD1(OnParsedJsonInternal, void(bool has_error));
49
50   virtual void OnNeedPrivetToken(
51       PrivetURLFetcher* fetcher,
52       const PrivetURLFetcher::TokenCallback& callback) {
53   }
54
55   bool OnRawData(PrivetURLFetcher* fetcher,
56                  bool response_is_file,
57                  const std::string& data,
58                  const base::FilePath& response_file) {
59     if (!raw_mode_) return false;
60
61     if (response_is_file) {
62       EXPECT_TRUE(response_file != base::FilePath());
63       OnFileInternal();
64     } else {
65       OnRawDataInternal(data);
66     }
67
68     return true;
69   }
70
71   MOCK_METHOD1(OnRawDataInternal, void(std::string data));
72
73   MOCK_METHOD0(OnFileInternal, void());
74
75   const base::DictionaryValue* saved_value() { return saved_value_.get(); }
76
77   void SetRawMode(bool raw_mode) {
78     raw_mode_ = raw_mode;
79   }
80
81  private:
82   scoped_ptr<base::DictionaryValue> saved_value_;
83   bool raw_mode_;
84 };
85
86 class PrivetURLFetcherTest : public ::testing::Test {
87  public:
88   PrivetURLFetcherTest() {
89     request_context_= new net::TestURLRequestContextGetter(
90         base::MessageLoopProxy::current());
91     privet_urlfetcher_.reset(new PrivetURLFetcher(
92         kSamplePrivetToken,
93         GURL(kSamplePrivetURL),
94         net::URLFetcher::POST,
95         request_context_.get(),
96         &delegate_));
97   }
98   virtual ~PrivetURLFetcherTest() {
99   }
100
101   void RunFor(base::TimeDelta time_period) {
102     base::CancelableCallback<void()> callback(base::Bind(
103         &PrivetURLFetcherTest::Stop, base::Unretained(this)));
104     base::MessageLoop::current()->PostDelayedTask(
105         FROM_HERE, callback.callback(), time_period);
106
107     base::MessageLoop::current()->Run();
108     callback.Cancel();
109   }
110
111   void Stop() {
112     base::MessageLoop::current()->Quit();
113   }
114
115  protected:
116   base::MessageLoop loop_;
117   scoped_refptr<net::TestURLRequestContextGetter> request_context_;
118   net::TestURLFetcherFactory fetcher_factory_;
119   scoped_ptr<PrivetURLFetcher> privet_urlfetcher_;
120   StrictMock<MockPrivetURLFetcherDelegate> delegate_;
121 };
122
123 TEST_F(PrivetURLFetcherTest, FetchSuccess) {
124   privet_urlfetcher_->Start();
125   net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
126   ASSERT_TRUE(fetcher != NULL);
127   fetcher->SetResponseString(kSampleParsableJSON);
128   fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
129                                             net::OK));
130   fetcher->set_response_code(200);
131
132   EXPECT_CALL(delegate_, OnParsedJsonInternal(false));
133   fetcher->delegate()->OnURLFetchComplete(fetcher);
134
135   const base::DictionaryValue* value = delegate_.saved_value();
136   int hello_value;
137   ASSERT_TRUE(value != NULL);
138   ASSERT_TRUE(value->GetInteger("hello", &hello_value));
139   EXPECT_EQ(2, hello_value);
140 }
141
142 TEST_F(PrivetURLFetcherTest, HTTP503Retry) {
143   privet_urlfetcher_->Start();
144   net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
145   ASSERT_TRUE(fetcher != NULL);
146   fetcher->SetResponseString(kSampleParsableJSON);
147   fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
148                                             net::OK));
149   fetcher->set_response_code(503);
150
151   fetcher->delegate()->OnURLFetchComplete(fetcher);
152
153   RunFor(base::TimeDelta::FromSeconds(7));
154   fetcher = fetcher_factory_.GetFetcherByID(0);
155
156   ASSERT_TRUE(fetcher != NULL);
157   fetcher->SetResponseString(kSampleParsableJSON);
158   fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
159                                             net::OK));
160   fetcher->set_response_code(200);
161
162   EXPECT_CALL(delegate_, OnParsedJsonInternal(false));
163   fetcher->delegate()->OnURLFetchComplete(fetcher);
164 }
165
166 TEST_F(PrivetURLFetcherTest, ResponseCodeError) {
167   privet_urlfetcher_->Start();
168   net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
169   ASSERT_TRUE(fetcher != NULL);
170   fetcher->SetResponseString(kSampleParsableJSON);
171   fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
172                                             net::OK));
173   fetcher->set_response_code(404);
174
175   EXPECT_CALL(delegate_,
176               OnErrorInternal(PrivetURLFetcher::RESPONSE_CODE_ERROR));
177   fetcher->delegate()->OnURLFetchComplete(fetcher);
178 }
179
180 TEST_F(PrivetURLFetcherTest, JsonParseError) {
181   privet_urlfetcher_->Start();
182   net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
183   ASSERT_TRUE(fetcher != NULL);
184   fetcher->SetResponseString(kSampleUnparsableJSON);
185   fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
186                                             net::OK));
187   fetcher->set_response_code(200);
188
189   EXPECT_CALL(delegate_,
190               OnErrorInternal(PrivetURLFetcher::JSON_PARSE_ERROR));
191   fetcher->delegate()->OnURLFetchComplete(fetcher);
192 }
193
194 TEST_F(PrivetURLFetcherTest, Header) {
195   privet_urlfetcher_->Start();
196   net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
197   ASSERT_TRUE(fetcher != NULL);
198   net::HttpRequestHeaders headers;
199   fetcher->GetExtraRequestHeaders(&headers);
200
201   std::string header_token;
202   ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token));
203   EXPECT_EQ(kSamplePrivetToken, header_token);
204 }
205
206 TEST_F(PrivetURLFetcherTest, Header2) {
207   privet_urlfetcher_.reset(new PrivetURLFetcher(
208       "",
209       GURL(kSamplePrivetURL),
210       net::URLFetcher::POST,
211       request_context_.get(),
212       &delegate_));
213
214   privet_urlfetcher_->AllowEmptyPrivetToken();
215   privet_urlfetcher_->Start();
216
217   net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
218   ASSERT_TRUE(fetcher != NULL);
219   net::HttpRequestHeaders headers;
220   fetcher->GetExtraRequestHeaders(&headers);
221
222   std::string header_token;
223   ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token));
224   EXPECT_EQ(kEmptyPrivetToken, header_token);
225 }
226
227 TEST_F(PrivetURLFetcherTest, FetchHasError) {
228   privet_urlfetcher_->Start();
229   net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
230   ASSERT_TRUE(fetcher != NULL);
231   fetcher->SetResponseString(kSampleJSONWithError);
232   fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
233                                             net::OK));
234   fetcher->set_response_code(200);
235
236   EXPECT_CALL(delegate_, OnParsedJsonInternal(true));
237   fetcher->delegate()->OnURLFetchComplete(fetcher);
238 }
239
240 TEST_F(PrivetURLFetcherTest, FetcherRawData) {
241   delegate_.SetRawMode(true);
242   privet_urlfetcher_->Start();
243   net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
244   ASSERT_TRUE(fetcher != NULL);
245   fetcher->SetResponseString(kSampleJSONWithError);
246   fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
247                                             net::OK));
248   fetcher->set_response_code(200);
249
250   EXPECT_CALL(delegate_, OnRawDataInternal(kSampleJSONWithError));
251   fetcher->delegate()->OnURLFetchComplete(fetcher);
252 }
253
254 TEST_F(PrivetURLFetcherTest, RangeRequest) {
255   delegate_.SetRawMode(true);
256   privet_urlfetcher_->SetByteRange(200, 300);
257   privet_urlfetcher_->Start();
258   net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
259   ASSERT_TRUE(fetcher != NULL);
260   net::HttpRequestHeaders headers;
261   fetcher->GetExtraRequestHeaders(&headers);
262
263   std::string header_range;
264   ASSERT_TRUE(headers.GetHeader("Range", &header_range));
265   EXPECT_EQ("bytes=200-300", header_range);
266 }
267
268 TEST_F(PrivetURLFetcherTest, FetcherToFile) {
269   delegate_.SetRawMode(true);
270   privet_urlfetcher_->SaveResponseToFile();
271   privet_urlfetcher_->Start();
272   net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
273   ASSERT_TRUE(fetcher != NULL);
274   fetcher->SetResponseFilePath(
275       base::FilePath(FILE_PATH_LITERAL("sample/file")));
276   fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
277                                             net::OK));
278   fetcher->set_response_code(200);
279
280   EXPECT_CALL(delegate_, OnFileInternal());
281   fetcher->delegate()->OnURLFetchComplete(fetcher);
282 }
283
284 }  // namespace
285
286 }  // namespace local_discovery