privet_url_fetcher_unittest.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
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 virtual void OnNeedPrivetToken( 45 PrivetURLFetcher* fetcher, 46 const PrivetURLFetcher::TokenCallback& callback) { 47 } 48 49 const DictionaryValue* saved_value() { return saved_value_.get(); } 50 51 private: 52 scoped_ptr<DictionaryValue> saved_value_; 53}; 54 55class PrivetURLFetcherTest : public ::testing::Test { 56 public: 57 PrivetURLFetcherTest() { 58 request_context_= new net::TestURLRequestContextGetter( 59 base::MessageLoopProxy::current()); 60 privet_urlfetcher_.reset(new PrivetURLFetcher( 61 kSamplePrivetToken, 62 GURL(kSamplePrivetURL), 63 net::URLFetcher::POST, 64 request_context_.get(), 65 &delegate_)); 66 } 67 virtual ~PrivetURLFetcherTest() { 68 } 69 70 protected: 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_; 76}; 77 78TEST_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, 84 net::OK)); 85 fetcher->set_response_code(200); 86 87 EXPECT_CALL(delegate_, OnParsedJsonInternal(false)); 88 fetcher->delegate()->OnURLFetchComplete(fetcher); 89 90 const base::DictionaryValue* value = delegate_.saved_value(); 91 int hello_value; 92 ASSERT_TRUE(value != NULL); 93 ASSERT_TRUE(value->GetInteger("hello", &hello_value)); 94 EXPECT_EQ(2, hello_value); 95} 96 97TEST_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); 105 106 EXPECT_CALL(delegate_, OnErrorInternal(PrivetURLFetcher::URL_FETCH_ERROR)); 107 fetcher->delegate()->OnURLFetchComplete(fetcher); 108} 109 110TEST_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, 116 net::OK)); 117 fetcher->set_response_code(404); 118 119 EXPECT_CALL(delegate_, 120 OnErrorInternal(PrivetURLFetcher::RESPONSE_CODE_ERROR)); 121 fetcher->delegate()->OnURLFetchComplete(fetcher); 122} 123 124TEST_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, 130 net::OK)); 131 fetcher->set_response_code(200); 132 133 EXPECT_CALL(delegate_, 134 OnErrorInternal(PrivetURLFetcher::JSON_PARSE_ERROR)); 135 fetcher->delegate()->OnURLFetchComplete(fetcher); 136} 137 138TEST_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); 144 145 std::string header_token; 146 ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token)); 147 EXPECT_EQ(kSamplePrivetToken, header_token); 148} 149 150TEST_F(PrivetURLFetcherTest, Header2) { 151 privet_urlfetcher_.reset(new PrivetURLFetcher( 152 "", 153 GURL(kSamplePrivetURL), 154 net::URLFetcher::POST, 155 request_context_.get(), 156 &delegate_)); 157 158 privet_urlfetcher_->AllowEmptyPrivetToken(); 159 privet_urlfetcher_->Start(); 160 161 net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0); 162 ASSERT_TRUE(fetcher != NULL); 163 net::HttpRequestHeaders headers; 164 fetcher->GetExtraRequestHeaders(&headers); 165 166 std::string header_token; 167 ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token)); 168 EXPECT_EQ(kEmptyPrivetToken, header_token); 169} 170 171TEST_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, 177 net::OK)); 178 fetcher->set_response_code(200); 179 180 EXPECT_CALL(delegate_, OnParsedJsonInternal(true)); 181 fetcher->delegate()->OnURLFetchComplete(fetcher); 182} 183 184} // namespace 185 186} // namespace local_discovery 187