xref: /aosp_15_r20/external/tink/cc/internal/serialization_registry_test.cc (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang // Copyright 2023 Google LLC
2*e7b1675dSTing-Kang Chang //
3*e7b1675dSTing-Kang Chang // Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang // you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang // You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang //
7*e7b1675dSTing-Kang Chang //      http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang //
9*e7b1675dSTing-Kang Chang // Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang // distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang // See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang // limitations under the License.
14*e7b1675dSTing-Kang Chang //
15*e7b1675dSTing-Kang Chang ////////////////////////////////////////////////////////////////////////////////
16*e7b1675dSTing-Kang Chang 
17*e7b1675dSTing-Kang Chang #include "tink/internal/serialization_registry.h"
18*e7b1675dSTing-Kang Chang 
19*e7b1675dSTing-Kang Chang #include <memory>
20*e7b1675dSTing-Kang Chang #include <string_view>
21*e7b1675dSTing-Kang Chang #include <typeindex>
22*e7b1675dSTing-Kang Chang #include <utility>
23*e7b1675dSTing-Kang Chang 
24*e7b1675dSTing-Kang Chang #include "gmock/gmock.h"
25*e7b1675dSTing-Kang Chang #include "gtest/gtest.h"
26*e7b1675dSTing-Kang Chang #include "absl/status/status.h"
27*e7b1675dSTing-Kang Chang #include "tink/insecure_secret_key_access.h"
28*e7b1675dSTing-Kang Chang #include "tink/internal/key_parser.h"
29*e7b1675dSTing-Kang Chang #include "tink/internal/key_serializer.h"
30*e7b1675dSTing-Kang Chang #include "tink/internal/parameters_parser.h"
31*e7b1675dSTing-Kang Chang #include "tink/internal/parameters_serializer.h"
32*e7b1675dSTing-Kang Chang #include "tink/internal/serialization.h"
33*e7b1675dSTing-Kang Chang #include "tink/internal/serialization_test_util.h"
34*e7b1675dSTing-Kang Chang #include "tink/key.h"
35*e7b1675dSTing-Kang Chang #include "tink/parameters.h"
36*e7b1675dSTing-Kang Chang #include "tink/secret_key_access_token.h"
37*e7b1675dSTing-Kang Chang #include "tink/util/status.h"
38*e7b1675dSTing-Kang Chang #include "tink/util/statusor.h"
39*e7b1675dSTing-Kang Chang #include "tink/util/test_matchers.h"
40*e7b1675dSTing-Kang Chang 
41*e7b1675dSTing-Kang Chang namespace crypto {
42*e7b1675dSTing-Kang Chang namespace tink {
43*e7b1675dSTing-Kang Chang namespace internal {
44*e7b1675dSTing-Kang Chang 
45*e7b1675dSTing-Kang Chang using ::crypto::tink::test::IsOk;
46*e7b1675dSTing-Kang Chang using ::crypto::tink::test::StatusIs;
47*e7b1675dSTing-Kang Chang using ::testing::Eq;
48*e7b1675dSTing-Kang Chang using ::testing::IsFalse;
49*e7b1675dSTing-Kang Chang using ::testing::IsTrue;
50*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,ParseParameters)51*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, ParseParameters) {
52*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
53*e7b1675dSTing-Kang Chang   ParametersParserImpl<NoIdSerialization, NoIdParams> parser1(kNoIdTypeUrl,
54*e7b1675dSTing-Kang Chang                                                               ParseNoIdParams);
55*e7b1675dSTing-Kang Chang   ParametersParserImpl<IdParamsSerialization, IdParams> parser2(kIdTypeUrl,
56*e7b1675dSTing-Kang Chang                                                                 ParseIdParams);
57*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterParametersParser(&parser1), IsOk());
58*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterParametersParser(&parser2), IsOk());
59*e7b1675dSTing-Kang Chang 
60*e7b1675dSTing-Kang Chang   SerializationRegistry registry = builder.Build();
61*e7b1675dSTing-Kang Chang 
62*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> no_id_params =
63*e7b1675dSTing-Kang Chang       registry.ParseParameters(NoIdSerialization());
64*e7b1675dSTing-Kang Chang   ASSERT_THAT(no_id_params, IsOk());
65*e7b1675dSTing-Kang Chang   EXPECT_THAT((*no_id_params)->HasIdRequirement(), IsFalse());
66*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**no_id_params)),
67*e7b1675dSTing-Kang Chang               std::type_index(typeid(NoIdParams)));
68*e7b1675dSTing-Kang Chang 
69*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> id_params =
70*e7b1675dSTing-Kang Chang       registry.ParseParameters(IdParamsSerialization());
71*e7b1675dSTing-Kang Chang   ASSERT_THAT(id_params, IsOk());
72*e7b1675dSTing-Kang Chang   EXPECT_THAT((*id_params)->HasIdRequirement(), IsTrue());
73*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**id_params)),
74*e7b1675dSTing-Kang Chang               std::type_index(typeid(IdParams)));
75*e7b1675dSTing-Kang Chang }
76*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,ParseParametersWithoutRegistration)77*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, ParseParametersWithoutRegistration) {
78*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
79*e7b1675dSTing-Kang Chang   SerializationRegistry registry = builder.Build();
80*e7b1675dSTing-Kang Chang 
81*e7b1675dSTing-Kang Chang   ASSERT_THAT(registry.ParseParameters(NoIdSerialization()).status(),
82*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kNotFound));
83*e7b1675dSTing-Kang Chang }
84*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,RegisterSameParametersParser)85*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, RegisterSameParametersParser) {
86*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
87*e7b1675dSTing-Kang Chang   ParametersParserImpl<NoIdSerialization, NoIdParams> parser(kNoIdTypeUrl,
88*e7b1675dSTing-Kang Chang                                                              ParseNoIdParams);
89*e7b1675dSTing-Kang Chang 
90*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterParametersParser(&parser), IsOk());
91*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterParametersParser(&parser), IsOk());
92*e7b1675dSTing-Kang Chang }
93*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,RegisterDifferentParametersParserWithSameIndex)94*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest,
95*e7b1675dSTing-Kang Chang      RegisterDifferentParametersParserWithSameIndex) {
96*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
97*e7b1675dSTing-Kang Chang   ParametersParserImpl<NoIdSerialization, NoIdParams> parser1(kNoIdTypeUrl,
98*e7b1675dSTing-Kang Chang                                                               ParseNoIdParams);
99*e7b1675dSTing-Kang Chang   ParametersParserImpl<NoIdSerialization, NoIdParams> parser2(kNoIdTypeUrl,
100*e7b1675dSTing-Kang Chang                                                               ParseNoIdParams);
101*e7b1675dSTing-Kang Chang 
102*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterParametersParser(&parser1), IsOk());
103*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterParametersParser(&parser2),
104*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kAlreadyExists));
105*e7b1675dSTing-Kang Chang }
106*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,SerializeParameters)107*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, SerializeParameters) {
108*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
109*e7b1675dSTing-Kang Chang   ParametersSerializerImpl<NoIdParams, NoIdSerialization> serializer1(
110*e7b1675dSTing-Kang Chang       kNoIdTypeUrl, SerializeNoIdParams);
111*e7b1675dSTing-Kang Chang   ParametersSerializerImpl<IdParams, IdParamsSerialization> serializer2(
112*e7b1675dSTing-Kang Chang       kIdTypeUrl, SerializeIdParams);
113*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterParametersSerializer(&serializer1), IsOk());
114*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterParametersSerializer(&serializer2), IsOk());
115*e7b1675dSTing-Kang Chang 
116*e7b1675dSTing-Kang Chang   SerializationRegistry registry = builder.Build();
117*e7b1675dSTing-Kang Chang 
118*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialization1 =
119*e7b1675dSTing-Kang Chang       registry.SerializeParameters<NoIdSerialization>(NoIdParams());
120*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialization1, IsOk());
121*e7b1675dSTing-Kang Chang   EXPECT_THAT((*serialization1)->ObjectIdentifier(), Eq(kNoIdTypeUrl));
122*e7b1675dSTing-Kang Chang 
123*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialization2 =
124*e7b1675dSTing-Kang Chang       registry.SerializeParameters<IdParamsSerialization>(IdParams());
125*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialization2, IsOk());
126*e7b1675dSTing-Kang Chang   EXPECT_THAT((*serialization2)->ObjectIdentifier(), Eq(kIdTypeUrl));
127*e7b1675dSTing-Kang Chang }
128*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,SerializeParametersWithoutRegistration)129*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, SerializeParametersWithoutRegistration) {
130*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
131*e7b1675dSTing-Kang Chang   SerializationRegistry registry = builder.Build();
132*e7b1675dSTing-Kang Chang 
133*e7b1675dSTing-Kang Chang   ASSERT_THAT(
134*e7b1675dSTing-Kang Chang       registry.SerializeParameters<NoIdSerialization>(NoIdParams()).status(),
135*e7b1675dSTing-Kang Chang       StatusIs(absl::StatusCode::kNotFound));
136*e7b1675dSTing-Kang Chang }
137*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,RegisterSameParametersSerializer)138*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, RegisterSameParametersSerializer) {
139*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
140*e7b1675dSTing-Kang Chang   ParametersSerializerImpl<NoIdParams, NoIdSerialization> serializer(
141*e7b1675dSTing-Kang Chang       kNoIdTypeUrl, SerializeNoIdParams);
142*e7b1675dSTing-Kang Chang 
143*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterParametersSerializer(&serializer), IsOk());
144*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterParametersSerializer(&serializer), IsOk());
145*e7b1675dSTing-Kang Chang }
146*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,RegisterDifferentParametersSerializerWithSameIndex)147*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest,
148*e7b1675dSTing-Kang Chang      RegisterDifferentParametersSerializerWithSameIndex) {
149*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
150*e7b1675dSTing-Kang Chang   ParametersSerializerImpl<NoIdParams, NoIdSerialization> serializer1(
151*e7b1675dSTing-Kang Chang       kNoIdTypeUrl, SerializeNoIdParams);
152*e7b1675dSTing-Kang Chang   ParametersSerializerImpl<NoIdParams, NoIdSerialization> serializer2(
153*e7b1675dSTing-Kang Chang       kNoIdTypeUrl, SerializeNoIdParams);
154*e7b1675dSTing-Kang Chang 
155*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterParametersSerializer(&serializer1), IsOk());
156*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterParametersSerializer(&serializer2),
157*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kAlreadyExists));
158*e7b1675dSTing-Kang Chang }
159*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,ParseKey)160*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, ParseKey) {
161*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
162*e7b1675dSTing-Kang Chang   KeyParserImpl<NoIdSerialization, NoIdKey> parser1(kNoIdTypeUrl, ParseNoIdKey);
163*e7b1675dSTing-Kang Chang   KeyParserImpl<IdKeySerialization, IdKey> parser2(kIdTypeUrl, ParseIdKey);
164*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterKeyParser(&parser1), IsOk());
165*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterKeyParser(&parser2), IsOk());
166*e7b1675dSTing-Kang Chang 
167*e7b1675dSTing-Kang Chang   SerializationRegistry registry = builder.Build();
168*e7b1675dSTing-Kang Chang 
169*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> no_id_key =
170*e7b1675dSTing-Kang Chang       registry.ParseKey(NoIdSerialization(), InsecureSecretKeyAccess::Get());
171*e7b1675dSTing-Kang Chang   ASSERT_THAT(no_id_key, IsOk());
172*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**no_id_key)),
173*e7b1675dSTing-Kang Chang               std::type_index(typeid(NoIdKey)));
174*e7b1675dSTing-Kang Chang 
175*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> id_key = registry.ParseKey(
176*e7b1675dSTing-Kang Chang       IdKeySerialization(/*id=*/123), InsecureSecretKeyAccess::Get());
177*e7b1675dSTing-Kang Chang   ASSERT_THAT(id_key, IsOk());
178*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**id_key)),
179*e7b1675dSTing-Kang Chang               std::type_index(typeid(IdKey)));
180*e7b1675dSTing-Kang Chang   EXPECT_THAT((*id_key)->GetIdRequirement(), Eq(123));
181*e7b1675dSTing-Kang Chang }
182*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,ParseKeyNoSecretAccess)183*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, ParseKeyNoSecretAccess) {
184*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
185*e7b1675dSTing-Kang Chang   KeyParserImpl<NoIdSerialization, NoIdKey> parser(kNoIdTypeUrl, ParseNoIdKey);
186*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterKeyParser(&parser), IsOk());
187*e7b1675dSTing-Kang Chang 
188*e7b1675dSTing-Kang Chang   SerializationRegistry registry = builder.Build();
189*e7b1675dSTing-Kang Chang 
190*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> no_id_public_key =
191*e7b1675dSTing-Kang Chang       registry.ParseKey(NoIdSerialization(), absl::nullopt);
192*e7b1675dSTing-Kang Chang   ASSERT_THAT(no_id_public_key, IsOk());
193*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**no_id_public_key)),
194*e7b1675dSTing-Kang Chang               std::type_index(typeid(NoIdKey)));
195*e7b1675dSTing-Kang Chang }
196*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,ParseKeyWithoutRegistration)197*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, ParseKeyWithoutRegistration) {
198*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
199*e7b1675dSTing-Kang Chang   SerializationRegistry registry = builder.Build();
200*e7b1675dSTing-Kang Chang 
201*e7b1675dSTing-Kang Chang   ASSERT_THAT(
202*e7b1675dSTing-Kang Chang       registry.ParseKey(NoIdSerialization(), InsecureSecretKeyAccess::Get())
203*e7b1675dSTing-Kang Chang           .status(),
204*e7b1675dSTing-Kang Chang       StatusIs(absl::StatusCode::kNotFound));
205*e7b1675dSTing-Kang Chang }
206*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,RegisterSameKeyParser)207*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, RegisterSameKeyParser) {
208*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
209*e7b1675dSTing-Kang Chang   KeyParserImpl<NoIdSerialization, NoIdKey> parser(kNoIdTypeUrl, ParseNoIdKey);
210*e7b1675dSTing-Kang Chang 
211*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterKeyParser(&parser), IsOk());
212*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterKeyParser(&parser), IsOk());
213*e7b1675dSTing-Kang Chang }
214*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,RegisterDifferentKeyParserWithSameIndex)215*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, RegisterDifferentKeyParserWithSameIndex) {
216*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
217*e7b1675dSTing-Kang Chang   KeyParserImpl<NoIdSerialization, NoIdKey> parser1(kNoIdTypeUrl, ParseNoIdKey);
218*e7b1675dSTing-Kang Chang   KeyParserImpl<NoIdSerialization, NoIdKey> parser2(kNoIdTypeUrl, ParseNoIdKey);
219*e7b1675dSTing-Kang Chang 
220*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterKeyParser(&parser1), IsOk());
221*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterKeyParser(&parser2),
222*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kAlreadyExists));
223*e7b1675dSTing-Kang Chang }
224*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,SerializeKey)225*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, SerializeKey) {
226*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
227*e7b1675dSTing-Kang Chang   KeySerializerImpl<NoIdKey, NoIdSerialization> serializer1(SerializeNoIdKey);
228*e7b1675dSTing-Kang Chang   KeySerializerImpl<IdKey, IdKeySerialization> serializer2(SerializeIdKey);
229*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterKeySerializer(&serializer1), IsOk());
230*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterKeySerializer(&serializer2), IsOk());
231*e7b1675dSTing-Kang Chang 
232*e7b1675dSTing-Kang Chang   SerializationRegistry registry = builder.Build();
233*e7b1675dSTing-Kang Chang 
234*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialization1 =
235*e7b1675dSTing-Kang Chang       registry.SerializeKey<NoIdSerialization>(NoIdKey(),
236*e7b1675dSTing-Kang Chang                                                InsecureSecretKeyAccess::Get());
237*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialization1, IsOk());
238*e7b1675dSTing-Kang Chang   EXPECT_THAT((*serialization1)->ObjectIdentifier(), Eq(kNoIdTypeUrl));
239*e7b1675dSTing-Kang Chang 
240*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialization2 =
241*e7b1675dSTing-Kang Chang       registry.SerializeKey<IdKeySerialization>(IdKey(123),
242*e7b1675dSTing-Kang Chang                                                 InsecureSecretKeyAccess::Get());
243*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialization2, IsOk());
244*e7b1675dSTing-Kang Chang   EXPECT_THAT((*serialization2)->ObjectIdentifier(), Eq(kIdTypeUrl));
245*e7b1675dSTing-Kang Chang }
246*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,SerializeKeyNoSecretAccess)247*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, SerializeKeyNoSecretAccess) {
248*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
249*e7b1675dSTing-Kang Chang   KeySerializerImpl<NoIdKey, NoIdSerialization> serializer(SerializeNoIdKey);
250*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterKeySerializer(&serializer), IsOk());
251*e7b1675dSTing-Kang Chang 
252*e7b1675dSTing-Kang Chang   SerializationRegistry registry = builder.Build();
253*e7b1675dSTing-Kang Chang 
254*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> serialization =
255*e7b1675dSTing-Kang Chang       registry.SerializeKey<NoIdSerialization>(NoIdKey(),
256*e7b1675dSTing-Kang Chang                                                absl::nullopt);
257*e7b1675dSTing-Kang Chang   ASSERT_THAT(serialization, IsOk());
258*e7b1675dSTing-Kang Chang   EXPECT_THAT((*serialization)->ObjectIdentifier(), Eq(kNoIdTypeUrl));
259*e7b1675dSTing-Kang Chang }
260*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,SerializeKeyWithoutRegistration)261*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, SerializeKeyWithoutRegistration) {
262*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
263*e7b1675dSTing-Kang Chang   SerializationRegistry registry = builder.Build();
264*e7b1675dSTing-Kang Chang 
265*e7b1675dSTing-Kang Chang   ASSERT_THAT(registry
266*e7b1675dSTing-Kang Chang                   .SerializeKey<NoIdSerialization>(
267*e7b1675dSTing-Kang Chang                       NoIdKey(), InsecureSecretKeyAccess::Get())
268*e7b1675dSTing-Kang Chang                   .status(),
269*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kNotFound));
270*e7b1675dSTing-Kang Chang }
271*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,RegisterSameKeySerializer)272*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, RegisterSameKeySerializer) {
273*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
274*e7b1675dSTing-Kang Chang   KeySerializerImpl<NoIdKey, NoIdSerialization> serializer(SerializeNoIdKey);
275*e7b1675dSTing-Kang Chang 
276*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterKeySerializer(&serializer), IsOk());
277*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterKeySerializer(&serializer), IsOk());
278*e7b1675dSTing-Kang Chang }
279*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,RegisterDifferentKeySerializerWithSameIndex)280*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, RegisterDifferentKeySerializerWithSameIndex) {
281*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
282*e7b1675dSTing-Kang Chang   KeySerializerImpl<NoIdKey, NoIdSerialization> serializer1(SerializeNoIdKey);
283*e7b1675dSTing-Kang Chang   KeySerializerImpl<NoIdKey, NoIdSerialization> serializer2(SerializeNoIdKey);
284*e7b1675dSTing-Kang Chang 
285*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterKeySerializer(&serializer1), IsOk());
286*e7b1675dSTing-Kang Chang   EXPECT_THAT(builder.RegisterKeySerializer(&serializer2),
287*e7b1675dSTing-Kang Chang               StatusIs(absl::StatusCode::kAlreadyExists));
288*e7b1675dSTing-Kang Chang }
289*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,BuiltFromAnotherRegistry)290*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, BuiltFromAnotherRegistry) {
291*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder1;
292*e7b1675dSTing-Kang Chang   ParametersParserImpl<NoIdSerialization, NoIdParams> parser1(kNoIdTypeUrl,
293*e7b1675dSTing-Kang Chang                                                               ParseNoIdParams);
294*e7b1675dSTing-Kang Chang   ParametersSerializerImpl<NoIdParams, NoIdSerialization> serializer1(
295*e7b1675dSTing-Kang Chang       kNoIdTypeUrl, SerializeNoIdParams);
296*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder1.RegisterParametersParser(&parser1), IsOk());
297*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder1.RegisterParametersSerializer(&serializer1), IsOk());
298*e7b1675dSTing-Kang Chang 
299*e7b1675dSTing-Kang Chang   SerializationRegistry registry1 = builder1.Build();
300*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder2(registry1);
301*e7b1675dSTing-Kang Chang 
302*e7b1675dSTing-Kang Chang   KeyParserImpl<NoIdSerialization, NoIdKey> parser2(kNoIdTypeUrl, ParseNoIdKey);
303*e7b1675dSTing-Kang Chang   KeySerializerImpl<NoIdKey, NoIdSerialization> serializer2(SerializeNoIdKey);
304*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder2.RegisterKeyParser(&parser2), IsOk());
305*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder2.RegisterKeySerializer(&serializer2), IsOk());
306*e7b1675dSTing-Kang Chang 
307*e7b1675dSTing-Kang Chang   SerializationRegistry registry2 = builder2.Build();
308*e7b1675dSTing-Kang Chang 
309*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> params =
310*e7b1675dSTing-Kang Chang       registry2.ParseParameters(NoIdSerialization());
311*e7b1675dSTing-Kang Chang   ASSERT_THAT(params, IsOk());
312*e7b1675dSTing-Kang Chang   EXPECT_THAT((*params)->HasIdRequirement(), IsFalse());
313*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**params)),
314*e7b1675dSTing-Kang Chang               std::type_index(typeid(NoIdParams)));
315*e7b1675dSTing-Kang Chang 
316*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> params_serialization =
317*e7b1675dSTing-Kang Chang       registry2.SerializeParameters<NoIdSerialization>(NoIdParams());
318*e7b1675dSTing-Kang Chang   ASSERT_THAT(params_serialization, IsOk());
319*e7b1675dSTing-Kang Chang   EXPECT_THAT((*params_serialization)->ObjectIdentifier(), Eq(kNoIdTypeUrl));
320*e7b1675dSTing-Kang Chang 
321*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> key =
322*e7b1675dSTing-Kang Chang       registry2.ParseKey(NoIdSerialization(), InsecureSecretKeyAccess::Get());
323*e7b1675dSTing-Kang Chang   ASSERT_THAT(key, IsOk());
324*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**key)), std::type_index(typeid(NoIdKey)));
325*e7b1675dSTing-Kang Chang 
326*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> key_serialization =
327*e7b1675dSTing-Kang Chang       registry2.SerializeKey<NoIdSerialization>(NoIdKey(),
328*e7b1675dSTing-Kang Chang                                                 InsecureSecretKeyAccess::Get());
329*e7b1675dSTing-Kang Chang   ASSERT_THAT(key_serialization, IsOk());
330*e7b1675dSTing-Kang Chang   EXPECT_THAT((*key_serialization)->ObjectIdentifier(), Eq(kNoIdTypeUrl));
331*e7b1675dSTing-Kang Chang }
332*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,RegistryCopy)333*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, RegistryCopy) {
334*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
335*e7b1675dSTing-Kang Chang   ParametersParserImpl<NoIdSerialization, NoIdParams> parser1(kNoIdTypeUrl,
336*e7b1675dSTing-Kang Chang                                                               ParseNoIdParams);
337*e7b1675dSTing-Kang Chang   ParametersSerializerImpl<NoIdParams, NoIdSerialization> serializer1(
338*e7b1675dSTing-Kang Chang       kNoIdTypeUrl, SerializeNoIdParams);
339*e7b1675dSTing-Kang Chang   KeyParserImpl<NoIdSerialization, NoIdKey> parser2(kNoIdTypeUrl, ParseNoIdKey);
340*e7b1675dSTing-Kang Chang   KeySerializerImpl<NoIdKey, NoIdSerialization> serializer2(SerializeNoIdKey);
341*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterParametersParser(&parser1), IsOk());
342*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterParametersSerializer(&serializer1), IsOk());
343*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterKeyParser(&parser2), IsOk());
344*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterKeySerializer(&serializer2), IsOk());
345*e7b1675dSTing-Kang Chang 
346*e7b1675dSTing-Kang Chang   SerializationRegistry registry1 = builder.Build();
347*e7b1675dSTing-Kang Chang   SerializationRegistry registry2 = registry1;
348*e7b1675dSTing-Kang Chang 
349*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> params =
350*e7b1675dSTing-Kang Chang       registry2.ParseParameters(NoIdSerialization());
351*e7b1675dSTing-Kang Chang   ASSERT_THAT(params, IsOk());
352*e7b1675dSTing-Kang Chang   EXPECT_THAT((*params)->HasIdRequirement(), IsFalse());
353*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**params)),
354*e7b1675dSTing-Kang Chang               std::type_index(typeid(NoIdParams)));
355*e7b1675dSTing-Kang Chang 
356*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> params_serialization =
357*e7b1675dSTing-Kang Chang       registry2.SerializeParameters<NoIdSerialization>(NoIdParams());
358*e7b1675dSTing-Kang Chang   ASSERT_THAT(params_serialization, IsOk());
359*e7b1675dSTing-Kang Chang   EXPECT_THAT((*params_serialization)->ObjectIdentifier(), Eq(kNoIdTypeUrl));
360*e7b1675dSTing-Kang Chang 
361*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> key =
362*e7b1675dSTing-Kang Chang       registry2.ParseKey(NoIdSerialization(), InsecureSecretKeyAccess::Get());
363*e7b1675dSTing-Kang Chang   ASSERT_THAT(key, IsOk());
364*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**key)), std::type_index(typeid(NoIdKey)));
365*e7b1675dSTing-Kang Chang 
366*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> key_serialization =
367*e7b1675dSTing-Kang Chang       registry2.SerializeKey<NoIdSerialization>(NoIdKey(),
368*e7b1675dSTing-Kang Chang                                                 InsecureSecretKeyAccess::Get());
369*e7b1675dSTing-Kang Chang   ASSERT_THAT(key_serialization, IsOk());
370*e7b1675dSTing-Kang Chang   EXPECT_THAT((*key_serialization)->ObjectIdentifier(), Eq(kNoIdTypeUrl));
371*e7b1675dSTing-Kang Chang }
372*e7b1675dSTing-Kang Chang 
TEST(SerializationRegistryTest,RegistryMove)373*e7b1675dSTing-Kang Chang TEST(SerializationRegistryTest, RegistryMove) {
374*e7b1675dSTing-Kang Chang   SerializationRegistry::Builder builder;
375*e7b1675dSTing-Kang Chang   ParametersParserImpl<NoIdSerialization, NoIdParams> parser1(kNoIdTypeUrl,
376*e7b1675dSTing-Kang Chang                                                               ParseNoIdParams);
377*e7b1675dSTing-Kang Chang   ParametersSerializerImpl<NoIdParams, NoIdSerialization> serializer1(
378*e7b1675dSTing-Kang Chang       kNoIdTypeUrl, SerializeNoIdParams);
379*e7b1675dSTing-Kang Chang   KeyParserImpl<NoIdSerialization, NoIdKey> parser2(kNoIdTypeUrl, ParseNoIdKey);
380*e7b1675dSTing-Kang Chang   KeySerializerImpl<NoIdKey, NoIdSerialization> serializer2(SerializeNoIdKey);
381*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterParametersParser(&parser1), IsOk());
382*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterParametersSerializer(&serializer1), IsOk());
383*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterKeyParser(&parser2), IsOk());
384*e7b1675dSTing-Kang Chang   ASSERT_THAT(builder.RegisterKeySerializer(&serializer2), IsOk());
385*e7b1675dSTing-Kang Chang 
386*e7b1675dSTing-Kang Chang   SerializationRegistry registry1 = builder.Build();
387*e7b1675dSTing-Kang Chang   SerializationRegistry registry2 = std::move(registry1);
388*e7b1675dSTing-Kang Chang 
389*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Parameters>> params =
390*e7b1675dSTing-Kang Chang       registry2.ParseParameters(NoIdSerialization());
391*e7b1675dSTing-Kang Chang   ASSERT_THAT(params, IsOk());
392*e7b1675dSTing-Kang Chang   EXPECT_THAT((*params)->HasIdRequirement(), IsFalse());
393*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**params)),
394*e7b1675dSTing-Kang Chang               std::type_index(typeid(NoIdParams)));
395*e7b1675dSTing-Kang Chang 
396*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> params_serialization =
397*e7b1675dSTing-Kang Chang       registry2.SerializeParameters<NoIdSerialization>(NoIdParams());
398*e7b1675dSTing-Kang Chang   ASSERT_THAT(params_serialization, IsOk());
399*e7b1675dSTing-Kang Chang   EXPECT_THAT((*params_serialization)->ObjectIdentifier(), Eq(kNoIdTypeUrl));
400*e7b1675dSTing-Kang Chang 
401*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Key>> key =
402*e7b1675dSTing-Kang Chang       registry2.ParseKey(NoIdSerialization(), InsecureSecretKeyAccess::Get());
403*e7b1675dSTing-Kang Chang   ASSERT_THAT(key, IsOk());
404*e7b1675dSTing-Kang Chang   EXPECT_THAT(std::type_index(typeid(**key)), std::type_index(typeid(NoIdKey)));
405*e7b1675dSTing-Kang Chang 
406*e7b1675dSTing-Kang Chang   util::StatusOr<std::unique_ptr<Serialization>> key_serialization =
407*e7b1675dSTing-Kang Chang       registry2.SerializeKey<NoIdSerialization>(NoIdKey(),
408*e7b1675dSTing-Kang Chang                                                 InsecureSecretKeyAccess::Get());
409*e7b1675dSTing-Kang Chang   ASSERT_THAT(key_serialization, IsOk());
410*e7b1675dSTing-Kang Chang   EXPECT_THAT((*key_serialization)->ObjectIdentifier(), Eq(kNoIdTypeUrl));
411*e7b1675dSTing-Kang Chang }
412*e7b1675dSTing-Kang Chang 
413*e7b1675dSTing-Kang Chang }  // namespace internal
414*e7b1675dSTing-Kang Chang }  // namespace tink
415*e7b1675dSTing-Kang Chang }  // namespace crypto
416