privet_url_fetcher_unittest.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
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
11using testing::StrictMock;
12
13namespace local_discovery {
14
15namespace {
16
17const char kSamplePrivetURL[] =
18    "http://10.0.0.8:7676/privet/register?action=start";
19const char kSamplePrivetToken[] = "MyToken";
20const char kEmptyPrivetToken[] = "\"\"";
21
22const char kSampleParsableJSON[] = "{ \"hello\" : 2 }";
23const char kSampleUnparsableJSON[] = "{ \"hello\" : }";
24const char kSampleJSONWithError[] = "{ \"error\" : \"unittest_example\" }";
25
26class MockPrivetURLFetcherDelegate : public PrivetURLFetcher::Delegate {
27 public:
28  virtual void OnError(PrivetURLFetcher* fetcher,
29                       PrivetURLFetcher::ErrorType error) OVERRIDE {
30    OnErrorInternal(error);
31  }
32
33  MOCK_METHOD1(OnErrorInternal, void(PrivetURLFetcher::ErrorType error));
34
35  virtual void OnParsedJson(PrivetURLFetcher* fetcher,
36                            const base::DictionaryValue* value,
37                            bool has_error) OVERRIDE {
38    saved_value_.reset(value->DeepCopy());
39    OnParsedJsonInternal(has_error);
40  }
41
42  MOCK_METHOD1(OnParsedJsonInternal, void(bool has_error));
43
44  const DictionaryValue* saved_value() { return saved_value_.get(); }
45
46 private:
47  scoped_ptr<DictionaryValue> saved_value_;
48};
49
50class PrivetURLFetcherTest : public ::testing::Test {
51 public:
52  PrivetURLFetcherTest() {
53    request_context_= new net::TestURLRequestContextGetter(
54        base::MessageLoopProxy::current());
55    privet_urlfetcher_.reset(new PrivetURLFetcher(
56        kSamplePrivetToken,
57        GURL(kSamplePrivetURL),
58        net::URLFetcher::POST,
59        request_context_.get(),
60        &delegate_));
61  }
62  virtual ~PrivetURLFetcherTest() {
63  }
64
65 protected:
66  base::MessageLoop loop_;
67  scoped_refptr<net::TestURLRequestContextGetter> request_context_;
68  net::TestURLFetcherFactory fetcher_factory_;
69  scoped_ptr<PrivetURLFetcher> privet_urlfetcher_;
70  StrictMock<MockPrivetURLFetcherDelegate> delegate_;
71};
72
73TEST_F(PrivetURLFetcherTest, FetchSuccess) {
74  privet_urlfetcher_->Start();
75  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
76  ASSERT_TRUE(fetcher != NULL);
77  fetcher->SetResponseString(kSampleParsableJSON);
78  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
79                                            net::OK));
80  fetcher->set_response_code(200);
81
82  EXPECT_CALL(delegate_, OnParsedJsonInternal(false));
83  fetcher->delegate()->OnURLFetchComplete(fetcher);
84
85  const base::DictionaryValue* value = delegate_.saved_value();
86  int hello_value;
87  ASSERT_TRUE(value != NULL);
88  ASSERT_TRUE(value->GetInteger("hello", &hello_value));
89  EXPECT_EQ(2, hello_value);
90}
91
92TEST_F(PrivetURLFetcherTest, URLFetcherError) {
93  privet_urlfetcher_->Start();
94  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
95  ASSERT_TRUE(fetcher != NULL);
96  fetcher->SetResponseString(kSampleParsableJSON);
97  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
98                                            net::ERR_TIMED_OUT));
99  fetcher->set_response_code(-1);
100
101  EXPECT_CALL(delegate_, OnErrorInternal(PrivetURLFetcher::URL_FETCH_ERROR));
102  fetcher->delegate()->OnURLFetchComplete(fetcher);
103}
104
105TEST_F(PrivetURLFetcherTest, ResponseCodeError) {
106  privet_urlfetcher_->Start();
107  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
108  ASSERT_TRUE(fetcher != NULL);
109  fetcher->SetResponseString(kSampleParsableJSON);
110  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
111                                            net::OK));
112  fetcher->set_response_code(404);
113
114  EXPECT_CALL(delegate_,
115              OnErrorInternal(PrivetURLFetcher::RESPONSE_CODE_ERROR));
116  fetcher->delegate()->OnURLFetchComplete(fetcher);
117}
118
119TEST_F(PrivetURLFetcherTest, JsonParseError) {
120  privet_urlfetcher_->Start();
121  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
122  ASSERT_TRUE(fetcher != NULL);
123  fetcher->SetResponseString(kSampleUnparsableJSON);
124  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
125                                            net::OK));
126  fetcher->set_response_code(200);
127
128  EXPECT_CALL(delegate_,
129              OnErrorInternal(PrivetURLFetcher::JSON_PARSE_ERROR));
130  fetcher->delegate()->OnURLFetchComplete(fetcher);
131}
132
133TEST_F(PrivetURLFetcherTest, Header) {
134  privet_urlfetcher_->Start();
135  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
136  ASSERT_TRUE(fetcher != NULL);
137  net::HttpRequestHeaders headers;
138  fetcher->GetExtraRequestHeaders(&headers);
139
140  std::string header_token;
141  ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token));
142  EXPECT_EQ(kSamplePrivetToken, header_token);
143}
144
145TEST_F(PrivetURLFetcherTest, Header2) {
146  privet_urlfetcher_.reset(new PrivetURLFetcher(
147      "",
148      GURL(kSamplePrivetURL),
149      net::URLFetcher::POST,
150      request_context_.get(),
151      &delegate_));
152
153  privet_urlfetcher_->Start();
154  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
155  ASSERT_TRUE(fetcher != NULL);
156  net::HttpRequestHeaders headers;
157  fetcher->GetExtraRequestHeaders(&headers);
158
159  std::string header_token;
160  ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token));
161  EXPECT_EQ(kEmptyPrivetToken, header_token);
162}
163
164TEST_F(PrivetURLFetcherTest, FetchHasError) {
165  privet_urlfetcher_->Start();
166  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
167  ASSERT_TRUE(fetcher != NULL);
168  fetcher->SetResponseString(kSampleJSONWithError);
169  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
170                                            net::OK));
171  fetcher->set_response_code(200);
172
173  EXPECT_CALL(delegate_, OnParsedJsonInternal(true));
174  fetcher->delegate()->OnURLFetchComplete(fetcher);
175}
176
177}  // namespace
178
179}  // namespace local_discovery
180