14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <stdint.h> 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <limits> 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/fpdf_parser_decode.h" 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/codec/ccodec_basicmodule.h" 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcodec/fx_codec.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "testing/gtest/include/gtest/gtest.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(fxcodec, RLETestBadInputs) { 1533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann const uint8_t src_buf[] = {1}; 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* dest_buf = nullptr; 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t src_size = 4; 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dest_size = 0; 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(pEncoders); 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Error codes, not segvs, should callers pass us a nullptr pointer. 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE( 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(src_buf, src_size, &dest_buf, nullptr)); 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE( 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(src_buf, src_size, nullptr, &dest_size)); 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(pEncoders->RunLengthEncode(src_buf, 0, &dest_buf, &dest_size)); 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE( 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(nullptr, src_size, &dest_buf, &dest_size)); 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Check length 1 input works. Check terminating character is applied. 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(fxcodec, RLETestShortInput) { 3533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann const uint8_t src_buf[] = {1}; 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* dest_buf = nullptr; 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t src_size = 1; 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dest_size = 0; 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(pEncoders); 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE( 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(src_buf, src_size, &dest_buf, &dest_size)); 4533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ASSERT_EQ(3u, dest_size); 4633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(0, dest_buf[0]); 4733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(1, dest_buf[1]); 4833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(128, dest_buf[2]); 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(dest_buf); 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Check a few basic cases (2 matching runs in a row, matching run followed 5433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann// by a non-matching run, and non-matching run followed by a matching run). 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(fxcodec, RLETestNormalInputs) { 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Match, match 5733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann const uint8_t src_buf_1[] = {2, 2, 2, 2, 4, 4, 4, 4, 4, 4}; 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 5933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann // Match, non-match 6033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann const uint8_t src_buf_2[] = {2, 2, 2, 2, 1, 2, 3, 4, 5, 6}; 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 6233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann // Non-match, match 6333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann const uint8_t src_buf_3[] = {1, 2, 3, 4, 5, 3, 3, 3, 3, 3}; 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t src_size = 10; 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dest_size = 0; 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* dest_buf = nullptr; 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(pEncoders); 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Case 1: 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE( 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(src_buf_1, src_size, &dest_buf, &dest_size)); 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* decoded_buf = nullptr; 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t decoded_size = 0; 77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RunLengthDecode(dest_buf, dest_size, &decoded_buf, &decoded_size); 7833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ASSERT_EQ(src_size, decoded_size); 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t i = 0; i < src_size; i++) 8033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(src_buf_1[i], decoded_buf[i]) << " at " << i; 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(dest_buf); 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(decoded_buf); 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Case 2: 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_buf = nullptr; 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_size = 0; 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE( 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(src_buf_2, src_size, &dest_buf, &dest_size)); 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decoded_buf = nullptr; 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decoded_size = 0; 91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RunLengthDecode(dest_buf, dest_size, &decoded_buf, &decoded_size); 9233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ASSERT_EQ(src_size, decoded_size); 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t i = 0; i < src_size; i++) 9433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(src_buf_2[i], decoded_buf[i]) << " at " << i; 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(dest_buf); 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(decoded_buf); 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Case 3: 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_buf = nullptr; 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_size = 0; 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE( 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(src_buf_3, src_size, &dest_buf, &dest_size)); 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decoded_buf = nullptr; 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decoded_size = 0; 105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RunLengthDecode(dest_buf, dest_size, &decoded_buf, &decoded_size); 10633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ASSERT_EQ(src_size, decoded_size); 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t i = 0; i < src_size; i++) 10833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(src_buf_3[i], decoded_buf[i]) << " at " << i; 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(dest_buf); 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(decoded_buf); 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Check that runs longer than 128 are broken up properly, both matched and 11433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann// non-matched. 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(fxcodec, RLETestFullLengthInputs) { 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Match, match 11733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann const uint8_t src_buf_1[260] = {1}; 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 11933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann // Match, non-match 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t src_buf_2[260] = {2}; 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint16_t i = 128; i < 260; i++) 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann src_buf_2[i] = (uint8_t)(i - 125); 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann // Non-match, match 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t src_buf_3[260] = {3}; 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint8_t i = 0; i < 128; i++) 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann src_buf_3[i] = i; 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 12933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann // Non-match, non-match 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t src_buf_4[260]; 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint16_t i = 0; i < 260; i++) 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann src_buf_4[i] = (uint8_t)(i); 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t src_size = 260; 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t dest_size = 0; 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* dest_buf = nullptr; 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CCodec_BasicModule* pEncoders = CCodec_ModuleMgr().GetBasicModule(); 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(pEncoders); 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Case 1: 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE( 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(src_buf_1, src_size, &dest_buf, &dest_size)); 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint8_t* decoded_buf = nullptr; 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann uint32_t decoded_size = 0; 146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RunLengthDecode(dest_buf, dest_size, &decoded_buf, &decoded_size); 14733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ASSERT_EQ(src_size, decoded_size); 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t i = 0; i < src_size; i++) 14933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(src_buf_1[i], decoded_buf[i]) << " at " << i; 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(dest_buf); 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(decoded_buf); 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Case 2: 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_buf = nullptr; 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_size = 0; 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE( 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(src_buf_2, src_size, &dest_buf, &dest_size)); 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decoded_buf = nullptr; 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decoded_size = 0; 160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RunLengthDecode(dest_buf, dest_size, &decoded_buf, &decoded_size); 16133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ASSERT_EQ(src_size, decoded_size); 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t i = 0; i < src_size; i++) 16333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(src_buf_2[i], decoded_buf[i]) << " at " << i; 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(dest_buf); 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(decoded_buf); 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Case 3: 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_buf = nullptr; 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_size = 0; 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE( 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(src_buf_3, src_size, &dest_buf, &dest_size)); 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decoded_buf = nullptr; 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decoded_size = 0; 174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RunLengthDecode(dest_buf, dest_size, &decoded_buf, &decoded_size); 17533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ASSERT_EQ(src_size, decoded_size); 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t i = 0; i < src_size; i++) 17733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(src_buf_3[i], decoded_buf[i]) << " at " << i; 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(dest_buf); 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(decoded_buf); 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Case 4: 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_buf = nullptr; 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann dest_size = 0; 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE( 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pEncoders->RunLengthEncode(src_buf_4, src_size, &dest_buf, &dest_size)); 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decoded_buf = nullptr; 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann decoded_size = 0; 188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RunLengthDecode(dest_buf, dest_size, &decoded_buf, &decoded_size); 18933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann ASSERT_EQ(src_size, decoded_size); 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (uint32_t i = 0; i < src_size; i++) 19133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann EXPECT_EQ(src_buf_4[i], decoded_buf[i]) << " at " << i; 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(dest_buf); 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_Free(decoded_buf); 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 195