gcm_channel_status_request_unittest.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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 "base/message_loop/message_loop.h"
6#include "components/gcm_driver/gcm_channel_status_request.h"
7#include "components/gcm_driver/proto/gcm_channel_status.pb.h"
8#include "net/url_request/test_url_fetcher_factory.h"
9#include "net/url_request/url_request_test_util.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12namespace gcm {
13
14class GCMChannelStatusRequestTest : public testing::Test {
15 public:
16  GCMChannelStatusRequestTest();
17  virtual ~GCMChannelStatusRequestTest();
18
19 protected:
20  enum GCMStatus {
21    NOT_SPECIFIED,
22    GCM_ENABLED,
23    GCM_DISABLED,
24  };
25
26  void StartRequest();
27  void SetResponseStatusAndString(net::HttpStatusCode status_code,
28                                  const std::string& response_body);
29  void SetResponseProtoData(GCMStatus status, int poll_interval_seconds);
30  void CompleteFetch();
31  void OnRequestCompleted(bool enabled, int poll_interval_seconds);
32
33  scoped_ptr<GCMChannelStatusRequest> request_;
34  base::MessageLoop message_loop_;
35  net::TestURLFetcherFactory url_fetcher_factory_;
36  scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_;
37  bool request_callback_invoked_;
38  bool enabled_;
39  int poll_interval_seconds_;
40};
41
42GCMChannelStatusRequestTest::GCMChannelStatusRequestTest()
43    : url_request_context_getter_(new net::TestURLRequestContextGetter(
44           message_loop_.message_loop_proxy())),
45      request_callback_invoked_(false),
46      enabled_(true),
47      poll_interval_seconds_(0) {
48}
49
50GCMChannelStatusRequestTest::~GCMChannelStatusRequestTest() {
51}
52
53void GCMChannelStatusRequestTest::StartRequest() {
54  request_.reset(new GCMChannelStatusRequest(
55      url_request_context_getter_.get(),
56      base::Bind(&GCMChannelStatusRequestTest::OnRequestCompleted,
57                 base::Unretained(this))));
58  request_->Start();
59}
60
61void GCMChannelStatusRequestTest::SetResponseStatusAndString(
62    net::HttpStatusCode status_code,
63    const std::string& response_body) {
64  net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
65  ASSERT_TRUE(fetcher);
66  fetcher->set_response_code(status_code);
67  fetcher->SetResponseString(response_body);
68}
69
70void GCMChannelStatusRequestTest::SetResponseProtoData(
71    GCMStatus status, int poll_interval_seconds) {
72  gcm_proto::ExperimentStatusResponse response_proto;
73  if (status != NOT_SPECIFIED)
74    response_proto.mutable_gcm_channel()->set_enabled(status == GCM_ENABLED);
75
76  // Zero |poll_interval_seconds| means the optional field is not set.
77  if (poll_interval_seconds)
78    response_proto.set_poll_interval_seconds(poll_interval_seconds);
79
80  std::string response_string;
81  response_proto.SerializeToString(&response_string);
82  SetResponseStatusAndString(net::HTTP_OK, response_string);
83}
84
85void GCMChannelStatusRequestTest::CompleteFetch() {
86  request_callback_invoked_ = false;
87  net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
88  ASSERT_TRUE(fetcher);
89  fetcher->delegate()->OnURLFetchComplete(fetcher);
90}
91
92void GCMChannelStatusRequestTest::OnRequestCompleted(
93    bool enabled, int poll_interval_seconds) {
94  request_callback_invoked_ = true;
95  enabled_ = enabled;
96  poll_interval_seconds_ = poll_interval_seconds;
97}
98
99TEST_F(GCMChannelStatusRequestTest, ResponseHttpStatusNotOK) {
100  StartRequest();
101  SetResponseStatusAndString(net::HTTP_UNAUTHORIZED, "");
102  CompleteFetch();
103
104  EXPECT_FALSE(request_callback_invoked_);
105}
106
107TEST_F(GCMChannelStatusRequestTest, ResponseEmpty) {
108  StartRequest();
109  SetResponseStatusAndString(net::HTTP_OK, "");
110  CompleteFetch();
111
112  EXPECT_FALSE(request_callback_invoked_);
113}
114
115TEST_F(GCMChannelStatusRequestTest, ResponseNotInProtoFormat) {
116  StartRequest();
117  SetResponseStatusAndString(net::HTTP_OK, "foo");
118  CompleteFetch();
119
120  EXPECT_FALSE(request_callback_invoked_);
121}
122
123TEST_F(GCMChannelStatusRequestTest, ResponseEmptyProtoData) {
124  StartRequest();
125  SetResponseProtoData(NOT_SPECIFIED, 0);
126  CompleteFetch();
127
128  EXPECT_FALSE(request_callback_invoked_);
129}
130
131TEST_F(GCMChannelStatusRequestTest, ResponseWithDisabledStatus) {
132  StartRequest();
133  SetResponseProtoData(GCM_DISABLED, 0);
134  CompleteFetch();
135
136  EXPECT_TRUE(request_callback_invoked_);
137  EXPECT_FALSE(enabled_);
138  EXPECT_EQ(
139      GCMChannelStatusRequest::default_poll_interval_seconds(),
140      poll_interval_seconds_);
141}
142
143TEST_F(GCMChannelStatusRequestTest, ResponseWithEnabledStatus) {
144  StartRequest();
145  SetResponseProtoData(GCM_ENABLED, 0);
146  CompleteFetch();
147
148  EXPECT_TRUE(request_callback_invoked_);
149  EXPECT_TRUE(enabled_);
150  EXPECT_EQ(
151      GCMChannelStatusRequest::default_poll_interval_seconds(),
152      poll_interval_seconds_);
153}
154
155TEST_F(GCMChannelStatusRequestTest, ResponseWithPollInterval) {
156  // Setting a poll interval 15 minutes longer than the minimum interval we
157  // enforce.
158  int poll_interval_seconds =
159      GCMChannelStatusRequest::min_poll_interval_seconds() + 15 * 60;
160  StartRequest();
161  SetResponseProtoData(NOT_SPECIFIED, poll_interval_seconds);
162  CompleteFetch();
163
164  EXPECT_TRUE(request_callback_invoked_);
165  EXPECT_TRUE(enabled_);
166  EXPECT_EQ(poll_interval_seconds, poll_interval_seconds_);
167}
168
169TEST_F(GCMChannelStatusRequestTest, ResponseWithShortPollInterval) {
170  // Setting a poll interval 15 minutes shorter than the minimum interval we
171  // enforce.
172  int poll_interval_seconds =
173      GCMChannelStatusRequest::min_poll_interval_seconds() - 15 * 60;
174  StartRequest();
175  SetResponseProtoData(NOT_SPECIFIED, poll_interval_seconds);
176  CompleteFetch();
177
178  EXPECT_TRUE(request_callback_invoked_);
179  EXPECT_TRUE(enabled_);
180  EXPECT_EQ(GCMChannelStatusRequest::min_poll_interval_seconds(),
181            poll_interval_seconds_);
182}
183
184TEST_F(GCMChannelStatusRequestTest, ResponseWithDisabledStatusAndPollInterval) {
185  int poll_interval_seconds =
186      GCMChannelStatusRequest::min_poll_interval_seconds() + 15 * 60;
187  StartRequest();
188  SetResponseProtoData(GCM_DISABLED, poll_interval_seconds);
189  CompleteFetch();
190
191  EXPECT_TRUE(request_callback_invoked_);
192  EXPECT_FALSE(enabled_);
193  EXPECT_EQ(poll_interval_seconds, poll_interval_seconds_);
194}
195
196}  // namespace gcm
197