1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/test/sequenced_worker_pool_owner.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/media/webrtc_identity_store.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/test_browser_thread_bundle.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/test_utils.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/net_errors.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "sql/connection.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "sql/test/test_helpers.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const char kFakeOrigin[] = "http://foo.com";
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const char kFakeIdentityName1[] = "name1";
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const char kFakeIdentityName2[] = "name2";
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const char kFakeCommonName1[] = "cname1";
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const char kFakeCommonName2[] = "cname2";
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic void OnRequestCompleted(bool* completed,
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                               std::string* out_cert,
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                               std::string* out_key,
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                               int error,
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                               const std::string& certificate,
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                               const std::string& private_key) {
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(net::OK, error);
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NE("", certificate);
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_NE("", private_key);
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  *completed = true;
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  *out_cert = certificate;
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  *out_key = private_key;
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass WebRTCIdentityStoreTest : public testing::Test {
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  WebRTCIdentityStoreTest()
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP |
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                               TestBrowserThreadBundle::REAL_DB_THREAD),
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        pool_owner_(
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            new base::SequencedWorkerPoolOwner(3, "WebRTCIdentityStoreTest")),
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        webrtc_identity_store_(
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            new WebRTCIdentityStore(base::FilePath(), NULL)) {
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    webrtc_identity_store_->SetTaskRunnerForTesting(pool_owner_->pool());
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~WebRTCIdentityStoreTest() {
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    pool_owner_->pool()->Shutdown();
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SetValidityPeriod(base::TimeDelta validity_period) {
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    webrtc_identity_store_->SetValidityPeriodForTesting(validity_period);
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void RunUntilIdle() {
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RunAllPendingInMessageLoop(BrowserThread::DB);
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RunAllPendingInMessageLoop(BrowserThread::IO);
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    pool_owner_->pool()->FlushForTesting();
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::RunLoop().RunUntilIdle();
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure RequestIdentityAndRunUtilIdle(const std::string& origin,
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              const std::string& identity_name,
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              const std::string& common_name,
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              bool* completed,
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              std::string* certificate,
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                              std::string* private_key) {
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    base::Closure cancel_callback = webrtc_identity_store_->RequestIdentity(
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        GURL(origin),
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        identity_name,
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        common_name,
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        base::Bind(&OnRequestCompleted, completed, certificate, private_key));
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    EXPECT_FALSE(cancel_callback.is_null());
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    RunUntilIdle();
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return cancel_callback;
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void Restart(const base::FilePath& path) {
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    webrtc_identity_store_ = new WebRTCIdentityStore(path, NULL);
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    webrtc_identity_store_->SetTaskRunnerForTesting(pool_owner_->pool());
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  TestBrowserThreadBundle browser_thread_bundle_;
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::SequencedWorkerPoolOwner> pool_owner_;
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_refptr<WebRTCIdentityStore> webrtc_identity_store_;
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(WebRTCIdentityStoreTest, RequestIdentity) {
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool completed = false;
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string dummy;
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::Closure cancel_callback =
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      RequestIdentityAndRunUtilIdle(kFakeOrigin,
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeIdentityName1,
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeCommonName1,
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &completed,
102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &dummy,
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &dummy);
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(completed);
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(WebRTCIdentityStoreTest, CancelRequest) {
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool completed = false;
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string dummy;
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback = webrtc_identity_store_->RequestIdentity(
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(kFakeOrigin),
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeIdentityName1,
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeCommonName1,
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&OnRequestCompleted, &completed, &dummy, &dummy));
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_FALSE(cancel_callback.is_null());
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cancel_callback.Run();
117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RunUntilIdle();
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(completed);
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(WebRTCIdentityStoreTest, ConcurrentUniqueRequests) {
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool completed_1 = false;
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool completed_2 = false;
125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string dummy;
126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_1 = webrtc_identity_store_->RequestIdentity(
127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(kFakeOrigin),
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeIdentityName1,
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeCommonName1,
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&OnRequestCompleted, &completed_1, &dummy, &dummy));
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_FALSE(cancel_callback_1.is_null());
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_2 = webrtc_identity_store_->RequestIdentity(
134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(kFakeOrigin),
135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeIdentityName2,
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeCommonName1,
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&OnRequestCompleted, &completed_2, &dummy, &dummy));
138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_FALSE(cancel_callback_2.is_null());
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RunUntilIdle();
141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(completed_1);
142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(completed_2);
143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(WebRTCIdentityStoreTest, DifferentCommonNameReturnNewIdentity) {
146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool completed_1 = false;
147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool completed_2 = false;
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string cert_1, cert_2, key_1, key_2;
149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_1 =
151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      RequestIdentityAndRunUtilIdle(kFakeOrigin,
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeIdentityName1,
153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeCommonName1,
154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &completed_1,
155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &cert_1,
156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &key_1);
157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::Closure cancel_callback_2 =
159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      RequestIdentityAndRunUtilIdle(kFakeOrigin,
160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeIdentityName1,
161ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeCommonName2,
162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &completed_2,
163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &cert_2,
164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &key_2);
165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(completed_1);
167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(completed_2);
168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_NE(cert_1, cert_2);
169ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_NE(key_1, key_2);
170ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
171ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(WebRTCIdentityStoreTest, SerialIdenticalRequests) {
173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool completed_1 = false;
174ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool completed_2 = false;
175ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string cert_1, cert_2, key_1, key_2;
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_1 =
178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      RequestIdentityAndRunUtilIdle(kFakeOrigin,
179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeIdentityName1,
180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeCommonName1,
181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &completed_1,
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &cert_1,
183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &key_1);
184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_2 =
186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      RequestIdentityAndRunUtilIdle(kFakeOrigin,
187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeIdentityName1,
188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeCommonName1,
189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &completed_2,
190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &cert_2,
191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &key_2);
192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(completed_1);
194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(completed_2);
195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(cert_1, cert_2);
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(key_1, key_2);
197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(WebRTCIdentityStoreTest, ConcurrentIdenticalRequestsJoined) {
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool completed_1 = false;
201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool completed_2 = false;
202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string cert_1, cert_2, key_1, key_2;
203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_1 = webrtc_identity_store_->RequestIdentity(
205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(kFakeOrigin),
206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeIdentityName1,
207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeCommonName1,
208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&OnRequestCompleted, &completed_1, &cert_1, &key_1));
209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_FALSE(cancel_callback_1.is_null());
210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_2 = webrtc_identity_store_->RequestIdentity(
212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(kFakeOrigin),
213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeIdentityName1,
214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeCommonName1,
215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&OnRequestCompleted, &completed_2, &cert_2, &key_2));
216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_FALSE(cancel_callback_2.is_null());
217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RunUntilIdle();
219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(completed_1);
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(completed_2);
221ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(cert_1, cert_2);
222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_EQ(key_1, key_2);
223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(WebRTCIdentityStoreTest, CancelOneOfIdenticalRequests) {
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool completed_1 = false;
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool completed_2 = false;
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string cert_1, cert_2, key_1, key_2;
229ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
230ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_1 = webrtc_identity_store_->RequestIdentity(
231ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(kFakeOrigin),
232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeIdentityName1,
233ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeCommonName1,
234ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&OnRequestCompleted, &completed_1, &cert_1, &key_1));
235ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_FALSE(cancel_callback_1.is_null());
236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
237ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_2 = webrtc_identity_store_->RequestIdentity(
238ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(kFakeOrigin),
239ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeIdentityName1,
240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kFakeCommonName1,
241ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&OnRequestCompleted, &completed_2, &cert_2, &key_2));
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_FALSE(cancel_callback_2.is_null());
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  cancel_callback_1.Run();
245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RunUntilIdle();
247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_FALSE(completed_1);
248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_TRUE(completed_2);
249ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
250ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
251ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(WebRTCIdentityStoreTest, DeleteDataAndGenerateNewIdentity) {
252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool completed_1 = false;
253ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool completed_2 = false;
254ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string cert_1, cert_2, key_1, key_2;
255ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
256ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Generate the first identity.
257ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_1 =
258ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      RequestIdentityAndRunUtilIdle(kFakeOrigin,
259ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeIdentityName1,
260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeCommonName1,
261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &completed_1,
262ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &cert_1,
263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &key_1);
264ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
265ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Clear the data and the second request should return a new identity.
266ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  webrtc_identity_store_->DeleteBetween(
267ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Time(), base::Time::Now(), base::Bind(&base::DoNothing));
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  RunUntilIdle();
269ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
270ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  base::Closure cancel_callback_2 =
271ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      RequestIdentityAndRunUtilIdle(kFakeOrigin,
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeIdentityName1,
273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    kFakeCommonName1,
274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &completed_2,
275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &cert_2,
276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                    &key_2);
277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
278eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(completed_1);
279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(completed_2);
280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_NE(cert_1, cert_2);
281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  EXPECT_NE(key_1, key_2);
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(WebRTCIdentityStoreTest, ExpiredIdentityDeleted) {
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The identities will expire immediately after creation.
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SetValidityPeriod(base::TimeDelta::FromMilliseconds(0));
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool completed_1 = false;
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool completed_2 = false;
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string cert_1, cert_2, key_1, key_2;
2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::Closure cancel_callback_1 =
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      RequestIdentityAndRunUtilIdle(kFakeOrigin,
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    kFakeIdentityName1,
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    kFakeCommonName1,
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &completed_1,
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &cert_1,
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &key_1);
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(completed_1);
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Check that the old identity is not returned.
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::Closure cancel_callback_2 =
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      RequestIdentityAndRunUtilIdle(kFakeOrigin,
3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    kFakeIdentityName1,
3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    kFakeCommonName1,
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &completed_2,
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &cert_2,
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &key_2);
3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(completed_2);
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_NE(cert_1, cert_2);
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_NE(key_1, key_2);
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(WebRTCIdentityStoreTest, IdentityPersistentAcrossRestart) {
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::ScopedTempDir temp_dir;
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Restart(temp_dir.path());
3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool completed_1 = false;
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool completed_2 = false;
3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string cert_1, cert_2, key_1, key_2;
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Creates an identity.
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::Closure cancel_callback_1 =
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      RequestIdentityAndRunUtilIdle(kFakeOrigin,
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    kFakeIdentityName1,
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    kFakeCommonName1,
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &completed_1,
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &cert_1,
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &key_1);
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(completed_1);
3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Restart(temp_dir.path());
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Check that the same identity is returned after the restart.
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::Closure cancel_callback_2 =
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      RequestIdentityAndRunUtilIdle(kFakeOrigin,
3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    kFakeIdentityName1,
3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    kFakeCommonName1,
3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &completed_2,
3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &cert_2,
3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    &key_2);
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(completed_2);
3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(cert_1, cert_2);
3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(key_1, key_2);
3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(WebRTCIdentityStoreTest, HandleDBErrors) {
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ScopedTempDir temp_dir;
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Restart(temp_dir.path());
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool completed_1 = false;
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string cert_1, key_1;
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Creates an identity.
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RequestIdentityAndRunUtilIdle(kFakeOrigin,
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                kFakeIdentityName1,
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                kFakeCommonName1,
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                &completed_1,
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                &cert_1,
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                &key_1);
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Make the table corrupted.
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath db_path =
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      temp_dir.path().Append(FILE_PATH_LITERAL("WebRTCIdentityStore"));
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(sql::test::CorruptSizeInHeader(db_path));
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Reset to commit the DB changes, which should fail and not crash.
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  webrtc_identity_store_ = NULL;
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunUntilIdle();
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Verifies the corrupted table was razed.
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<sql::Connection> db(new sql::Connection());
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(db->Open(db_path));
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0U, sql::test::CountSQLTables(db.get()));
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
380