tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 9af5cb6bfc371741c1a976b71e42931137ec0201
parent 870518d61d9b976d13ad51ec10b71661bb17e35a
Author: agoloman <agoloman@mozilla.com>
Date:   Wed, 15 Oct 2025 11:43:45 +0300

Revert "Bug 1975192 - Implement the RiceDeltaDecoder for various lengths. r=dimi" for causing build bustages @RiceDeltaDecoder.cpp.

This reverts commit 45bb87a424e6a59804afc42a59b59cb41de306dd.

Diffstat:
Mtoolkit/components/url-classifier/ProtocolParser.cpp | 205+------------------------------------------------------------------------------
Mtoolkit/components/url-classifier/ProtocolParser.h | 12------------
Mtoolkit/components/url-classifier/RiceDeltaDecoder.cpp | 227+------------------------------------------------------------------------------
Mtoolkit/components/url-classifier/RiceDeltaDecoder.h | 47-----------------------------------------------
Mtoolkit/components/url-classifier/tests/gtest/TestRiceDeltaDecoder.cpp | 105-------------------------------------------------------------------------------
5 files changed, 2 insertions(+), 594 deletions(-)

diff --git a/toolkit/components/url-classifier/ProtocolParser.cpp b/toolkit/components/url-classifier/ProtocolParser.cpp @@ -1178,15 +1178,9 @@ nsresult ProtocolParserProtobufV5::ProcessOneResponse( rv = ProcessAddition4Bytes(*tuV4, aHashList.additions_four_bytes()); break; case v5::HashList::kAdditionsEightBytes: - rv = ProcessAddition8Bytes(*tuV4, aHashList.additions_eight_bytes()); - break; case v5::HashList::kAdditionsSixteenBytes: - rv = ProcessAddition16Bytes(*tuV4, aHashList.additions_sixteen_bytes()); - break; case v5::HashList::kAdditionsThirtyTwoBytes: - rv = - ProcessAddition32Bytes(*tuV4, aHashList.additions_thirty_two_bytes()); - break; + return NS_ERROR_NOT_IMPLEMENTED; case v5::HashList::COMPRESSED_ADDITIONS_NOT_SET: break; } @@ -1245,121 +1239,6 @@ static nsresult DoRiceDeltaDecode4Bytes( return NS_OK; } -static nsresult DoRiceDeltaDecode8Bytes( - const v5::RiceDeltaEncoded64Bit& aEncoding, nsTArray<uint64_t>& aDecoded) { - auto first_value = aEncoding.first_value(); - - PARSER_LOG(("* Encoding info for V5 8bytes encoding:")); - PARSER_LOG((" - First value: %" PRIu64, first_value)); - PARSER_LOG((" - Num of entries: %d", aEncoding.entries_count())); - PARSER_LOG((" - Rice parameter: %d", aEncoding.rice_parameter())); - - // Set up the input buffer. Note that the bits should be read - // from LSB to MSB so that we in-place reverse the bits before - // feeding to the decoder. - auto encoded = - const_cast<v5::RiceDeltaEncoded64Bit&>(aEncoding).mutable_encoded_data(); - RiceDeltaDecoder decoder((uint8_t*)encoded->c_str(), encoded->size()); - - // Setup the output buffer. The "first value" is included in - // the output buffer. - if (!aDecoded.SetLength(aEncoding.entries_count() + 1, mozilla::fallible)) { - NS_WARNING("Not enough memory to decode the RiceDelta input."); - return NS_ERROR_OUT_OF_MEMORY; - } - - // Decode! - bool rv = decoder.Decode64( - aEncoding.rice_parameter(), first_value, - aEncoding.entries_count(), // # of entries (first value not included). - &aDecoded[0]); - - NS_ENSURE_TRUE(rv, NS_ERROR_UC_PARSER_DECODE_FAILURE); - - return NS_OK; -} - -static nsresult DoRiceDeltaDecode16Bytes( - const v5::RiceDeltaEncoded128Bit& aEncoding, nsACString& aDecoded) { - auto first_value_hi = aEncoding.first_value_hi(); - auto first_value_lo = aEncoding.first_value_lo(); - - PARSER_LOG(("* Encoding info for V5 16bytes encoding:")); - PARSER_LOG((" - First value hi: %" PRIu64, first_value_hi)); - PARSER_LOG((" - First value lo: %" PRIu64, first_value_lo)); - PARSER_LOG((" - Num of entries: %d", aEncoding.entries_count())); - PARSER_LOG((" - Rice parameter: %d", aEncoding.rice_parameter())); - - // Set up the input buffer. Note that the bits should be read - // from LSB to MSB so that we in-place reverse the bits before - // feeding to the decoder. - auto encoded = - const_cast<v5::RiceDeltaEncoded128Bit&>(aEncoding).mutable_encoded_data(); - RiceDeltaDecoder decoder((uint8_t*)encoded->c_str(), encoded->size()); - - // Setup the output buffer. The "first value" is included in - // the output buffer. - if (!aDecoded.SetCapacity(aEncoding.entries_count() * 16, - mozilla::fallible)) { - NS_WARNING("Not enough memory to decode the RiceDelta input."); - return NS_ERROR_OUT_OF_MEMORY; - } - - // Decode! - bool rv = decoder.Decode128( - aEncoding.rice_parameter(), first_value_hi, first_value_lo, - aEncoding.entries_count(), // # of entries (first value not included). - aDecoded); - - NS_ENSURE_TRUE(rv, NS_ERROR_UC_PARSER_DECODE_FAILURE); - - return NS_OK; -} - -static nsresult DoRiceDeltaDecode32Bytes( - const v5::RiceDeltaEncoded256Bit& aEncoding, nsACString& aDecoded) { - auto first_value_first_part = aEncoding.first_value_first_part(); - auto first_value_second_part = aEncoding.first_value_second_part(); - auto first_value_third_part = aEncoding.first_value_third_part(); - auto first_value_fourth_part = aEncoding.first_value_fourth_part(); - - PARSER_LOG(("* Encoding info for V5 32bytes encoding:")); - PARSER_LOG((" - First value first part: %" PRIu64, first_value_first_part)); - PARSER_LOG( - (" - First value second part: %" PRIu64, first_value_second_part)); - PARSER_LOG((" - First value third part: %" PRIu64, first_value_third_part)); - PARSER_LOG( - (" - First value fourth part: %" PRIu64, first_value_fourth_part)); - PARSER_LOG((" - Num of entries: %d", aEncoding.entries_count())); - PARSER_LOG((" - Rice parameter: %d", aEncoding.rice_parameter())); - - // Set up the input buffer. Note that the bits should be read - // from LSB to MSB so that we in-place reverse the bits before - // feeding to the decoder. - auto encoded = - const_cast<v5::RiceDeltaEncoded256Bit&>(aEncoding).mutable_encoded_data(); - RiceDeltaDecoder decoder((uint8_t*)encoded->c_str(), encoded->size()); - - // Setup the output buffer. The "first value" is included in - // the output buffer. - if (!aDecoded.SetCapacity((aEncoding.entries_count() + 1) * 32, - mozilla::fallible)) { - NS_WARNING("Not enough memory to decode the RiceDelta input."); - return NS_ERROR_OUT_OF_MEMORY; - } - - // Decode! - bool rv = decoder.Decode256( - aEncoding.rice_parameter(), first_value_first_part, - first_value_second_part, first_value_third_part, first_value_fourth_part, - aEncoding.entries_count(), // # of entries (first value not included). - aDecoded); - - NS_ENSURE_TRUE(rv, NS_ERROR_UC_PARSER_DECODE_FAILURE); - - return NS_OK; -} - nsresult ProtocolParserProtobufV5::ProcessAddition4Bytes( TableUpdateV4& aTableUpdate, const v5::RiceDeltaEncoded32Bit& aAddition) { nsTArray<uint32_t> decoded; @@ -1381,7 +1260,6 @@ nsresult ProtocolParserProtobufV5::ProcessAddition4Bytes( // We need to swap the bytes to get the correct prefix. char p[4]; NativeEndian::copyAndSwapToBigEndian(p, &decoded[i], 1); - prefixes.Append(p, 4); } @@ -1389,87 +1267,6 @@ nsresult ProtocolParserProtobufV5::ProcessAddition4Bytes( return NS_OK; } -nsresult ProtocolParserProtobufV5::ProcessAddition8Bytes( - TableUpdateV4& aTableUpdate, const v5::RiceDeltaEncoded64Bit& aAddition) { - nsTArray<uint64_t> decoded; - - nsresult rv = DoRiceDeltaDecode8Bytes(aAddition, decoded); - if (NS_FAILED(rv)) { - PARSER_LOG(("Failed to parse encoded prefixes.")); - return rv; - } - - nsCString prefixes; - if (!prefixes.SetCapacity(decoded.Length() * 8, mozilla::fallible)) { - return NS_ERROR_OUT_OF_MEMORY; - } - - for (size_t i = 0; i < decoded.Length(); i++) { - char p[8]; - NativeEndian::copyAndSwapToBigEndian(p, &decoded[i], 1); - prefixes.Append(p, 8); - } - - aTableUpdate.NewPrefixes(8, prefixes); - return NS_OK; -} - -nsresult ProtocolParserProtobufV5::ProcessAddition16Bytes( - TableUpdateV4& aTableUpdate, const v5::RiceDeltaEncoded128Bit& aAddition) { - nsAutoCString decoded; - - nsresult rv = DoRiceDeltaDecode16Bytes(aAddition, decoded); - if (NS_FAILED(rv)) { - PARSER_LOG(("Failed to parse encoded prefixes.")); - return rv; - } - - nsCString prefixes; - if (!prefixes.SetCapacity(decoded.Length(), mozilla::fallible)) { - return NS_ERROR_OUT_OF_MEMORY; - } - - for (size_t i = 0; i < decoded.Length() / 16; i++) { - // Swap the bytes to the correct endianness, the data is 128-bits long. - char p[16]; - for (size_t j = 0; j < 16; j++) { - p[j] = decoded[i * 16 + (15 - j)]; - } - prefixes.Append(p, 16); - } - - aTableUpdate.NewPrefixes(16, prefixes); - return NS_OK; -} - -nsresult ProtocolParserProtobufV5::ProcessAddition32Bytes( - TableUpdateV4& aTableUpdate, const v5::RiceDeltaEncoded256Bit& aAddition) { - nsAutoCString decoded; - - nsresult rv = DoRiceDeltaDecode32Bytes(aAddition, decoded); - if (NS_FAILED(rv)) { - PARSER_LOG(("Failed to parse encoded prefixes.")); - return rv; - } - - nsCString prefixes; - if (!prefixes.SetCapacity(decoded.Length(), mozilla::fallible)) { - return NS_ERROR_OUT_OF_MEMORY; - } - - for (size_t i = 0; i < decoded.Length() / 32; i++) { - // Swap the bytes to the correct endianness, the data is 256-bits long. - char p[32]; - for (size_t j = 0; j < 32; j++) { - p[j] = decoded[i * 32 + (31 - j)]; - } - prefixes.Append(p, 32); - } - - aTableUpdate.NewPrefixes(32, prefixes); - return NS_OK; -} - nsresult ProtocolParserProtobufV5::ProcessRemoval( TableUpdateV4& aTableUpdate, const v5::RiceDeltaEncoded32Bit& aRemoval) { nsTArray<uint32_t> decoded; diff --git a/toolkit/components/url-classifier/ProtocolParser.h b/toolkit/components/url-classifier/ProtocolParser.h @@ -218,18 +218,6 @@ class ProtocolParserProtobufV5 final : public ProtocolParser { nsresult ProcessAddition4Bytes(TableUpdateV4& aTableUpdate, const v5::RiceDeltaEncoded32Bit& aAddition); - // Process the additions for a 8-byte encoded prefixes. - nsresult ProcessAddition8Bytes(TableUpdateV4& aTableUpdate, - const v5::RiceDeltaEncoded64Bit& aAddition); - - // Process the additions for a 16-byte encoded prefixes. - nsresult ProcessAddition16Bytes(TableUpdateV4& aTableUpdate, - const v5::RiceDeltaEncoded128Bit& aAddition); - - // Process the additions for a 32-byte encoded prefixes. - nsresult ProcessAddition32Bytes(TableUpdateV4& aTableUpdate, - const v5::RiceDeltaEncoded256Bit& aAddition); - // Process the removals for a encoded prefixes. nsresult ProcessRemoval(TableUpdateV4& aTableUpdate, const v5::RiceDeltaEncoded32Bit& aRemoval); diff --git a/toolkit/components/url-classifier/RiceDeltaDecoder.cpp b/toolkit/components/url-classifier/RiceDeltaDecoder.cpp @@ -76,62 +76,6 @@ static void ReverseByte(uint8_t& b) { b = (b & 0xAA) >> 1 | (b & 0x55) << 1; } -// Template for multi-precision numbers. Supports 128-bit (2 uint64_t) and -// 256-bit (4 uint64_t) -template <size_t N> -struct Number { - static_assert( - N >= 2 && N <= 4, - "Number template only supports 128-bit (N=2) and 256-bit (N=4)"); - - Number() { - for (size_t i = 0; i < N; i++) { - mData[i] = 0; - } - } - - // Constructor that takes an array of values - explicit Number(const uint64_t (&values)[N]) { - for (size_t i = 0; i < N; i++) { - mData[i] = values[i]; - } - } - - const char* get() const { return reinterpret_cast<const char*>(mData); } - - Number operator+(const Number& aOther) const { - uint64_t result[N]; - uint64_t carry = 0; - - // Add from least significant to most significant, propagating carry - for (size_t i = 0; i < N; i++) { - uint64_t sum = mData[i] + aOther.mData[i] + carry; - result[i] = sum; - // Check for overflow: if the sum is less than either operand (when carry - // is 0) or if the sum is less than the sum without carry (when carry is - // 1) - carry = (sum < mData[i]) || (carry && sum < (mData[i] + aOther.mData[i])) - ? 1 - : 0; - } - - return Number(result); - } - - Number operator=(const Number& aOther) { - for (size_t i = 0; i < N; i++) { - mData[i] = aOther.mData[i]; - } - return *this; - } - - uint64_t mData[N]; -}; - -// Type aliases for convenience -using Number128 = Number<2>; -using Number256 = Number<4>; - namespace mozilla { namespace safebrowsing { @@ -176,182 +120,13 @@ bool RiceDeltaDecoder::Decode(uint32_t aRiceParameter, uint32_t aFirstValue, // Caculate N from q,r,k. uint32_t N = (q << k) + r; - // We start filling aDecodedData. - aDecodedData[i + 1] = N + aDecodedData[i]; - } - - return true; -} - -bool RiceDeltaDecoder::Decode64(uint32_t aRiceParameter, uint64_t aFirstValue, - uint32_t aNumEntries, uint64_t* aDecodedData) { - // Reverse each byte before reading bits from the byte buffer. - for (size_t i = 0; i < mEncodedDataSize; i++) { - ReverseByte(mEncodedData[i]); - } - - BitBuffer bitBuffer(mEncodedData, mEncodedDataSize); - - // q = quotient - // r = remainder - // k = RICE parameter - const uint32_t k = aRiceParameter; - aDecodedData[0] = aFirstValue; - for (uint32_t i = 0; i < aNumEntries; i++) { - // Read the quotient of N. - uint32_t q; - if (!bitBuffer.ReadExponentialGolomb(&q)) { - LOG(("Encoded data underflow!")); - return false; - } - - // Read the remainder of N, one bit at a time. - uint64_t r = 0; - for (uint32_t j = 0; j < k; j++) { - uint32_t b = 0; - if (!bitBuffer.ReadBits(&b, 1)) { - // Insufficient bits. Just leave them as zeros. - break; - } - // Add the bit to the right position so that it's in Little Endian order. - r |= static_cast<uint64_t>(b) << j; - } - - // Calculate N from q,r,k. - uint64_t N = (static_cast<uint64_t>(q) << k) + r; - - // We start filling aDecodedData. + // We start filling aDecodedData from [1]. aDecodedData[i + 1] = N + aDecodedData[i]; } return true; } -bool RiceDeltaDecoder::Decode128(uint32_t aRiceParameter, - uint64_t aFirstValueHigh, - uint64_t aFirstValueLow, uint32_t aNumEntries, - nsACString& aDecodedData) { - // Reverse each byte before reading bits from the byte buffer. - for (size_t i = 0; i < mEncodedDataSize; i++) { - ReverseByte(mEncodedData[i]); - } - - BitBuffer bitBuffer(mEncodedData, mEncodedDataSize); - - // q = quotient - // r = remainder - // k = RICE parameter - const uint32_t k = aRiceParameter; - Number128 firstValue({aFirstValueLow, aFirstValueHigh}); - - aDecodedData.Append(firstValue.get(), sizeof(firstValue)); - - Number128 previousValue = firstValue; - for (uint32_t i = 0; i < aNumEntries; i++) { - // Read the quotient of N. - uint32_t q; - if (!bitBuffer.ReadExponentialGolomb(&q)) { - LOG(("Encoded data underflow!")); - return false; - } - - // The rice parameter is guaranteed to be between 99 and 126. So, the - // quotient is guaranteed to be located at the first 4 bytes. - uint64_t r[2] = {0, 0}; - for (uint32_t j = 0; j < k; j++) { - uint32_t b = 0; - if (!bitBuffer.ReadBits(&b, 1)) { - // Insufficient bits. Just leave them as zeros. - break; - } - // Add the bit to the right position so that it's in Little Endian order. - r[j / 64] |= static_cast<uint64_t>(b) << (j % 64); - } - - // Calculate N from q,r,k. - uint64_t N[2] = {0, 0}; - N[0] = r[0]; - N[1] = (static_cast<uint64_t>(q) << (k - 64)) + r[1]; - - // Create delta N and add it to the previous value - Number128 deltaN(N); - Number128 result = previousValue + deltaN; - previousValue = result; - - // Append the result to the decoded data - aDecodedData.Append(result.get(), sizeof(result)); - } - - return true; -} - -bool RiceDeltaDecoder::Decode256(uint32_t aRiceParameter, - uint64_t aFirstValueOne, - uint64_t aFirstValueTwo, - uint64_t aFirstValueThree, - uint64_t aFirstValueFour, uint32_t aNumEntries, - nsACString& aDecodedData) { - // Reverse each byte before reading bits from the byte buffer. - for (size_t i = 0; i < mEncodedDataSize; i++) { - ReverseByte(mEncodedData[i]); - } - - BitBuffer bitBuffer(mEncodedData, mEncodedDataSize); - - // q = quotient - // r = remainder - // k = RICE parameter - const uint32_t k = aRiceParameter; - // The first value is in the Big Endian order. The value one contains the - // highest 64 bits, value two contains the second highest 64 bits, and so on. - Number256 firstValue( - {aFirstValueFour, aFirstValueThree, aFirstValueTwo, aFirstValueOne}); - - aDecodedData.Append(firstValue.get(), sizeof(firstValue)); - - Number256 previousValue = firstValue; - for (uint32_t i = 0; i < aNumEntries; i++) { - // Read the quotient of N. - uint32_t q; - if (!bitBuffer.ReadExponentialGolomb(&q)) { - LOG(("Encoded data underflow!")); - return false; - } - - // Read the remainder of N, one bit at a time. - uint64_t r[4] = {0, 0, 0, 0}; - - for (uint32_t j = 0; j < k; j++) { - uint32_t b = 0; - if (!bitBuffer.ReadBits(&b, 1)) { - // Insufficient bits. Just leave them as zeros. - break; - } - // Add the bit to the right position so that it's in Little Endian order. - r[j / 64] |= static_cast<uint64_t>(b) << (j % 64); - } - - // Calculate N from q,r,k. - // The rice parameter is guaranteed to be between 227 and 254. So, the - // quotient is guaranteed to be located at the highest 4 bytes. - uint64_t N[4] = {0, 0, 0, 0}; - N[0] = r[0]; - N[1] = r[1]; - N[2] = r[2]; - N[3] = (static_cast<uint64_t>(q) << (k - (64 * 3))) + r[3]; - - // Create delta N and add it to the previous value - Number256 deltaN(N); - Number256 result = previousValue + deltaN; - previousValue = result; - - // Append the result to the decoded data - aDecodedData.Append(result.get(), sizeof(result)); - } - - return true; -} - } // namespace safebrowsing } // namespace mozilla diff --git a/toolkit/components/url-classifier/RiceDeltaDecoder.h b/toolkit/components/url-classifier/RiceDeltaDecoder.h @@ -8,8 +8,6 @@ #include <cstddef> #include <cstdint> -#include "nsStringFwd.h" - namespace mozilla { namespace safebrowsing { @@ -31,51 +29,6 @@ class RiceDeltaDecoder { bool Decode(uint32_t aRiceParameter, uint32_t aFirstValue, uint32_t aNumEntries, uint32_t* aDecodedData); - // Decode the 64-bit encoded data. - // - // @param aFirstValue The first value of the encoded data. - // @param aNumEntries The number of values to be decoded, not including - // the first value. - // @param aDecodedData A pre-allocated output buffer. Note that - // aDecodedData[0] will be filled with |aFirstValue| - // and the buffer length (in byte) should be - // ((aNumEntries + 1) * sizeof(uint64_t)). - bool Decode64(uint32_t aRiceParameter, uint64_t aFirstValue, - uint32_t aNumEntries, uint64_t* aDecodedData); - - // Decode the 128-bit encoded data. - // - // @param aFirstValueHigh The high 64 bits of the first value of the encoded - // data. - // @param aFirstValueLow The low 64 bits of the first value of the encoded - // data. - // @param aNumEntries The number of values to be decoded, not including - // the first value. - // @param aDecodedData A pre-allocated output buffer. Note that - // the first 16 bytes will be filled with |aFirstValue| - // and the buffer length (in byte) should be - // ((aNumEntries + 1) * 16). - bool Decode128(uint32_t aRiceParameter, uint64_t aFirstValueHigh, - uint64_t aFirstValueLow, uint32_t aNumEntries, - nsACString& aDecodedData); - - // Decode the 256-bit encoded data. - // - // @param aFirstValueOne The first high 64 bits value of the encoded data. - // @param aFirstValueTwo The second high 64 bits value of the encoded data. - // @param aFirstValueThree The third high 64 bits value of the encoded data. - // @param aFirstValueFour The fourth high 64 bits value of the encoded data. - // @param aNumEntries The number of values to be decoded, not including - // the first value. - // @param aDecodedData A pre-allocated output buffer. Note that - // the first 32 byteswill be filled with |aFirstValue| - // and the buffer length (in byte) should be - // ((aNumEntries + 1) * 32). - bool Decode256(uint32_t aRiceParameter, uint64_t aFirstValueOne, - uint64_t aFirstValueTwo, uint64_t aFirstValueThree, - uint64_t aFirstValueFour, uint32_t aNumEntries, - nsACString& aDecodedData); - private: uint8_t* mEncodedData; size_t mEncodedDataSize; diff --git a/toolkit/components/url-classifier/tests/gtest/TestRiceDeltaDecoder.cpp b/toolkit/components/url-classifier/tests/gtest/TestRiceDeltaDecoder.cpp @@ -16,24 +16,6 @@ struct TestingData { uint32_t mRiceParameter; }; -struct TestingData64 { - std::vector<uint64_t> mExpectedDecoded; - std::vector<uint8_t> mEncoded; - uint32_t mRiceParameter; -}; - -struct TestingData128 { - nsCString mExpectedDecoded; - std::vector<uint8_t> mEncoded; - uint32_t mRiceParameter; -}; - -struct TestingData256 { - nsCString mExpectedDecoded; - std::vector<uint8_t> mEncoded; - uint32_t mRiceParameter; -}; - } // namespace static bool runOneTest(TestingData& aData) { @@ -50,65 +32,6 @@ static bool runOneTest(TestingData& aData) { return rv && decoded == aData.mExpectedDecoded; } -static bool runOneTest64(TestingData64& aData) { - RiceDeltaDecoder decoder(&aData.mEncoded[0], aData.mEncoded.size()); - - std::vector<uint64_t> decoded(aData.mExpectedDecoded.size()); - - uint64_t firstValue = - reinterpret_cast<uint64_t*>(&aData.mExpectedDecoded[0])[0]; - bool rv = decoder.Decode64( - aData.mRiceParameter, firstValue, - decoded.size() - 1, // # of entries (first value not included). - &decoded[0]); - - return rv && decoded == aData.mExpectedDecoded; -} - -static bool runOneTest128(TestingData128& aData) { - RiceDeltaDecoder decoder(&aData.mEncoded[0], aData.mEncoded.size()); - - nsAutoCString decoded; - decoded.SetCapacity(aData.mExpectedDecoded.Length()); - - uint64_t firstValueHigh = - reinterpret_cast<const uint64_t*>(aData.mExpectedDecoded.get())[1]; - uint64_t firstValueLow = - reinterpret_cast<const uint64_t*>(aData.mExpectedDecoded.get())[0]; - - bool rv = - decoder.Decode128(aData.mRiceParameter, firstValueHigh, firstValueLow, - (aData.mExpectedDecoded.Length() / 16) - - 1, // # of entries (first value not included). - decoded); - - return rv && decoded == aData.mExpectedDecoded; -} - -static bool runOneTest256(TestingData256& aData) { - RiceDeltaDecoder decoder(&aData.mEncoded[0], aData.mEncoded.size()); - - nsAutoCString decoded; - decoded.SetCapacity(aData.mExpectedDecoded.Length()); - - uint64_t firstValueOne = - reinterpret_cast<const uint64_t*>(aData.mExpectedDecoded.get())[3]; - uint64_t firstValueTwo = - reinterpret_cast<const uint64_t*>(aData.mExpectedDecoded.get())[2]; - uint64_t firstValueThree = - reinterpret_cast<const uint64_t*>(aData.mExpectedDecoded.get())[1]; - uint64_t firstValueFour = - reinterpret_cast<const uint64_t*>(aData.mExpectedDecoded.get())[0]; - bool rv = - decoder.Decode256(aData.mRiceParameter, firstValueOne, firstValueTwo, - firstValueThree, firstValueFour, - (aData.mExpectedDecoded.Length() / 32) - - 1, // # of entries (first value not included). - decoded); - - return rv && decoded == aData.mExpectedDecoded; -} - TEST(UrlClassifierRiceDeltaDecoder, SingleEncodedValue) { TestingData td = {{99}, {99}, 0}; @@ -116,34 +39,6 @@ TEST(UrlClassifierRiceDeltaDecoder, SingleEncodedValue) ASSERT_TRUE(runOneTest(td)); } -TEST(UrlClassifierRiceDeltaDecoder, SingleEncodedValue64) -{ - TestingData64 td = {{99}, {99}, 0}; - ASSERT_TRUE(runOneTest64(td)); -} - -TEST(UrlClassifierRiceDeltaDecoder, SingleEncodedValue128) -{ - TestingData128 td = { - nsLiteralCString( - "\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), - {99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - 0}; - ASSERT_TRUE(runOneTest128(td)); -} - -TEST(UrlClassifierRiceDeltaDecoder, SingleEncodedValue256) -{ - TestingData256 td = { - nsLiteralCString( - "\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), - {99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - 0}; - ASSERT_TRUE(runOneTest256(td)); -} - // In this batch of tests, the encoded data would be like // what we originally receive from the network. See comment // in |runOneTest| for more detail.