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