blob: 65428f2edf38dd292fd04545964b0feb8b15207b [file] [log] [blame]
jiayl@webrtc.org25484062015-02-18 23:58:16 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2015 The WebRTC project authors. All Rights Reserved.
jiayl@webrtc.org25484062015-02-18 23:58:16 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
jiayl@webrtc.org25484062015-02-18 23:58:16 +00009 */
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000010
Henrik Kjellander15583c12016-02-10 10:53:12 +010011#include "webrtc/api/dtlsidentitystore.h"
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000012
Henrik Kjellander15583c12016-02-10 10:53:12 +010013#include "webrtc/api/webrtcsessiondescriptionfactory.h"
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000014#include "webrtc/base/gunit.h"
15#include "webrtc/base/logging.h"
16#include "webrtc/base/ssladapter.h"
17
Henrik Boström5e56c592015-08-11 10:33:13 +020018using webrtc::DtlsIdentityStoreImpl;
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000019
20static const int kTimeoutMs = 10000;
21
22class MockDtlsIdentityRequestObserver :
Henrik Boström5e56c592015-08-11 10:33:13 +020023 public webrtc::DtlsIdentityRequestObserver {
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000024 public:
25 MockDtlsIdentityRequestObserver()
26 : call_back_called_(false), last_request_success_(false) {}
27 void OnFailure(int error) override {
28 EXPECT_FALSE(call_back_called_);
29 call_back_called_ = true;
30 last_request_success_ = false;
31 }
32 void OnSuccess(const std::string& der_cert,
Henrik Boström5e56c592015-08-11 10:33:13 +020033 const std::string& der_private_key) override {
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000034 LOG(LS_WARNING) << "The string version of OnSuccess is called unexpectedly";
35 EXPECT_TRUE(false);
36 }
Henrik Boström5e56c592015-08-11 10:33:13 +020037 void OnSuccess(rtc::scoped_ptr<rtc::SSLIdentity> identity) override {
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000038 EXPECT_FALSE(call_back_called_);
39 call_back_called_ = true;
40 last_request_success_ = true;
41 }
42
43 void Reset() {
44 call_back_called_ = false;
45 last_request_success_ = false;
46 }
47
48 bool LastRequestSucceeded() const {
49 return call_back_called_ && last_request_success_;
50 }
51
52 bool call_back_called() const {
53 return call_back_called_;
54 }
55
56 private:
57 bool call_back_called_;
58 bool last_request_success_;
59};
60
61class DtlsIdentityStoreTest : public testing::Test {
62 protected:
63 DtlsIdentityStoreTest()
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +000064 : worker_thread_(new rtc::Thread()),
Henrik Boström5e56c592015-08-11 10:33:13 +020065 store_(new DtlsIdentityStoreImpl(rtc::Thread::Current(),
66 worker_thread_.get())),
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000067 observer_(
68 new rtc::RefCountedObject<MockDtlsIdentityRequestObserver>()) {
henrikg91d6ede2015-09-17 00:24:34 -070069 RTC_CHECK(worker_thread_->Start());
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000070 }
71 ~DtlsIdentityStoreTest() {}
72
73 static void SetUpTestCase() {
74 rtc::InitializeSSL();
75 }
76 static void TearDownTestCase() {
77 rtc::CleanupSSL();
78 }
79
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +000080 rtc::scoped_ptr<rtc::Thread> worker_thread_;
Henrik Boström5e56c592015-08-11 10:33:13 +020081 rtc::scoped_ptr<DtlsIdentityStoreImpl> store_;
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000082 rtc::scoped_refptr<MockDtlsIdentityRequestObserver> observer_;
83};
84
Henrik Boström5e56c592015-08-11 10:33:13 +020085TEST_F(DtlsIdentityStoreTest, RequestIdentitySuccessRSA) {
hbos25359e02016-03-02 07:55:53 -080086 store_->RequestIdentity(rtc::KeyParams(rtc::KT_RSA),
87 rtc::Optional<uint64_t>(),
88 observer_.get());
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000089 EXPECT_TRUE_WAIT(observer_->LastRequestSucceeded(), kTimeoutMs);
90
Henrik Boström5e56c592015-08-11 10:33:13 +020091 EXPECT_TRUE_WAIT(store_->HasFreeIdentityForTesting(rtc::KT_RSA), kTimeoutMs);
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +000092
93 observer_->Reset();
94
95 // Verifies that the callback is async when a free identity is ready.
hbos25359e02016-03-02 07:55:53 -080096 store_->RequestIdentity(rtc::KeyParams(rtc::KT_RSA),
97 rtc::Optional<uint64_t>(),
98 observer_.get());
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +000099 EXPECT_FALSE(observer_->call_back_called());
100 EXPECT_TRUE_WAIT(observer_->LastRequestSucceeded(), kTimeoutMs);
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +0000101}
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +0000102
Henrik Boström5e56c592015-08-11 10:33:13 +0200103TEST_F(DtlsIdentityStoreTest, RequestIdentitySuccessECDSA) {
hbos25359e02016-03-02 07:55:53 -0800104 store_->RequestIdentity(rtc::KeyParams(rtc::KT_ECDSA),
105 rtc::Optional<uint64_t>(),
106 observer_.get());
Henrik Boström5e56c592015-08-11 10:33:13 +0200107 EXPECT_TRUE_WAIT(observer_->LastRequestSucceeded(), kTimeoutMs);
108
Taylor Brandstetter9cb23a32016-04-25 17:39:28 -0700109 // Since store currently does not preemptively generate free ECDSA identities
110 // we do not invoke HasFreeIdentityForTesting between requests.
111
Henrik Boström5e56c592015-08-11 10:33:13 +0200112 observer_->Reset();
113
114 // Verifies that the callback is async when a free identity is ready.
hbos25359e02016-03-02 07:55:53 -0800115 store_->RequestIdentity(rtc::KeyParams(rtc::KT_ECDSA),
116 rtc::Optional<uint64_t>(),
117 observer_.get());
Henrik Boström5e56c592015-08-11 10:33:13 +0200118 EXPECT_FALSE(observer_->call_back_called());
119 EXPECT_TRUE_WAIT(observer_->LastRequestSucceeded(), kTimeoutMs);
120}
121
122TEST_F(DtlsIdentityStoreTest, DeleteStoreEarlyNoCrashRSA) {
123 EXPECT_FALSE(store_->HasFreeIdentityForTesting(rtc::KT_RSA));
124
hbos25359e02016-03-02 07:55:53 -0800125 store_->RequestIdentity(rtc::KeyParams(rtc::KT_RSA),
126 rtc::Optional<uint64_t>(),
127 observer_.get());
Henrik Boström5e56c592015-08-11 10:33:13 +0200128 store_.reset();
129
130 worker_thread_->Stop();
131 EXPECT_FALSE(observer_->call_back_called());
132}
133
134TEST_F(DtlsIdentityStoreTest, DeleteStoreEarlyNoCrashECDSA) {
135 EXPECT_FALSE(store_->HasFreeIdentityForTesting(rtc::KT_ECDSA));
136
hbos25359e02016-03-02 07:55:53 -0800137 store_->RequestIdentity(rtc::KeyParams(rtc::KT_ECDSA),
138 rtc::Optional<uint64_t>(),
139 observer_.get());
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +0000140 store_.reset();
141
142 worker_thread_->Stop();
143 EXPECT_FALSE(observer_->call_back_called());
144}
145