// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/bind.h" #include "base/message_loop/message_loop.h" #include "chrome/browser/chromeos/attestation/attestation_ca_client.h" #include "content/public/test/test_browser_thread.h" #include "net/http/http_status_code.h" #include "net/url_request/test_url_fetcher_factory.h" #include "net/url_request/url_fetcher.h" #include "net/url_request/url_request_status.h" #include "testing/gtest/include/gtest/gtest.h" namespace chromeos { namespace attestation { class AttestationCAClientTest : public ::testing::Test { public: AttestationCAClientTest() : io_thread_(content::BrowserThread::IO, &message_loop_), num_invocations_(0), result_(false) { } virtual ~AttestationCAClientTest() { } void DataCallback (bool result, const std::string& data) { ++num_invocations_; result_ = result; data_ = data; } void DeleteClientDataCallback (AttestationCAClient* client, bool result, const std::string& data) { delete client; DataCallback(result, data); } protected: void SendResponse(net::URLRequestStatus::Status status, int response_code) { net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); CHECK(fetcher); fetcher->set_status(net::URLRequestStatus(status, 0)); fetcher->set_response_code(response_code); fetcher->SetResponseString(fetcher->upload_data() + "_response"); fetcher->delegate()->OnURLFetchComplete(fetcher); } base::MessageLoop message_loop_; content::TestBrowserThread io_thread_; net::TestURLFetcherFactory url_fetcher_factory_; // For use with DataCallback. int num_invocations_; bool result_; std::string data_; }; TEST_F(AttestationCAClientTest, EnrollRequest) { AttestationCAClient client; client.SendEnrollRequest( "enroll", base::Bind(&AttestationCAClientTest::DataCallback, base::Unretained(this))); SendResponse(net::URLRequestStatus::SUCCESS, net::HTTP_OK); EXPECT_EQ(1, num_invocations_); EXPECT_TRUE(result_); EXPECT_EQ("enroll_response", data_); } TEST_F(AttestationCAClientTest, CertificateRequest) { AttestationCAClient client; client.SendCertificateRequest( "certificate", base::Bind(&AttestationCAClientTest::DataCallback, base::Unretained(this))); SendResponse(net::URLRequestStatus::SUCCESS, net::HTTP_OK); EXPECT_EQ(1, num_invocations_); EXPECT_TRUE(result_); EXPECT_EQ("certificate_response", data_); } TEST_F(AttestationCAClientTest, CertificateRequestNetworkFailure) { AttestationCAClient client; client.SendCertificateRequest( "certificate", base::Bind(&AttestationCAClientTest::DataCallback, base::Unretained(this))); SendResponse(net::URLRequestStatus::FAILED, net::HTTP_OK); EXPECT_EQ(1, num_invocations_); EXPECT_FALSE(result_); EXPECT_EQ("", data_); } TEST_F(AttestationCAClientTest, CertificateRequestHttpError) { AttestationCAClient client; client.SendCertificateRequest( "certificate", base::Bind(&AttestationCAClientTest::DataCallback, base::Unretained(this))); SendResponse(net::URLRequestStatus::SUCCESS, net::HTTP_NOT_FOUND); EXPECT_EQ(1, num_invocations_); EXPECT_FALSE(result_); EXPECT_EQ("", data_); } TEST_F(AttestationCAClientTest, DeleteOnCallback) { AttestationCAClient* client = new AttestationCAClient(); client->SendCertificateRequest( "certificate", base::Bind(&AttestationCAClientTest::DeleteClientDataCallback, base::Unretained(this), client)); SendResponse(net::URLRequestStatus::SUCCESS, net::HTTP_OK); EXPECT_EQ(1, num_invocations_); EXPECT_TRUE(result_); EXPECT_EQ("certificate_response", data_); } } // namespace attestation } // namespace chromeos