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.
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"
11 using testing::StrictMock;
13 namespace local_discovery {
17 const char kSamplePrivetURL[] =
18 "http://10.0.0.8:7676/privet/register?action=start";
19 const char kSamplePrivetToken[] = "MyToken";
20 const char kEmptyPrivetToken[] = "\"\"";
22 const char kSampleParsableJSON[] = "{ \"hello\" : 2 }";
23 const char kSampleUnparsableJSON[] = "{ \"hello\" : }";
24 const char kSampleJSONWithError[] = "{ \"error\" : \"unittest_example\" }";
26 class MockPrivetURLFetcherDelegate : public PrivetURLFetcher::Delegate {
28 virtual void OnError(PrivetURLFetcher* fetcher,
29 PrivetURLFetcher::ErrorType error) OVERRIDE {
30 OnErrorInternal(error);
33 MOCK_METHOD1(OnErrorInternal, void(PrivetURLFetcher::ErrorType error));
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);
42 MOCK_METHOD1(OnParsedJsonInternal, void(bool has_error));
44 virtual void OnNeedPrivetToken(
45 PrivetURLFetcher* fetcher,
46 const PrivetURLFetcher::TokenCallback& callback) {
49 const DictionaryValue* saved_value() { return saved_value_.get(); }
52 scoped_ptr<DictionaryValue> saved_value_;
55 class PrivetURLFetcherTest : public ::testing::Test {
57 PrivetURLFetcherTest() {
58 request_context_= new net::TestURLRequestContextGetter(
59 base::MessageLoopProxy::current());
60 privet_urlfetcher_.reset(new PrivetURLFetcher(
62 GURL(kSamplePrivetURL),
63 net::URLFetcher::POST,
64 request_context_.get(),
67 virtual ~PrivetURLFetcherTest() {
71 base::MessageLoop loop_;
72 scoped_refptr<net::TestURLRequestContextGetter> request_context_;
73 net::TestURLFetcherFactory fetcher_factory_;
74 scoped_ptr<PrivetURLFetcher> privet_urlfetcher_;
75 StrictMock<MockPrivetURLFetcherDelegate> delegate_;
78 TEST_F(PrivetURLFetcherTest, FetchSuccess) {
79 privet_urlfetcher_->Start();
80 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
81 ASSERT_TRUE(fetcher != NULL);
82 fetcher->SetResponseString(kSampleParsableJSON);
83 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
85 fetcher->set_response_code(200);
87 EXPECT_CALL(delegate_, OnParsedJsonInternal(false));
88 fetcher->delegate()->OnURLFetchComplete(fetcher);
90 const base::DictionaryValue* value = delegate_.saved_value();
92 ASSERT_TRUE(value != NULL);
93 ASSERT_TRUE(value->GetInteger("hello", &hello_value));
94 EXPECT_EQ(2, hello_value);
97 TEST_F(PrivetURLFetcherTest, URLFetcherError) {
98 privet_urlfetcher_->Start();
99 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
100 ASSERT_TRUE(fetcher != NULL);
101 fetcher->SetResponseString(kSampleParsableJSON);
102 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED,
103 net::ERR_TIMED_OUT));
104 fetcher->set_response_code(-1);
106 EXPECT_CALL(delegate_, OnErrorInternal(PrivetURLFetcher::URL_FETCH_ERROR));
107 fetcher->delegate()->OnURLFetchComplete(fetcher);
110 TEST_F(PrivetURLFetcherTest, ResponseCodeError) {
111 privet_urlfetcher_->Start();
112 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
113 ASSERT_TRUE(fetcher != NULL);
114 fetcher->SetResponseString(kSampleParsableJSON);
115 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
117 fetcher->set_response_code(404);
119 EXPECT_CALL(delegate_,
120 OnErrorInternal(PrivetURLFetcher::RESPONSE_CODE_ERROR));
121 fetcher->delegate()->OnURLFetchComplete(fetcher);
124 TEST_F(PrivetURLFetcherTest, JsonParseError) {
125 privet_urlfetcher_->Start();
126 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
127 ASSERT_TRUE(fetcher != NULL);
128 fetcher->SetResponseString(kSampleUnparsableJSON);
129 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
131 fetcher->set_response_code(200);
133 EXPECT_CALL(delegate_,
134 OnErrorInternal(PrivetURLFetcher::JSON_PARSE_ERROR));
135 fetcher->delegate()->OnURLFetchComplete(fetcher);
138 TEST_F(PrivetURLFetcherTest, Header) {
139 privet_urlfetcher_->Start();
140 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
141 ASSERT_TRUE(fetcher != NULL);
142 net::HttpRequestHeaders headers;
143 fetcher->GetExtraRequestHeaders(&headers);
145 std::string header_token;
146 ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token));
147 EXPECT_EQ(kSamplePrivetToken, header_token);
150 TEST_F(PrivetURLFetcherTest, Header2) {
151 privet_urlfetcher_.reset(new PrivetURLFetcher(
153 GURL(kSamplePrivetURL),
154 net::URLFetcher::POST,
155 request_context_.get(),
158 privet_urlfetcher_->AllowEmptyPrivetToken();
159 privet_urlfetcher_->Start();
161 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
162 ASSERT_TRUE(fetcher != NULL);
163 net::HttpRequestHeaders headers;
164 fetcher->GetExtraRequestHeaders(&headers);
166 std::string header_token;
167 ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token));
168 EXPECT_EQ(kEmptyPrivetToken, header_token);
171 TEST_F(PrivetURLFetcherTest, FetchHasError) {
172 privet_urlfetcher_->Start();
173 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
174 ASSERT_TRUE(fetcher != NULL);
175 fetcher->SetResponseString(kSampleJSONWithError);
176 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
178 fetcher->set_response_code(200);
180 EXPECT_CALL(delegate_, OnParsedJsonInternal(true));
181 fetcher->delegate()->OnURLFetchComplete(fetcher);
186 } // namespace local_discovery