privetv3_setup_flow_unittest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1// Copyright 2014 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/privetv3_setup_flow.h"
6
7#include "base/json/json_reader.h"
8#include "chrome/browser/local_discovery/gcd_api_flow.h"
9#include "net/http/http_response_headers.h"
10#include "net/url_request/test_url_fetcher_factory.h"
11#include "net/url_request/url_request_test_util.h"
12#include "testing/gmock/include/gmock/gmock.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15namespace local_discovery {
16
17namespace {
18
19using testing::HasSubstr;
20using testing::Invoke;
21using testing::Return;
22using testing::SaveArg;
23using testing::StrictMock;
24using testing::WithArgs;
25using testing::_;
26
27const char kServiceName[] = "test_service";
28
29const char kRegistrationTicketResponse[] =
30    "{"
31    "\"kind\": \"clouddevices#registrationTicket\","
32    "\"id\": \"test_ticket\""
33    "}";
34
35class MockPrivetHTTPClient : public PrivetHTTPClient {
36 public:
37  MockPrivetHTTPClient() {
38    request_context_ =
39        new net::TestURLRequestContextGetter(base::MessageLoopProxy::current());
40  }
41
42  MOCK_METHOD0(GetName, const std::string&());
43  MOCK_METHOD1(
44      CreateInfoOperationPtr,
45      PrivetJSONOperation*(const PrivetJSONOperation::ResultCallback&));
46
47  virtual void RefreshPrivetToken(
48      const PrivetURLFetcher::TokenCallback& callback) OVERRIDE {
49    callback.Run("x-privet-token");
50  }
51
52  virtual scoped_ptr<PrivetJSONOperation> CreateInfoOperation(
53      const PrivetJSONOperation::ResultCallback& callback) OVERRIDE {
54    return make_scoped_ptr(CreateInfoOperationPtr(callback));
55  }
56
57  virtual scoped_ptr<PrivetURLFetcher> CreateURLFetcher(
58      const GURL& url,
59      net::URLFetcher::RequestType request_type,
60      PrivetURLFetcher::Delegate* delegate) OVERRIDE {
61    return make_scoped_ptr(
62        new PrivetURLFetcher(url, request_type, request_context_, delegate));
63  }
64
65  scoped_refptr<net::TestURLRequestContextGetter> request_context_;
66};
67
68class MockDelegate : public PrivetV3SetupFlow::Delegate {
69 public:
70  MockDelegate() : privet_client_ptr_(NULL) {}
71
72  class MockGCDApiFlow : public GCDApiFlow {
73   public:
74    explicit MockGCDApiFlow(MockDelegate* delegate) : delegate_(delegate) {}
75
76    virtual void Start(scoped_ptr<Request> request) OVERRIDE {
77      ASSERT_FALSE(delegate_->gcd_request_);
78      delegate_->gcd_request_ = request.Pass();
79      delegate_->ReplyWithToken();
80    }
81
82   private:
83    MockDelegate* delegate_;
84  };
85
86  MOCK_METHOD1(GetWiFiCredentials, void(const CredentialsCallback&));
87  MOCK_METHOD1(SwitchToSetupWiFi, void(const ResultCallback&));
88  virtual void CreatePrivetV3Client(
89      const std::string& service_name,
90      const PrivetClientCallback& callback) OVERRIDE {
91    scoped_ptr<MockPrivetHTTPClient> privet_client(new MockPrivetHTTPClient());
92    privet_client_ptr_ = privet_client.get();
93    callback.Run(privet_client.PassAs<PrivetHTTPClient>());
94  }
95  MOCK_METHOD2(ConfirmSecurityCode,
96               void(const std::string&, const ResultCallback&));
97  MOCK_METHOD1(RestoreWifi, void(const ResultCallback&));
98  MOCK_METHOD0(OnSetupDone, void());
99  MOCK_METHOD0(OnSetupError, void());
100
101  virtual scoped_ptr<GCDApiFlow> CreateApiFlow() OVERRIDE {
102    scoped_ptr<MockGCDApiFlow> mock_gcd(new MockGCDApiFlow(this));
103    return mock_gcd.PassAs<GCDApiFlow>();
104  }
105
106  void ReplyWithToken() {
107    scoped_ptr<base::Value> value(base::JSONReader::Read(gcd_server_response_));
108    const base::DictionaryValue* dictionary = NULL;
109    value->GetAsDictionary(&dictionary);
110    gcd_request_->OnGCDAPIFlowComplete(*dictionary);
111  }
112
113  void ConfirmCode(const ResultCallback& confirm_callback) {
114    confirm_callback.Run(true);
115  }
116
117  std::string gcd_server_response_;
118  scoped_ptr<GCDApiFlow::Request> gcd_request_;
119  MockPrivetHTTPClient* privet_client_ptr_;
120};
121
122class PrivetV3SetupFlowTest : public testing::Test {
123 public:
124  PrivetV3SetupFlowTest() : setup_(&delegate_) {}
125
126  virtual ~PrivetV3SetupFlowTest() {}
127
128 protected:
129  virtual void SetUp() OVERRIDE {
130    EXPECT_CALL(delegate_, GetWiFiCredentials(_)).Times(0);
131    EXPECT_CALL(delegate_, SwitchToSetupWiFi(_)).Times(0);
132    EXPECT_CALL(delegate_, ConfirmSecurityCode(_, _)).Times(0);
133    EXPECT_CALL(delegate_, RestoreWifi(_)).Times(0);
134    EXPECT_CALL(delegate_, OnSetupDone()).Times(0);
135    EXPECT_CALL(delegate_, OnSetupError()).Times(0);
136  }
137
138  void SimulateFetch(int response_code, const std::string& response) {
139    net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
140    ASSERT_TRUE(fetcher);
141    EXPECT_THAT(fetcher->GetOriginalURL().spec(),
142                testing::HasSubstr("/privet/v3/setup/start"));
143    fetcher->set_response_code(response_code);
144    scoped_refptr<net::HttpResponseHeaders> response_headers(
145        new net::HttpResponseHeaders(""));
146    response_headers->AddHeader("Content-Type: application/json");
147    fetcher->set_response_headers(response_headers);
148    fetcher->SetResponseString(response);
149    fetcher->delegate()->OnURLFetchComplete(fetcher);
150  }
151
152  base::MessageLoop loop_;
153  net::TestURLFetcherFactory url_fetcher_factory_;
154
155  StrictMock<MockDelegate> delegate_;
156  PrivetV3SetupFlow setup_;
157};
158
159TEST_F(PrivetV3SetupFlowTest, InvalidTicket) {
160  EXPECT_CALL(delegate_, OnSetupError()).Times(1);
161  delegate_.gcd_server_response_ = "{}";
162  setup_.Register(kServiceName);
163}
164
165TEST_F(PrivetV3SetupFlowTest, InvalidDeviceResponce) {
166  EXPECT_CALL(delegate_, OnSetupError()).Times(1);
167  EXPECT_CALL(delegate_, ConfirmSecurityCode(_, _)).Times(1).WillOnce(
168      WithArgs<1>(Invoke(&delegate_, &MockDelegate::ConfirmCode)));
169  delegate_.gcd_server_response_ = kRegistrationTicketResponse;
170  setup_.Register(kServiceName);
171  SimulateFetch(0, "{}");
172}
173
174TEST_F(PrivetV3SetupFlowTest, Success) {
175  EXPECT_CALL(delegate_, OnSetupDone()).Times(1);
176  EXPECT_CALL(delegate_, ConfirmSecurityCode(_, _)).Times(1).WillOnce(
177      WithArgs<1>(Invoke(&delegate_, &MockDelegate::ConfirmCode)));
178  delegate_.gcd_server_response_ = kRegistrationTicketResponse;
179  setup_.Register(kServiceName);
180  SimulateFetch(200, "{}");
181}
182
183}  // namespace
184
185}  // namespace local_discovery
186