1// Copyright (c) 2012 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 "testing/gtest/include/gtest/gtest.h"
6
7#include <string>
8
9#include "chrome/browser/extensions/api/push_messaging/obfuscated_gaia_id_fetcher.h"
10#include "chrome/browser/extensions/api/push_messaging/push_messaging_api.h"
11#include "net/url_request/test_url_fetcher_factory.h"
12
13namespace {
14
15static const char kGoodData[] = "{ \"id\" : \"My-channel-id\" }";
16static const char kBadJsonData[] = "I am not a JSON string";
17static const char kDictionaryMissingIdData[] = "{ \"foo\" : \"bar\" }";
18static const char kNonDictionaryJsonData[] = "{ 0.5 }";
19
20// Delegate class for catching notifications from the ObfuscatedGaiaIdFetcher.
21class TestDelegate : public extensions::ObfuscatedGaiaIdFetcher::Delegate {
22 public:
23  virtual void OnObfuscatedGaiaIdFetchSuccess(
24      const std::string& obfuscated_id) OVERRIDE {
25    succeeded_ = true;
26  }
27  virtual void OnObfuscatedGaiaIdFetchFailure(
28      const GoogleServiceAuthError& error) OVERRIDE {
29    failed_ = true;
30  }
31  TestDelegate() : succeeded_(false), failed_(false) {}
32  virtual ~TestDelegate() {}
33  bool succeeded() const { return succeeded_; }
34  bool failed() const { return failed_; }
35
36 private:
37  bool succeeded_;
38  bool failed_;
39  DISALLOW_COPY_AND_ASSIGN(TestDelegate);
40};
41
42}  // namespace
43
44namespace extensions {
45
46TEST(ObfuscatedGaiaIdFetcherTest, ParseResponse) {
47  // Try a good response string.
48  std::string channel_id_out1;
49  bool ret1 = ObfuscatedGaiaIdFetcher::ParseResponse(
50      kGoodData, &channel_id_out1);
51  EXPECT_EQ("My-channel-id", channel_id_out1);
52  EXPECT_TRUE(ret1);
53
54  // Try badly formatted JSON.
55  std::string channel_id_out2;
56  bool ret2 = ObfuscatedGaiaIdFetcher::ParseResponse(
57      kBadJsonData, &channel_id_out2);
58  EXPECT_TRUE(channel_id_out2.empty());
59  EXPECT_FALSE(ret2);
60
61  // Try a JSON dictionary with no "id" value.
62  std::string channel_id_out3;
63  bool ret3 = ObfuscatedGaiaIdFetcher::ParseResponse(
64      kDictionaryMissingIdData, &channel_id_out3);
65  EXPECT_TRUE(channel_id_out3.empty());
66  EXPECT_FALSE(ret3);
67
68  // Try JSON, but not a dictionary.
69  std::string channel_id_out4;
70  bool ret4 = ObfuscatedGaiaIdFetcher::ParseResponse(
71      kNonDictionaryJsonData, &channel_id_out4);
72  EXPECT_TRUE(channel_id_out4.empty());
73  EXPECT_FALSE(ret4);
74}
75
76TEST(ObfuscatedGaiaIdFetcherTest, ProcessApiCallSuccess) {
77  TestDelegate delegate;
78  ObfuscatedGaiaIdFetcher fetcher(NULL, &delegate, std::string());
79
80  net::TestURLFetcher url_fetcher(1, GURL("http://www.google.com"), NULL);
81  url_fetcher.set_status(
82      net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0));
83  url_fetcher.SetResponseString(kGoodData);
84
85  // Test the happy path.
86  fetcher.ProcessApiCallSuccess(&url_fetcher);
87  EXPECT_TRUE(delegate.succeeded());
88}
89
90TEST(ObfuscatedGaiaIdFetcherTest, ProcessApiCallFailure) {
91  TestDelegate delegate;
92  ObfuscatedGaiaIdFetcher fetcher(NULL, &delegate, std::string());
93
94  net::TestURLFetcher url_fetcher(1, GURL("http://www.google.com"), NULL);
95  url_fetcher.set_status(
96      net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0));
97  url_fetcher.SetResponseString(kDictionaryMissingIdData);
98
99  // Test with bad data, ensure it fails.
100  fetcher.ProcessApiCallSuccess(&url_fetcher);
101  EXPECT_TRUE(delegate.failed());
102
103  // TODO(petewil): add case for when the base class fails and calls
104  // ProcessApiCallFailure
105}
106
107}  // namespace extensions
108