1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
4  * You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #include "mozilla/KeyValueStorage.h"
7 
8 #include "gmock/gmock.h"
9 #include "gtest/gtest-printers.h"
10 #include "gtest/gtest.h"
11 
12 #include "GMPTestMonitor.h"
13 
14 using ::testing::Return;
15 using namespace mozilla;
16 
TEST(TestKeyValueStorage,BasicPutGet)17 TEST(TestKeyValueStorage, BasicPutGet)
18 {
19   auto kvs = MakeRefPtr<KeyValueStorage>();
20 
21   nsCString name("database_name");
22   nsCString key("key1");
23   int32_t value = 100;
24 
25   GMPTestMonitor mon;
26 
27   kvs->Put(name, key, value)
28       ->Then(
29           GetCurrentThreadSerialEventTarget(), __func__,
30           [&](bool) { return kvs->Get(name, key); },
31           [](nsresult rv) {
32             EXPECT_TRUE(false) << "Put promise has been rejected";
33             return KeyValueStorage::GetPromise::CreateAndReject(rv, __func__);
34           })
35       ->Then(
36           GetCurrentThreadSerialEventTarget(), __func__,
37           [&](int32_t aValue) {
38             EXPECT_EQ(aValue, value) << "Values are the same";
39             mon.SetFinished();
40           },
41           [&](nsresult rv) {
42             EXPECT_TRUE(false) << "Get Promise has been rejected";
43             mon.SetFinished();
44           });
45 
46   mon.AwaitFinished();
47 }
48 
TEST(TestKeyValueStorage,GetNonExistedKey)49 TEST(TestKeyValueStorage, GetNonExistedKey)
50 {
51   auto kvs = MakeRefPtr<KeyValueStorage>();
52 
53   nsCString name("database_name");
54   nsCString key("NonExistedKey");
55 
56   GMPTestMonitor mon;
57 
58   kvs->Get(name, key)->Then(
59       GetCurrentThreadSerialEventTarget(), __func__,
60       [&mon](int32_t aValue) {
61         EXPECT_EQ(aValue, -1) << "When key does not exist return -1";
62         mon.SetFinished();
63       },
64       [&mon](nsresult rv) {
65         EXPECT_TRUE(false) << "Get Promise has been rejected";
66         mon.SetFinished();
67       });
68 
69   mon.AwaitFinished();
70 }
71 
TEST(TestKeyValueStorage,Clear)72 TEST(TestKeyValueStorage, Clear)
73 {
74   auto kvs = MakeRefPtr<KeyValueStorage>();
75 
76   nsCString name("database_name");
77   nsCString key("key1");
78   int32_t value = 100;
79 
80   GMPTestMonitor mon;
81 
82   kvs->Put(name, key, value)
83       ->Then(
84           GetCurrentThreadSerialEventTarget(), __func__,
85           [&](bool) { return kvs->Clear(name); },
86           [](nsresult rv) {
87             EXPECT_TRUE(false) << "Put promise has been rejected";
88             return GenericPromise::CreateAndReject(rv, __func__);
89           })
90       ->Then(
91           GetCurrentThreadSerialEventTarget(), __func__,
92           [&](bool) { return kvs->Get(name, key); },
93           [](nsresult rv) {
94             EXPECT_TRUE(false) << "Clear promise has been rejected";
95             return KeyValueStorage::GetPromise::CreateAndReject(rv, __func__);
96           })
97       ->Then(
98           GetCurrentThreadSerialEventTarget(), __func__,
99           [&](int32_t aValue) {
100             EXPECT_EQ(aValue, -1) << "After clear the key does not exist";
101             mon.SetFinished();
102           },
103           [&](nsresult rv) {
104             EXPECT_TRUE(false) << "Get Promise has been rejected";
105             mon.SetFinished();
106           });
107 
108   mon.AwaitFinished();
109 }
110