blob: 31f0113f283752072fde47a018ee5556e58e4e57 [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
jbauch555604a2016-04-26 03:13:22 -070013#include <memory>
14
Henrik Kjellander15583c12016-02-10 10:53:12 +010015#include "webrtc/api/webrtcsessiondescriptionfactory.h"
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000016#include "webrtc/base/gunit.h"
17#include "webrtc/base/logging.h"
18#include "webrtc/base/ssladapter.h"
19
Henrik Boström5e56c592015-08-11 10:33:13 +020020using webrtc::DtlsIdentityStoreImpl;
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000021
22static const int kTimeoutMs = 10000;
23
24class MockDtlsIdentityRequestObserver :
Henrik Boström5e56c592015-08-11 10:33:13 +020025 public webrtc::DtlsIdentityRequestObserver {
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000026 public:
27 MockDtlsIdentityRequestObserver()
28 : call_back_called_(false), last_request_success_(false) {}
29 void OnFailure(int error) override {
30 EXPECT_FALSE(call_back_called_);
31 call_back_called_ = true;
32 last_request_success_ = false;
33 }
34 void OnSuccess(const std::string& der_cert,
Henrik Boström5e56c592015-08-11 10:33:13 +020035 const std::string& der_private_key) override {
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000036 LOG(LS_WARNING) << "The string version of OnSuccess is called unexpectedly";
37 EXPECT_TRUE(false);
38 }
jbauch555604a2016-04-26 03:13:22 -070039 void OnSuccess(std::unique_ptr<rtc::SSLIdentity> identity) override {
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000040 EXPECT_FALSE(call_back_called_);
41 call_back_called_ = true;
42 last_request_success_ = true;
43 }
44
45 void Reset() {
46 call_back_called_ = false;
47 last_request_success_ = false;
48 }
49
50 bool LastRequestSucceeded() const {
51 return call_back_called_ && last_request_success_;
52 }
53
54 bool call_back_called() const {
55 return call_back_called_;
56 }
57
58 private:
59 bool call_back_called_;
60 bool last_request_success_;
61};
62
63class DtlsIdentityStoreTest : public testing::Test {
64 protected:
65 DtlsIdentityStoreTest()
jiayl@webrtc.orgd83f4ef2015-03-13 21:26:12 +000066 : worker_thread_(new rtc::Thread()),
Henrik Boström5e56c592015-08-11 10:33:13 +020067 store_(new DtlsIdentityStoreImpl(rtc::Thread::Current(),
68 worker_thread_.get())),
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000069 observer_(
70 new rtc::RefCountedObject<MockDtlsIdentityRequestObserver>()) {
henrikg91d6ede2015-09-17 00:24:34 -070071 RTC_CHECK(worker_thread_->Start());
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000072 }
73 ~DtlsIdentityStoreTest() {}
74
75 static void SetUpTestCase() {
76 rtc::InitializeSSL();
77 }
78 static void TearDownTestCase() {
79 rtc::CleanupSSL();
80 }
81
jbauch555604a2016-04-26 03:13:22 -070082 std::unique_ptr<rtc::Thread> worker_thread_;
83 std::unique_ptr<DtlsIdentityStoreImpl> store_;
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000084 rtc::scoped_refptr<MockDtlsIdentityRequestObserver> observer_;
85};
86
Henrik Boström5e56c592015-08-11 10:33:13 +020087TEST_F(DtlsIdentityStoreTest, RequestIdentitySuccessRSA) {
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) {
hbos25359e02016-03-02 07:55:53 -0800106 store_->RequestIdentity(rtc::KeyParams(rtc::KT_ECDSA),
107 rtc::Optional<uint64_t>(),
108 observer_.get());
Henrik Boström5e56c592015-08-11 10:33:13 +0200109 EXPECT_TRUE_WAIT(observer_->LastRequestSucceeded(), kTimeoutMs);
110
Taylor Brandstetter9cb23a32016-04-25 17:39:28 -0700111 // Since store currently does not preemptively generate free ECDSA identities
112 // we do not invoke HasFreeIdentityForTesting between requests.
113
Henrik Boström5e56c592015-08-11 10:33:13 +0200114 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