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