blob: 866d049c8ae5ca568caf4109633257a3285f0682 [file] [log] [blame]
//
// Copyright 2015 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.
//
// BinaryStream_unittest.cpp: Unit tests of the binary stream classes.
#include <gtest/gtest.h>
#include "libANGLE/BinaryStream.h"
namespace angle
{
// Test that errors are properly generated for overflows.
TEST(BinaryInputStream, Overflow)
{
const uint8_t goodValue = 2;
const uint8_t badValue = 255;
const size_t dataSize = 1024;
const size_t slopSize = 1024;
std::vector<uint8_t> data(dataSize + slopSize);
std::fill(data.begin(), data.begin() + dataSize, goodValue);
std::fill(data.begin() + dataSize, data.end(), badValue);
std::vector<uint8_t> outputData(dataSize);
auto checkDataIsSafe = [=](uint8_t item) { return item == goodValue; };
{
// One large read
gl::BinaryInputStream stream(data.data(), dataSize);
stream.readBytes(outputData.data(), dataSize);
ASSERT_FALSE(stream.error());
ASSERT_TRUE(std::all_of(outputData.begin(), outputData.end(), checkDataIsSafe));
ASSERT_TRUE(stream.endOfStream());
}
{
// Two half-sized reads
gl::BinaryInputStream stream(data.data(), dataSize);
stream.readBytes(outputData.data(), dataSize / 2);
ASSERT_FALSE(stream.error());
stream.readBytes(outputData.data() + dataSize / 2, dataSize / 2);
ASSERT_FALSE(stream.error());
ASSERT_TRUE(std::all_of(outputData.begin(), outputData.end(), checkDataIsSafe));
ASSERT_TRUE(stream.endOfStream());
}
{
// One large read that is too big
gl::BinaryInputStream stream(data.data(), dataSize);
stream.readBytes(outputData.data(), dataSize + 1);
ASSERT_TRUE(stream.error());
}
{
// Two reads, one that overflows the offset
gl::BinaryInputStream stream(data.data(), dataSize);
stream.readBytes(outputData.data(), dataSize - 1);
ASSERT_FALSE(stream.error());
stream.readBytes(outputData.data(), std::numeric_limits<size_t>::max() - dataSize - 2);
}
}
} // namespace angle