Home | History | Annotate | Download | only in attestation
      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 
     15 namespace chromeos {
     16 namespace attestation {
     17 
     18 class 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 
     62 TEST_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 
     75 TEST_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 
     88 TEST_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 
    101 TEST_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 
    114 TEST_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