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