1// Copyright (c) 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 "base/bind.h"
6#include "base/message_loop/message_loop.h"
7#include "chrome/browser/chromeos/attestation/attestation_ca_client.h"
8#include "content/public/test/test_browser_thread.h"
9#include "net/http/http_status_code.h"
10#include "net/url_request/test_url_fetcher_factory.h"
11#include "net/url_request/url_fetcher.h"
12#include "net/url_request/url_request_status.h"
13#include "testing/gtest/include/gtest/gtest.h"
14
15namespace chromeos {
16namespace attestation {
17
18class AttestationCAClientTest : public ::testing::Test {
19 public:
20  AttestationCAClientTest()
21      : io_thread_(content::BrowserThread::IO, &message_loop_),
22        num_invocations_(0),
23        result_(false) {
24  }
25
26  virtual ~AttestationCAClientTest() {
27  }
28
29  void DataCallback (bool result, const std::string& data) {
30    ++num_invocations_;
31    result_ = result;
32    data_ = data;
33  }
34
35  void DeleteClientDataCallback (AttestationCAClient* client,
36                                 bool result,
37                                 const std::string& data) {
38    delete client;
39    DataCallback(result, data);
40  }
41
42 protected:
43  void SendResponse(net::URLRequestStatus::Status status, int response_code) {
44    net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
45    CHECK(fetcher);
46    fetcher->set_status(net::URLRequestStatus(status, 0));
47    fetcher->set_response_code(response_code);
48    fetcher->SetResponseString(fetcher->upload_data() + "_response");
49    fetcher->delegate()->OnURLFetchComplete(fetcher);
50  }
51
52  base::MessageLoop message_loop_;
53  content::TestBrowserThread io_thread_;
54  net::TestURLFetcherFactory url_fetcher_factory_;
55
56  // For use with DataCallback.
57  int num_invocations_;
58  bool result_;
59  std::string data_;
60};
61
62TEST_F(AttestationCAClientTest, EnrollRequest) {
63  AttestationCAClient client;
64  client.SendEnrollRequest(
65      "enroll",
66      base::Bind(&AttestationCAClientTest::DataCallback,
67                 base::Unretained(this)));
68  SendResponse(net::URLRequestStatus::SUCCESS, net::HTTP_OK);
69
70  EXPECT_EQ(1, num_invocations_);
71  EXPECT_TRUE(result_);
72  EXPECT_EQ("enroll_response", data_);
73}
74
75TEST_F(AttestationCAClientTest, CertificateRequest) {
76  AttestationCAClient client;
77  client.SendCertificateRequest(
78      "certificate",
79      base::Bind(&AttestationCAClientTest::DataCallback,
80                 base::Unretained(this)));
81  SendResponse(net::URLRequestStatus::SUCCESS, net::HTTP_OK);
82
83  EXPECT_EQ(1, num_invocations_);
84  EXPECT_TRUE(result_);
85  EXPECT_EQ("certificate_response", data_);
86}
87
88TEST_F(AttestationCAClientTest, CertificateRequestNetworkFailure) {
89  AttestationCAClient client;
90  client.SendCertificateRequest(
91      "certificate",
92      base::Bind(&AttestationCAClientTest::DataCallback,
93                 base::Unretained(this)));
94  SendResponse(net::URLRequestStatus::FAILED, net::HTTP_OK);
95
96  EXPECT_EQ(1, num_invocations_);
97  EXPECT_FALSE(result_);
98  EXPECT_EQ("", data_);
99}
100
101TEST_F(AttestationCAClientTest, CertificateRequestHttpError) {
102  AttestationCAClient client;
103  client.SendCertificateRequest(
104      "certificate",
105      base::Bind(&AttestationCAClientTest::DataCallback,
106                 base::Unretained(this)));
107  SendResponse(net::URLRequestStatus::SUCCESS, net::HTTP_NOT_FOUND);
108
109  EXPECT_EQ(1, num_invocations_);
110  EXPECT_FALSE(result_);
111  EXPECT_EQ("", data_);
112}
113
114TEST_F(AttestationCAClientTest, DeleteOnCallback) {
115  AttestationCAClient* client = new AttestationCAClient();
116  client->SendCertificateRequest(
117      "certificate",
118      base::Bind(&AttestationCAClientTest::DeleteClientDataCallback,
119                 base::Unretained(this),
120                 client));
121  SendResponse(net::URLRequestStatus::SUCCESS, net::HTTP_OK);
122
123  EXPECT_EQ(1, num_invocations_);
124  EXPECT_TRUE(result_);
125  EXPECT_EQ("certificate_response", data_);
126}
127
128}  // namespace attestation
129}  // namespace chromeos
130