blob: ef493c2cd22e5f1bdd0d4dca32b07c3667336070 [file] [log] [blame]
//
// Copyright 2026 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// StreamingHasherPertTest:
// Performance benchmark for streaming hashers
//
#ifdef UNSAFE_BUFFERS_BUILD
# pragma allow_unsafe_buffers
#endif
#include "ANGLEPerfTest.h"
#include "anglebase/sha1.h"
#include "common/hash_utils.h"
#include "util/random_utils.h"
using namespace testing;
namespace
{
constexpr unsigned int kIterationsPerStep = 5;
template <typename T>
class StreamingHasherPerfTest : public ANGLEPerfTest
{
public:
StreamingHasherPerfTest();
void SetUp() override;
void TearDown() override;
void step() override;
private:
angle::RNG mRNG;
std::vector<uint8_t> mHeader;
std::vector<uint8_t> mBody;
std::vector<uint8_t> mFooter;
};
template <typename T>
StreamingHasherPerfTest<T>::StreamingHasherPerfTest()
: ANGLEPerfTest(::testing::UnitTest::GetInstance()->current_test_suite()->name(),
"",
"",
kIterationsPerStep),
mRNG(0x12345678u)
{}
template <typename T>
void StreamingHasherPerfTest<T>::SetUp()
{
constexpr size_t kSize = 1024;
// Set up header
mHeader.resize(kSize);
FillVectorWithRandomUBytes(&mRNG, &mHeader);
// Set up body
mBody.resize(kSize * 100);
FillVectorWithRandomUBytes(&mRNG, &mBody);
// Set up footer
mFooter.resize(kSize);
FillVectorWithRandomUBytes(&mRNG, &mFooter);
}
template <typename T>
void StreamingHasherPerfTest<T>::TearDown()
{
mHeader.clear();
mBody.clear();
mFooter.clear();
}
template <typename T>
void StreamingHasherPerfTest<T>::step()
{
const uint16_t chunkIndex = 5;
const uint32_t type = 0xABCD;
const size_t size = std::numeric_limits<size_t>::max();
const float version = 3.1415;
// Perform 100 iterations
for (int iteration = 0; iteration < 100; iteration++)
{
T hasher;
hasher.Init();
hasher.Update(mHeader.data(), mHeader.size());
hasher.Update(mBody.data(), mBody.size());
hasher.Update(mFooter.data(), mFooter.size());
angle::UpdateHashWithValue(hasher, chunkIndex);
angle::UpdateHashWithValue(hasher, type);
angle::UpdateHashWithValue(hasher, size);
angle::UpdateHashWithValue(hasher, version);
hasher.Final();
const unsigned char *hash = hasher.Digest();
(void)hash;
}
}
using TestTypes = Types<angle::base::SecureHashAlgorithm, angle::StreamingHasher>;
constexpr const char *kTestTypeNames[] = {"SecureHashAlgorithm", "StreamingHasher"};
class StreamingHasherNames
{
public:
template <typename BitSetType>
static std::string GetName(int typeIndex)
{
return kTestTypeNames[typeIndex];
}
};
TYPED_TEST_SUITE(StreamingHasherPerfTest, TestTypes, StreamingHasherNames);
// Test hashing speed for different streaming hashers
TYPED_TEST(StreamingHasherPerfTest, Run)
{
this->run();
}
} // anonymous namespace