// // Copyright (c) 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 #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 data(dataSize + slopSize); std::fill(data.begin(), data.begin() + dataSize, goodValue); std::fill(data.begin() + dataSize, data.end(), badValue); std::vector 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::max() - dataSize - 2); } } }