1 // Copyright 2019 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 ////////////////////////////////////////////////////////////////////////////////
16
17 #include "tink/kms_clients.h"
18
19 #include <memory>
20 #include <string>
21
22 #include "gtest/gtest.h"
23 #include "absl/status/status.h"
24 #include "absl/strings/string_view.h"
25 #include "tink/aead.h"
26 #include "tink/kms_client.h"
27 #include "tink/util/status.h"
28 #include "tink/util/statusor.h"
29 #include "tink/util/test_matchers.h"
30 #include "tink/util/test_util.h"
31
32 namespace crypto {
33 namespace tink {
34 namespace {
35
36 using crypto::tink::test::IsOk;
37 using crypto::tink::test::StatusIs;
38 using crypto::tink::test::DummyKmsClient;
39
TEST(KmsClientsTest,Empty)40 TEST(KmsClientsTest, Empty) {
41 auto client_result = KmsClients::Get("some uri");
42 EXPECT_THAT(client_result.status(), StatusIs(absl::StatusCode::kNotFound));
43
44 client_result = KmsClients::Get("");
45 EXPECT_THAT(client_result.status(),
46 StatusIs(absl::StatusCode::kInvalidArgument));
47
48 auto status = KmsClients::Add(nullptr);
49 EXPECT_THAT(status, StatusIs(absl::StatusCode::kInvalidArgument));
50 }
51
52 struct UriData {
53 std::string prefix;
54 std::string uri;
55 };
56
TEST(KmsClientsTest,AddAndGet)57 TEST(KmsClientsTest, AddAndGet) {
58 UriData data_1 = {"prefix1", "prefix1:uri1"};
59 UriData data_2 = {"prefix1", "prefix1:uri2"};
60 UriData data_3 = {"prefix2", "prefix2:uri42"};
61
62 // Add client for data_1, and verify it.
63 auto status = KmsClients::Add(
64 absl::make_unique<DummyKmsClient>(data_1.prefix, data_1.uri));
65 EXPECT_THAT(status, IsOk());
66 auto client_result = KmsClients::Get(data_1.uri);
67 EXPECT_THAT(client_result, IsOk());
68 EXPECT_TRUE(client_result.value()->DoesSupport(data_1.uri));
69 EXPECT_FALSE(client_result.value()->DoesSupport(data_2.uri));
70
71 // Verify there is no client for data_2.
72 client_result = KmsClients::Get(data_2.uri);
73 EXPECT_THAT(client_result.status(), StatusIs(absl::StatusCode::kNotFound));
74
75 // Add client for data_2, and verify it.
76 status = KmsClients::Add(
77 absl::make_unique<DummyKmsClient>(data_2.prefix, data_2.uri));
78 EXPECT_THAT(status, IsOk());
79 client_result = KmsClients::Get(data_2.uri);
80 EXPECT_THAT(client_result, IsOk());
81 EXPECT_TRUE(client_result.value()->DoesSupport(data_2.uri));
82 EXPECT_FALSE(client_result.value()->DoesSupport(data_1.uri));
83
84 // Verify there is no client for data_3.
85 client_result = KmsClients::Get(data_3.uri);
86 EXPECT_THAT(client_result.status(), StatusIs(absl::StatusCode::kNotFound));
87
88 // Add client for data_3, and verify it.
89 status = KmsClients::Add(
90 absl::make_unique<DummyKmsClient>(data_3.prefix, data_3.uri));
91 EXPECT_THAT(status, IsOk());
92 client_result = KmsClients::Get(data_3.uri);
93 EXPECT_THAT(client_result, IsOk());
94 EXPECT_TRUE(client_result.value()->DoesSupport(data_3.uri));
95 EXPECT_FALSE(client_result.value()->DoesSupport(data_2.uri));
96 EXPECT_FALSE(client_result.value()->DoesSupport(data_1.uri));
97
98 // Verify that clients for data_1 and data_2 are still present.
99 client_result = KmsClients::Get(data_1.uri);
100 EXPECT_THAT(client_result, IsOk());
101 EXPECT_TRUE(client_result.value()->DoesSupport(data_1.uri));
102 EXPECT_FALSE(client_result.value()->DoesSupport(data_2.uri));
103
104 client_result = KmsClients::Get(data_2.uri);
105 EXPECT_THAT(client_result, IsOk());
106 EXPECT_TRUE(client_result.value()->DoesSupport(data_2.uri));
107 EXPECT_FALSE(client_result.value()->DoesSupport(data_1.uri));
108 }
109
110
111 } // namespace
112 } // namespace tink
113 } // namespace crypto
114