summaryrefslogtreecommitdiffstats
path: root/gfx/angle/src/libANGLE/BinaryStream_unittest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/src/libANGLE/BinaryStream_unittest.cpp')
-rwxr-xr-xgfx/angle/src/libANGLE/BinaryStream_unittest.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/gfx/angle/src/libANGLE/BinaryStream_unittest.cpp b/gfx/angle/src/libANGLE/BinaryStream_unittest.cpp
new file mode 100755
index 000000000..963f48911
--- /dev/null
+++ b/gfx/angle/src/libANGLE/BinaryStream_unittest.cpp
@@ -0,0 +1,71 @@
+//
+// 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 <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);
+ }
+}
+}