1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "services/network/trust_tokens/trust_token_database_owner.h"
6 #include "base/task/post_task.h"
7 #include "base/test/bind.h"
8 #include "base/test/task_environment.h"
9 #include "base/threading/thread_task_runner_handle.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 namespace network {
13 
TEST(TrustTokenDatabaseOwner,Initializes)14 TEST(TrustTokenDatabaseOwner, Initializes) {
15   base::test::TaskEnvironment env;
16   std::unique_ptr<TrustTokenDatabaseOwner> owner;
17   TrustTokenDatabaseOwner::Create(
18       /*db_opener=*/base::BindOnce([](sql::Database* db) {
19         CHECK(db->OpenInMemory());
20         return true;
21       }),
22       base::ThreadTaskRunnerHandle::Get(),
23       /*flush_delay_for_writes=*/base::TimeDelta(),
24       /*on_done_initializing=*/
25       base::BindLambdaForTesting(
26           [&owner](std::unique_ptr<TrustTokenDatabaseOwner> created) {
27             owner = std::move(created);
28             base::RunLoop().Quit();
29           }));
30   env.RunUntilIdle();
31   ASSERT_TRUE(owner);
32   EXPECT_TRUE(owner->IssuerData());
33   EXPECT_TRUE(owner->IssuerToplevelPairData());
34   EXPECT_TRUE(owner->ToplevelData());
35 
36   owner.reset();
37   // Wait until TrustTokenDatabaseOwner finishes closing its database
38   // asynchronously, so as not to leak after the test concludes.
39   env.RunUntilIdle();
40 }
41 
TEST(TrustTokenDatabaseOwner,StillInitializesOnDbOpenFailure)42 TEST(TrustTokenDatabaseOwner, StillInitializesOnDbOpenFailure) {
43   base::test::TaskEnvironment env;
44 
45   // The database opener callback returning failure should still lead to a
46   // usable state (albeit not one that writes through to a database).
47   std::unique_ptr<TrustTokenDatabaseOwner> owner;
48   TrustTokenDatabaseOwner::Create(
49       /*db_opener=*/base::BindOnce([](sql::Database* unused) { return false; }),
50       base::ThreadTaskRunnerHandle::Get(),
51       /*flush_delay_for_writes=*/base::TimeDelta(),
52       /*on_done_initializing=*/
53       base::BindLambdaForTesting(
54           [&owner](std::unique_ptr<TrustTokenDatabaseOwner> created) {
55             owner = std::move(created);
56             base::RunLoop().Quit();
57           }));
58   env.RunUntilIdle();
59 
60   ASSERT_TRUE(owner);
61   EXPECT_TRUE(owner->IssuerData());
62   EXPECT_TRUE(owner->IssuerToplevelPairData());
63   EXPECT_TRUE(owner->ToplevelData());
64 
65   owner.reset();
66   // Wait until TrustTokenDatabaseOwner finishes closing its database
67   // asynchronously, so as not to leak after the test concludes.
68   env.RunUntilIdle();
69 }
70 
71 }  // namespace network
72