1// Copyright 2013 The Flutter 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 "flutter/fml/base32.h"
6#include "gtest/gtest.h"
7
8#include <iostream>
9
10TEST(Base32Test, CanEncode) {
11 {
12 auto result = fml::Base32Encode("hello");
13 ASSERT_TRUE(result.first);
14 ASSERT_EQ(result.second, "NBSWY3DP");
15 }
16
17 {
18 auto result = fml::Base32Encode("helLo");
19 ASSERT_TRUE(result.first);
20 ASSERT_EQ(result.second, "NBSWYTDP");
21 }
22
23 {
24 auto result = fml::Base32Encode("");
25 ASSERT_TRUE(result.first);
26 ASSERT_EQ(result.second, "");
27 }
28
29 {
30 auto result = fml::Base32Encode("1");
31 ASSERT_TRUE(result.first);
32 ASSERT_EQ(result.second, "GE");
33 }
34
35 {
36 auto result = fml::Base32Encode("helLo");
37 ASSERT_TRUE(result.first);
38 ASSERT_EQ(result.second, "NBSWYTDP");
39 }
40}
41
42TEST(Base32Test, CanEncodeDecodeStrings) {
43 std::vector<std::string> strings = {"hello", "helLo", "", "1", "\0"};
44 for (size_t i = 0; i < strings.size(); i += 1) {
45 auto encode_result = fml::Base32Encode(strings[i]);
46 ASSERT_TRUE(encode_result.first);
47 auto decode_result = fml::Base32Decode(encode_result.second);
48 ASSERT_TRUE(decode_result.first);
49 const std::string& decoded = decode_result.second;
50 std::string decoded_string(decoded.data(), decoded.size());
51 ASSERT_EQ(strings[i], decoded_string);
52 }
53}
54
55TEST(Base32Test, DecodeReturnsFalseForInvalideInput) {
56 // "B" is invalid because it has a non-zero padding.
57 std::vector<std::string> invalid_inputs = {"a", "1", "9", "B"};
58 for (const std::string& input : invalid_inputs) {
59 auto decode_result = fml::Base32Decode(input);
60 if (decode_result.first) {
61 std::cout << "Base32Decode should return false on " << input << std::endl;
62 }
63 ASSERT_FALSE(decode_result.first);
64 }
65}
66
67TEST(Base32Test, CanDecodeSkSLKeys) {
68 std::vector<std::string> inputs = {
69 "CAZAAAACAAAAADQAAAABKAAAAAJQAAIA7777777777776EYAAEAP777777777777AAAAAABA"
70 "ABTAAAAAAAAAAAAAAABAAAAAGQAGGAA",
71 "CAZAAAICAAAAAAAAAAADOAAAAAJQAAIA777777Y4AAKAAEYAAEAP777777777777EAAGMAAA"
72 "AAAAAAAAAAACQACNAAAAAAAAAAAAAAACAAAAAPAAMMAA",
73 "CAZACAACAAAABAYACAAAAAAAAAJQAAIADQABIAH777777777777RQAAOAAAAAAAAAAAAAABE"
74 "AANQAAAAAAAAAAAAAAYAAJYAAAAAAAANAAAQAAAAAAAEAAAHAAAAAAAAAAAAAAANAAAQAAAA"
75 "AAAFIADKAAAAAAAAAAAAAAACAAAAAZAAMMAA"};
76 for (const std::string& input : inputs) {
77 auto decode_result = fml::Base32Decode(input);
78 if (!decode_result.first) {
79 std::cout << "Base32Decode should return true on " << input << std::endl;
80 }
81 ASSERT_TRUE(decode_result.first);
82 auto encode_result = fml::Base32Encode(decode_result.second);
83 ASSERT_TRUE(encode_result.first);
84 ASSERT_EQ(encode_result.second, input);
85 }
86}
87