|
8 | 8 |
|
9 | 9 | #include <gtest/gtest.h>
|
10 | 10 |
|
| 11 | +#include <algorithm> |
11 | 12 | #include <sstream>
|
12 | 13 |
|
13 | 14 | using namespace uid2;
|
@@ -116,15 +117,43 @@ std::string GenerateUid2TokenV4AndValidate(
|
116 | 117 | return advertisingToken;
|
117 | 118 | }
|
118 | 119 |
|
| 120 | +void DecryptAndAssertSuccess(UID2Client& client, const std::string& advertisingTokenString, Timestamp timestamp = Timestamp::Now()) |
| 121 | +{ |
| 122 | + const auto res = client.Decrypt(advertisingTokenString, timestamp); |
| 123 | + EXPECT_TRUE(res.IsSuccess()); |
| 124 | + EXPECT_EQ(DecryptionStatus::SUCCESS, res.GetStatus()); |
| 125 | + EXPECT_EQ(EXAMPLE_UID, res.GetUid()); |
| 126 | +} |
| 127 | + |
| 128 | +TEST(EncryptionTestsV4, CanDecryptV4TokenEncodedAsBase64) |
| 129 | +{ |
| 130 | + UID2Client client("ep", "ak", CLIENT_SECRET, IdentityScope::UID2); |
| 131 | + client.RefreshJson(KeySetToJson({MASTER_KEY, SITE_KEY})); |
| 132 | + std::string advertisingToken; |
| 133 | + |
| 134 | + // for testing purposes, the token must have some Base64URL encoding characters |
| 135 | + do { |
| 136 | + advertisingToken = GenerateUid2TokenV4AndValidate(EXAMPLE_UID, MASTER_KEY, SITE_ID, SITE_KEY, EncryptTokenParams()); |
| 137 | + } while (!std::any_of(advertisingToken.begin(), advertisingToken.end(), [](char c) { return c == '-' || c == '_'; })); |
| 138 | + |
| 139 | + std::vector<std::uint8_t> adTokenBytes; |
| 140 | + uid2::UID2Base64UrlCoder::Decode(advertisingToken, adTokenBytes); |
| 141 | + |
| 142 | + // explicitly encode into Base64 (non-URL friendly) encoding again |
| 143 | + const auto base64NonURLAdTokenV4 = macaron::Base64::Encode(adTokenBytes); |
| 144 | + const bool isBase64NonUrlEncoding = |
| 145 | + std::any_of(base64NonURLAdTokenV4.begin(), base64NonURLAdTokenV4.end(), [](char c) { return c == '=' || c == '+' || c == '/'; }); |
| 146 | + EXPECT_TRUE(isBase64NonUrlEncoding); |
| 147 | + |
| 148 | + DecryptAndAssertSuccess(client, base64NonURLAdTokenV4); |
| 149 | +} |
| 150 | + |
119 | 151 | TEST(EncryptionTestsV4, SmokeTest)
|
120 | 152 | {
|
121 | 153 | UID2Client client("ep", "ak", CLIENT_SECRET, IdentityScope::UID2);
|
122 | 154 | client.RefreshJson(KeySetToJson({MASTER_KEY, SITE_KEY}));
|
123 | 155 | const auto advertisingToken = GenerateUid2TokenV4AndValidate(EXAMPLE_UID, MASTER_KEY, SITE_ID, SITE_KEY, EncryptTokenParams());
|
124 |
| - const auto res = client.Decrypt(advertisingToken, Timestamp::Now()); |
125 |
| - EXPECT_TRUE(res.IsSuccess()); |
126 |
| - EXPECT_EQ(DecryptionStatus::SUCCESS, res.GetStatus()); |
127 |
| - EXPECT_EQ(EXAMPLE_UID, res.GetUid()); |
| 156 | + DecryptAndAssertSuccess(client, advertisingToken); |
128 | 157 | }
|
129 | 158 |
|
130 | 159 | TEST(EncryptionTestsV4, EmptyKeyContainer)
|
@@ -188,10 +217,7 @@ TEST(EncryptionTestsV4, TokenExpiryAndCustomNow)
|
188 | 217 | EXPECT_FALSE(res.IsSuccess());
|
189 | 218 | EXPECT_EQ(DecryptionStatus::EXPIRED_TOKEN, res.GetStatus());
|
190 | 219 |
|
191 |
| - res = client.Decrypt(advertisingToken, expiry.AddSeconds(-1)); |
192 |
| - EXPECT_TRUE(res.IsSuccess()); |
193 |
| - EXPECT_EQ(DecryptionStatus::SUCCESS, res.GetStatus()); |
194 |
| - EXPECT_EQ(EXAMPLE_UID, res.GetUid()); |
| 220 | + DecryptAndAssertSuccess(client, advertisingToken, expiry.AddSeconds(-1)); |
195 | 221 | }
|
196 | 222 |
|
197 | 223 | TEST(EncryptDataTestsV4, SiteIdFromToken)
|
|
0 commit comments