17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/local_discovery/privet_url_fetcher.h"
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/url_request/test_url_fetcher_factory.h"
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/url_request/url_request_test_util.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gmock/include/gmock/gmock.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing testing::StrictMock;
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace local_discovery {
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace {
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst char kSamplePrivetURL[] =
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    "http://10.0.0.8:7676/privet/register?action=start";
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst char kSamplePrivetToken[] = "MyToken";
208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)const char kEmptyPrivetToken[] = "\"\"";
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst char kSampleParsableJSON[] = "{ \"hello\" : 2 }";
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst char kSampleUnparsableJSON[] = "{ \"hello\" : }";
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst char kSampleJSONWithError[] = "{ \"error\" : \"unittest_example\" }";
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass MockPrivetURLFetcherDelegate : public PrivetURLFetcher::Delegate {
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockPrivetURLFetcherDelegate() : raw_mode_(false) {
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~MockPrivetURLFetcherDelegate() {
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void OnError(PrivetURLFetcher* fetcher,
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       PrivetURLFetcher::ErrorType error) OVERRIDE {
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    OnErrorInternal(error);
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MOCK_METHOD1(OnErrorInternal, void(PrivetURLFetcher::ErrorType error));
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void OnParsedJson(PrivetURLFetcher* fetcher,
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            const base::DictionaryValue& value,
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                            bool has_error) OVERRIDE {
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    saved_value_.reset(value.DeepCopy());
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    OnParsedJsonInternal(has_error);
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  MOCK_METHOD1(OnParsedJsonInternal, void(bool has_error));
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void OnNeedPrivetToken(
510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      PrivetURLFetcher* fetcher,
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      const PrivetURLFetcher::TokenCallback& callback) {
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool OnRawData(PrivetURLFetcher* fetcher,
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 bool response_is_file,
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const std::string& data,
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const base::FilePath& response_file) {
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!raw_mode_) return false;
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (response_is_file) {
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_TRUE(response_file != base::FilePath());
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OnFileInternal();
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OnRawDataInternal(data);
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD1(OnRawDataInternal, void(std::string data));
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD0(OnFileInternal, void());
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::DictionaryValue* saved_value() { return saved_value_.get(); }
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetRawMode(bool raw_mode) {
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    raw_mode_ = raw_mode;
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::string GetAuthToken() { return "MyAuthToken"; }
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private:
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> saved_value_;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool raw_mode_;
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass PrivetURLFetcherTest : public ::testing::Test {
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public:
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  PrivetURLFetcherTest() {
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    request_context_= new net::TestURLRequestContextGetter(
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::MessageLoopProxy::current());
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    privet_urlfetcher_.reset(new PrivetURLFetcher(
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        GURL(kSamplePrivetURL),
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        net::URLFetcher::POST,
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        request_context_.get(),
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        &delegate_));
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PrivetURLFetcher::SetTokenForHost(GURL(kSamplePrivetURL).GetOrigin().spec(),
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                      kSamplePrivetToken);
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual ~PrivetURLFetcherTest() {
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void RunFor(base::TimeDelta time_period) {
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::CancelableCallback<void()> callback(base::Bind(
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        &PrivetURLFetcherTest::Stop, base::Unretained(this)));
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::MessageLoop::current()->PostDelayedTask(
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        FROM_HERE, callback.callback(), time_period);
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::MessageLoop::current()->Run();
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    callback.Cancel();
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Stop() {
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::MessageLoop::current()->Quit();
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected:
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::MessageLoop loop_;
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<net::TestURLRequestContextGetter> request_context_;
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  net::TestURLFetcherFactory fetcher_factory_;
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<PrivetURLFetcher> privet_urlfetcher_;
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  StrictMock<MockPrivetURLFetcherDelegate> delegate_;
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(PrivetURLFetcherTest, FetchSuccess) {
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  privet_urlfetcher_->Start();
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(fetcher != NULL);
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->SetResponseString(kSampleParsableJSON);
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                            net::OK));
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->set_response_code(200);
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_CALL(delegate_, OnParsedJsonInternal(false));
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->delegate()->OnURLFetchComplete(fetcher);
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const base::DictionaryValue* value = delegate_.saved_value();
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int hello_value;
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(value != NULL);
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(value->GetInteger("hello", &hello_value));
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(2, hello_value);
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PrivetURLFetcherTest, HTTP503Retry) {
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  privet_urlfetcher_->Start();
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(fetcher != NULL);
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fetcher->SetResponseString(kSampleParsableJSON);
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                            net::OK));
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fetcher->set_response_code(503);
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RunFor(base::TimeDelta::FromSeconds(7));
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fetcher = fetcher_factory_.GetFetcherByID(0);
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(fetcher != NULL);
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fetcher->SetResponseString(kSampleParsableJSON);
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                            net::OK));
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fetcher->set_response_code(200);
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(delegate_, OnParsedJsonInternal(false));
1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->delegate()->OnURLFetchComplete(fetcher);
1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1707dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(PrivetURLFetcherTest, ResponseCodeError) {
1717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  privet_urlfetcher_->Start();
1727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(fetcher != NULL);
1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->SetResponseString(kSampleParsableJSON);
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                            net::OK));
1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->set_response_code(404);
1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_CALL(delegate_,
1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              OnErrorInternal(PrivetURLFetcher::RESPONSE_CODE_ERROR));
1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->delegate()->OnURLFetchComplete(fetcher);
1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(PrivetURLFetcherTest, JsonParseError) {
1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  privet_urlfetcher_->Start();
1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(fetcher != NULL);
1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->SetResponseString(kSampleUnparsableJSON);
1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                            net::OK));
1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->set_response_code(200);
1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_CALL(delegate_,
1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              OnErrorInternal(PrivetURLFetcher::JSON_PARSE_ERROR));
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->delegate()->OnURLFetchComplete(fetcher);
1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(PrivetURLFetcherTest, Header) {
1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  privet_urlfetcher_->Start();
2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(fetcher != NULL);
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  net::HttpRequestHeaders headers;
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->GetExtraRequestHeaders(&headers);
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string header_token;
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token));
2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(kSamplePrivetToken, header_token);
2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(PrivetURLFetcherTest, Header2) {
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PrivetURLFetcher::SetTokenForHost(GURL(kSamplePrivetURL).GetOrigin().spec(),
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    "");
2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  privet_urlfetcher_->SendEmptyPrivetToken();
215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  privet_urlfetcher_->Start();
216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(fetcher != NULL);
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  net::HttpRequestHeaders headers;
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  fetcher->GetExtraRequestHeaders(&headers);
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string header_token;
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token));
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(kEmptyPrivetToken, header_token);
225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
227effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(PrivetURLFetcherTest, AlwaysSendEmpty) {
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  PrivetURLFetcher::SetTokenForHost(GURL(kSamplePrivetURL).GetOrigin().spec(),
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    "SampleToken");
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  privet_urlfetcher_->SendEmptyPrivetToken();
2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  privet_urlfetcher_->Start();
2330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(fetcher != NULL);
2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  net::HttpRequestHeaders headers;
2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  fetcher->GetExtraRequestHeaders(&headers);
2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string header_token;
2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(headers.GetHeader("X-Privet-Token", &header_token));
2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(kEmptyPrivetToken, header_token);
2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(PrivetURLFetcherTest, FetchHasError) {
2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  privet_urlfetcher_->Start();
2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(fetcher != NULL);
2487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->SetResponseString(kSampleJSONWithError);
2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
2507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                            net::OK));
2517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->set_response_code(200);
2527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_CALL(delegate_, OnParsedJsonInternal(true));
2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  fetcher->delegate()->OnURLFetchComplete(fetcher);
2557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PrivetURLFetcherTest, FetcherRawData) {
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delegate_.SetRawMode(true);
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_urlfetcher_->Start();
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(fetcher != NULL);
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher->SetResponseString(kSampleJSONWithError);
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            net::OK));
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher->set_response_code(200);
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(delegate_, OnRawDataInternal(kSampleJSONWithError));
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PrivetURLFetcherTest, RangeRequest) {
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delegate_.SetRawMode(true);
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_urlfetcher_->SetByteRange(200, 300);
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_urlfetcher_->Start();
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(fetcher != NULL);
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::HttpRequestHeaders headers;
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher->GetExtraRequestHeaders(&headers);
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string header_range;
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(headers.GetHeader("Range", &header_range));
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("bytes=200-300", header_range);
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PrivetURLFetcherTest, FetcherToFile) {
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delegate_.SetRawMode(true);
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_urlfetcher_->SaveResponseToFile();
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  privet_urlfetcher_->Start();
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(fetcher != NULL);
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher->SetResponseFilePath(
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("sample/file")));
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            net::OK));
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher->set_response_code(200);
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_CALL(delegate_, OnFileInternal());
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(PrivetURLFetcherTest, V3Mode) {
3026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  delegate_.SetRawMode(true);
3036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  privet_urlfetcher_->V3Mode();
3046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  privet_urlfetcher_->Start();
3056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(fetcher != NULL);
3076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  fetcher->SetResponseFilePath(
3086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("sample/file")));
3096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  net::HttpRequestHeaders headers;
3106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  fetcher->GetExtraRequestHeaders(&headers);
3116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  std::string header_token;
3136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_FALSE(headers.GetHeader("X-Privet-Token", &header_token));
3146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_TRUE(headers.GetHeader("X-Privet-Auth", &header_token));
3156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_EQ("MyAuthToken", header_token);
3166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
3176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace
3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace local_discovery
321