• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 PDFium 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 <stdint.h>
6 
7 #include <limits>
8 
9 #include "core/fxcodec/codec/ccodec_basicmodule.h"
10 #include "core/fxcodec/fx_codec.h"
11 #include "testing/fx_string_testhelpers.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 
TEST(fxcodec,A85TestBadInputs)14 TEST(fxcodec, A85TestBadInputs) {
15   const uint8_t src_buf[] = {1, 2, 3, 4};
16   uint8_t* dest_buf = nullptr;
17   uint32_t src_size = 4;
18   uint32_t dest_size = 0;
19 
20   CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule();
21   EXPECT_TRUE(pEncoders);
22 
23   // Error codes, not segvs, should callers pass us a nullptr pointer.
24   EXPECT_FALSE(pEncoders->A85Encode(src_buf, src_size, &dest_buf, nullptr));
25   EXPECT_FALSE(pEncoders->A85Encode(src_buf, src_size, nullptr, &dest_size));
26   EXPECT_FALSE(pEncoders->A85Encode(src_buf, 0, &dest_buf, &dest_size));
27   EXPECT_FALSE(pEncoders->A85Encode(nullptr, src_size, &dest_buf, &dest_size));
28 }
29 
30 // No leftover bytes, just translate 2 sets of symbols.
TEST(fxcodec,A85TestBasic)31 TEST(fxcodec, A85TestBasic) {
32   // Make sure really big values don't break.
33   const uint8_t src_buf[] = {1, 2, 3, 4, 255, 255, 255, 255};
34   uint8_t* dest_buf = nullptr;
35   uint32_t src_size = 8;
36   uint32_t dest_size = 0;
37 
38   CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule();
39   EXPECT_TRUE(pEncoders);
40 
41   // Should succeed.
42   EXPECT_TRUE(pEncoders->A85Encode(src_buf, src_size, &dest_buf, &dest_size));
43 
44   // Should have 5 chars for each set of 4 and 2 terminators.
45   ASSERT_EQ(12u, dest_size);
46   const uint8_t expected_out[] = {33, 60, 78, 63, 43,  115,
47                                   56, 87, 45, 33, 126, 62};
48 
49   // Check the output
50   for (uint32_t i = 0; i < 12; i++)
51     EXPECT_EQ(expected_out[i], dest_buf[i]) << " at " << i;
52   FX_Free(dest_buf);
53 }
54 
55 // Leftover bytes.
TEST(fxcodec,A85TestLeftoverBytes)56 TEST(fxcodec, A85TestLeftoverBytes) {
57   // 1 Leftover Byte:
58   const uint8_t src_buf_1leftover[] = {1, 2, 3, 4, 255};
59   uint8_t* dest_buf = nullptr;
60   uint32_t src_size = 5;
61   uint32_t dest_size = 0;
62 
63   CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule();
64   EXPECT_TRUE(pEncoders);
65 
66   // Should succeed
67   EXPECT_TRUE(
68       pEncoders->A85Encode(src_buf_1leftover, src_size, &dest_buf, &dest_size));
69   ASSERT_EQ(9u, dest_size);  // 5 chars for first symbol + 2 + 2 terminators.
70   uint8_t expected_out_1leftover[] = {33, 60, 78, 63, 43, 114, 114, 126, 62};
71 
72   // Check the output
73   for (uint32_t i = 0; i < 9; i++)
74     EXPECT_EQ(expected_out_1leftover[i], dest_buf[i]) << " at " << i;
75   FX_Free(dest_buf);
76 
77   // 2 Leftover bytes:
78   src_size++;
79   dest_buf = nullptr;
80   dest_size = 0;
81   const uint8_t src_buf_2leftover[] = {1, 2, 3, 4, 255, 254};
82   // Should succeed
83   EXPECT_TRUE(
84       pEncoders->A85Encode(src_buf_2leftover, src_size, &dest_buf, &dest_size));
85   ASSERT_EQ(10u, dest_size);  // 5 chars for first symbol + 3 + 2 terminators.
86   const uint8_t expected_out_2leftover[] = {33,  60, 78, 63,  43,
87                                             115, 56, 68, 126, 62};
88 
89   // Check the output
90   for (uint32_t i = 0; i < 10; i++)
91     EXPECT_EQ(expected_out_2leftover[i], dest_buf[i]) << " at " << i;
92   FX_Free(dest_buf);
93 
94   // 3 Leftover bytes:
95   src_size++;
96   dest_buf = nullptr;
97   dest_size = 0;
98   const uint8_t src_buf_3leftover[] = {1, 2, 3, 4, 255, 254, 253};
99   // Should succeed
100   EXPECT_TRUE(
101       pEncoders->A85Encode(src_buf_3leftover, src_size, &dest_buf, &dest_size));
102   ASSERT_EQ(11u, dest_size);  // 5 chars for first symbol + 4 + 2 terminators.
103   const uint8_t expected_out_3leftover[] = {33, 60, 78,  63,  43, 115,
104                                             56, 77, 114, 126, 62};
105 
106   // Check the output
107   for (uint32_t i = 0; i < 11; i++)
108     EXPECT_EQ(expected_out_3leftover[i], dest_buf[i]) << " at " << i;
109   FX_Free(dest_buf);
110 }
111 
112 // Test all zeros comes through as "z".
TEST(fxcodec,A85TestZeros)113 TEST(fxcodec, A85TestZeros) {
114   // Make sure really big values don't break.
115   const uint8_t src_buf[] = {1, 2, 3, 4, 0, 0, 0, 0};
116   uint8_t* dest_buf = nullptr;
117   uint32_t src_size = 8;
118   uint32_t dest_size = 0;
119 
120   CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule();
121   EXPECT_TRUE(pEncoders);
122 
123   // Should succeed.
124   EXPECT_TRUE(pEncoders->A85Encode(src_buf, src_size, &dest_buf, &dest_size));
125 
126   // Should have 5 chars for first set of 4 + 1 for z + 2 terminators.
127   ASSERT_EQ(8u, dest_size);
128   const uint8_t expected_out[] = {33, 60, 78, 63, 43, 122, 126, 62};
129 
130   // Check the output
131   for (uint32_t i = 0; i < 8; i++)
132     EXPECT_EQ(expected_out[i], dest_buf[i]) << " at " << i;
133   FX_Free(dest_buf);
134 
135   // Should also work if it is at the start:
136   dest_buf = nullptr;
137   dest_size = 0;
138   const uint8_t src_buf_2[] = {0, 0, 0, 0, 1, 2, 3, 4};
139 
140   // Should succeed.
141   EXPECT_TRUE(pEncoders->A85Encode(src_buf_2, src_size, &dest_buf, &dest_size));
142 
143   // Should have 5 chars for set of 4 + 1 for z + 2 terminators.
144   ASSERT_EQ(8u, dest_size);
145   const uint8_t expected_out_2[] = {122, 33, 60, 78, 63, 43, 126, 62};
146 
147   // Check the output
148   for (uint32_t i = 0; i < 8; i++)
149     EXPECT_EQ(expected_out_2[i], dest_buf[i]) << " at " << i;
150   FX_Free(dest_buf);
151 
152   // Try with 2 leftover zero bytes. Make sure we don't get a "z".
153   src_size = 6;  // Cut off the last 2 zeros.
154   dest_buf = nullptr;
155   dest_size = 0;
156 
157   // Should succeed.
158   EXPECT_TRUE(pEncoders->A85Encode(src_buf, src_size, &dest_buf, &dest_size));
159 
160   // Should have 5 chars for set of 4 + 3 for last 2 + 2 terminators.
161   ASSERT_EQ(10u, dest_size);
162   const uint8_t expected_out_leftover[] = {33, 60, 78, 63,  43,
163                                            33, 33, 33, 126, 62};
164 
165   // Check the output
166   for (uint32_t i = 0; i < 10; i++)
167     EXPECT_EQ(expected_out_leftover[i], dest_buf[i]) << " at " << i;
168   FX_Free(dest_buf);
169 }
170 
171 // Make sure we get returns in the expected locations.
TEST(fxcodec,A85TestLineBreaks)172 TEST(fxcodec, A85TestLineBreaks) {
173   // Make sure really big values don't break.
174   uint8_t src_buf[131] = {0};
175   // 1 full line + most of a line of normal symbols.
176   for (int k = 0; k < 116; k += 4) {
177     src_buf[k] = 1;
178     src_buf[k + 1] = 2;
179     src_buf[k + 2] = 3;
180     src_buf[k + 3] = 4;
181   }
182   // Fill in the end, leaving an all zero gap + 3 extra zeros at the end.
183   for (int k = 120; k < 128; k++) {
184     src_buf[k] = 1;
185     src_buf[k + 1] = 2;
186     src_buf[k + 2] = 3;
187     src_buf[k + 3] = 4;
188   }
189   uint8_t* dest_buf = nullptr;
190   uint32_t src_size = 131;
191   uint32_t dest_size = 0;
192 
193   CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule();
194   EXPECT_TRUE(pEncoders);
195 
196   // Should succeed.
197   EXPECT_TRUE(pEncoders->A85Encode(src_buf, src_size, &dest_buf, &dest_size));
198 
199   // Should have 75 chars in the first row plus 2 char return,
200   // 76 chars in the second row plus 2 char return,
201   // and 9 chars in the last row with 2 terminators.
202   ASSERT_EQ(166u, dest_size);
203 
204   // Check for the returns.
205   EXPECT_EQ(13, dest_buf[75]);
206   EXPECT_EQ(10, dest_buf[76]);
207   EXPECT_EQ(13, dest_buf[153]);
208   EXPECT_EQ(10, dest_buf[154]);
209 
210   FX_Free(dest_buf);
211 }
212