blob: 809e885216c2c4edcfe409064b470f9be18687c0 [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) {
86 EXPECT_TRUE_WAIT(store_->HasFreeIdentityForTesting(rtc::KT_RSA), kTimeoutMs);
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000087
hbos25359e02016-03-02 07:55:53 -080088 store_->RequestIdentity(rtc::KeyParams(rtc::KT_RSA),
89 rtc::Optional<uint64_t>(),
90 observer_.get());
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000091 EXPECT_TRUE_WAIT(observer_->LastRequestSucceeded(), kTimeoutMs);
92
Henrik Boström5e56c592015-08-11 10:33:13 +020093 EXPECT_TRUE_WAIT(store_->HasFreeIdentityForTesting(rtc::KT_RSA), kTimeoutMs);
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +000094
95 observer_->Reset();
96
97 // Verifies that the callback is async when a free identity is ready.
hbos25359e02016-03-02 07:55:53 -080098 store_->RequestIdentity(rtc::KeyParams(rtc::KT_RSA),
99 rtc::Optional<uint64_t>(),
100 observer_.get());
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +0000101 EXPECT_FALSE(observer_->call_back_called());
102 EXPECT_TRUE_WAIT(observer_->LastRequestSucceeded(), kTimeoutMs);
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +0000103}
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +0000104
Henrik Boström5e56c592015-08-11 10:33:13 +0200105TEST_F(DtlsIdentityStoreTest, RequestIdentitySuccessECDSA) {
106 // Since store currently does not preemptively generate free ECDSA identities
107 // we do not invoke HasFreeIdentityForTesting between requests.
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +0000108
hbos25359e02016-03-02 07:55:53 -0800109 store_->RequestIdentity(rtc::KeyParams(rtc::KT_ECDSA),
110 rtc::Optional<uint64_t>(),
111 observer_.get());
Henrik Boström5e56c592015-08-11 10:33:13 +0200112 EXPECT_TRUE_WAIT(observer_->LastRequestSucceeded(), kTimeoutMs);
113
114 observer_->Reset();
115
116 // Verifies that the callback is async when a free identity is ready.
hbos25359e02016-03-02 07:55:53 -0800117 store_->RequestIdentity(rtc::KeyParams(rtc::KT_ECDSA),
118 rtc::Optional<uint64_t>(),
119 observer_.get());
Henrik Boström5e56c592015-08-11 10:33:13 +0200120 EXPECT_FALSE(observer_->call_back_called());
121 EXPECT_TRUE_WAIT(observer_->LastRequestSucceeded(), kTimeoutMs);
122}
123
124TEST_F(DtlsIdentityStoreTest, DeleteStoreEarlyNoCrashRSA) {
125 EXPECT_FALSE(store_->HasFreeIdentityForTesting(rtc::KT_RSA));
126
hbos25359e02016-03-02 07:55:53 -0800127 store_->RequestIdentity(rtc::KeyParams(rtc::KT_RSA),
128 rtc::Optional<uint64_t>(),
129 observer_.get());
Henrik Boström5e56c592015-08-11 10:33:13 +0200130 store_.reset();
131
132 worker_thread_->Stop();
133 EXPECT_FALSE(observer_->call_back_called());
134}
135
136TEST_F(DtlsIdentityStoreTest, DeleteStoreEarlyNoCrashECDSA) {
137 EXPECT_FALSE(store_->HasFreeIdentityForTesting(rtc::KT_ECDSA));
138
hbos25359e02016-03-02 07:55:53 -0800139 store_->RequestIdentity(rtc::KeyParams(rtc::KT_ECDSA),
140 rtc::Optional<uint64_t>(),
141 observer_.get());
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +0000142 store_.reset();
143
144 worker_thread_->Stop();
145 EXPECT_FALSE(observer_->call_back_called());
146}
147