//
// 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
