/* * Copyright 2022 Google Inc * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "sim/bufval.hh" using namespace gem5; using testing::ElementsAre; template bool pairFail(const std::pair &p) { return !p.second; } bool pairFailU64(const std::pair &p) { return pairFail(p); } bool pairFailStr(const std::pair &p) { return pairFail(p); } template bool pairVal(const std::pair &p, const First &expected) { auto &[first, success] = p; return success && (first == expected); } bool pairValU64(const std::pair &p, std::uint64_t expected) { return pairVal(p, expected); } bool pairValStr(const std::pair &p, const std::string &expected) { return pairVal(p, expected); } TEST(GetUintX, BadSize) { uint8_t dummy{}; EXPECT_PRED1(pairFailU64, getUintX(&dummy, 0, ByteOrder::little)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 0, ByteOrder::big)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 3, ByteOrder::little)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 3, ByteOrder::big)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 5, ByteOrder::little)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 5, ByteOrder::big)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 6, ByteOrder::little)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 6, ByteOrder::big)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 7, ByteOrder::little)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 7, ByteOrder::big)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 9, ByteOrder::little)); EXPECT_PRED1(pairFailU64, getUintX(&dummy, 9, ByteOrder::big)); } TEST(GetUintX, LittleEndian) { const std::array buf = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9}; EXPECT_PRED2(pairValU64, getUintX(buf.data(), 1, ByteOrder::little), 0x01); EXPECT_PRED2(pairValU64, getUintX(buf.data(), 2, ByteOrder::little), 0x0201); EXPECT_PRED2(pairValU64, getUintX(buf.data(), 4, ByteOrder::little), 0x04030201); EXPECT_PRED2(pairValU64, getUintX(buf.data(), 8, ByteOrder::little), 0x0807060504030201); } TEST(GetUintX, BigEndian) { const std::array buf = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9}; EXPECT_PRED2(pairValU64, getUintX(buf.data(), 1, ByteOrder::big), 0x01); EXPECT_PRED2(pairValU64, getUintX(buf.data(), 2, ByteOrder::big), 0x0102); EXPECT_PRED2(pairValU64, getUintX(buf.data(), 4, ByteOrder::big), 0x01020304); EXPECT_PRED2(pairValU64, getUintX(buf.data(), 8, ByteOrder::big), 0x0102030405060708); } TEST(SetUintX, BadSize) { uint8_t dummy{}; EXPECT_FALSE(setUintX(0, &dummy, 0, ByteOrder::little)); EXPECT_FALSE(setUintX(0, &dummy, 0, ByteOrder::big)); EXPECT_FALSE(setUintX(0, &dummy, 3, ByteOrder::little)); EXPECT_FALSE(setUintX(0, &dummy, 3, ByteOrder::big)); EXPECT_FALSE(setUintX(0, &dummy, 5, ByteOrder::little)); EXPECT_FALSE(setUintX(0, &dummy, 5, ByteOrder::big)); EXPECT_FALSE(setUintX(0, &dummy, 6, ByteOrder::little)); EXPECT_FALSE(setUintX(0, &dummy, 6, ByteOrder::big)); EXPECT_FALSE(setUintX(0, &dummy, 7, ByteOrder::little)); EXPECT_FALSE(setUintX(0, &dummy, 7, ByteOrder::big)); EXPECT_FALSE(setUintX(0, &dummy, 9, ByteOrder::little)); EXPECT_FALSE(setUintX(0, &dummy, 9, ByteOrder::big)); } TEST(SetUintX, LittleEndian) { const std::array orig_buf = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9}; auto buf = orig_buf; EXPECT_TRUE(setUintX(0xf1, buf.data(), 1, ByteOrder::little)); EXPECT_THAT(buf, ElementsAre(0xf1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9)); EXPECT_TRUE(setUintX(0xe2e1, buf.data(), 2, ByteOrder::little)); EXPECT_THAT(buf, ElementsAre(0xe1, 0xe2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9)); EXPECT_TRUE(setUintX(0xd4d3d2d1, buf.data(), 4, ByteOrder::little)); EXPECT_THAT(buf, ElementsAre(0xd1, 0xd2, 0xd3, 0xd4, 0x5, 0x6, 0x7, 0x8, 0x9)); EXPECT_TRUE(setUintX(0xc8c7c6c5c4c3c2c1, buf.data(), 8, ByteOrder::little)); EXPECT_THAT(buf, ElementsAre(0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0x9)); } TEST(SetUintX, BigEndian) { const std::array orig_buf = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9}; auto buf = orig_buf; EXPECT_TRUE(setUintX(0xf1, buf.data(), 1, ByteOrder::big)); EXPECT_THAT(buf, ElementsAre(0xf1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9)); EXPECT_TRUE(setUintX(0xe1e2, buf.data(), 2, ByteOrder::big)); EXPECT_THAT(buf, ElementsAre(0xe1, 0xe2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9)); EXPECT_TRUE(setUintX(0xd1d2d3d4, buf.data(), 4, ByteOrder::big)); EXPECT_THAT(buf, ElementsAre(0xd1, 0xd2, 0xd3, 0xd4, 0x5, 0x6, 0x7, 0x8, 0x9)); EXPECT_TRUE(setUintX(0xc1c2c3c4c5c6c7c8, buf.data(), 8, ByteOrder::big)); EXPECT_THAT(buf, ElementsAre(0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0x9)); } TEST(PrintUintX, BadSize) { uint8_t dummy{}; EXPECT_PRED1(pairFailStr, printUintX(&dummy, 0, ByteOrder::little)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 0, ByteOrder::big)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 3, ByteOrder::little)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 3, ByteOrder::big)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 5, ByteOrder::little)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 5, ByteOrder::big)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 6, ByteOrder::little)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 6, ByteOrder::big)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 7, ByteOrder::little)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 7, ByteOrder::big)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 9, ByteOrder::little)); EXPECT_PRED1(pairFailStr, printUintX(&dummy, 9, ByteOrder::big)); } TEST(PrintUintX, LittleEndian) { const std::array buf = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9}; EXPECT_PRED2(pairValStr, printUintX(buf.data(), 1, ByteOrder::little), "0x01"); EXPECT_PRED2(pairValStr, printUintX(buf.data(), 2, ByteOrder::little), "0x0201"); EXPECT_PRED2(pairValStr, printUintX(buf.data(), 4, ByteOrder::little), "0x04030201"); EXPECT_PRED2(pairValStr, printUintX(buf.data(), 8, ByteOrder::little), "0x0807060504030201"); } TEST(PrintUintX, BigEndian) { const std::array buf = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9}; EXPECT_PRED2(pairValStr, printUintX(buf.data(), 1, ByteOrder::big), "0x01"); EXPECT_PRED2(pairValStr, printUintX(buf.data(), 2, ByteOrder::big), "0x0102"); EXPECT_PRED2(pairValStr, printUintX(buf.data(), 4, ByteOrder::big), "0x01020304"); EXPECT_PRED2(pairValStr, printUintX(buf.data(), 8, ByteOrder::big), "0x0102030405060708"); } TEST(PrintByteBuf, LittleEndian) { const std::array buf = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xa}; EXPECT_EQ(printByteBuf(buf.data(), 0, ByteOrder::little, 3), "[]"); EXPECT_EQ(printByteBuf(buf.data(), 1, ByteOrder::little, 3), "[01]"); EXPECT_EQ(printByteBuf(buf.data(), 2, ByteOrder::little, 3), "[0102]"); EXPECT_EQ(printByteBuf(buf.data(), 3, ByteOrder::little, 3), "[010203]"); EXPECT_EQ(printByteBuf(buf.data(), 4, ByteOrder::little, 3), "[010203 04]"); EXPECT_EQ(printByteBuf(buf.data(), 5, ByteOrder::little, 3), "[010203 0405]"); EXPECT_EQ(printByteBuf(buf.data(), 6, ByteOrder::little, 3), "[010203 040506]"); EXPECT_EQ(printByteBuf(buf.data(), 7, ByteOrder::little, 3), "[010203 040506 07]"); EXPECT_EQ(printByteBuf(buf.data(), 8, ByteOrder::little, 3), "[010203 040506 0708]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 3), "[010203 040506 07080a]"); } TEST(PrintByteBuf, BigEndian) { const std::array buf = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xa}; EXPECT_EQ(printByteBuf(buf.data(), 0, ByteOrder::big, 3), "[]"); EXPECT_EQ(printByteBuf(buf.data(), 1, ByteOrder::big, 3), "[01]"); EXPECT_EQ(printByteBuf(buf.data(), 2, ByteOrder::big, 3), "[0201]"); EXPECT_EQ(printByteBuf(buf.data(), 3, ByteOrder::big, 3), "[030201]"); EXPECT_EQ(printByteBuf(buf.data(), 4, ByteOrder::big, 3), "[04 030201]"); EXPECT_EQ(printByteBuf(buf.data(), 5, ByteOrder::big, 3), "[0504 030201]"); EXPECT_EQ(printByteBuf(buf.data(), 6, ByteOrder::big, 3), "[060504 030201]"); EXPECT_EQ(printByteBuf(buf.data(), 7, ByteOrder::big, 3), "[07 060504 030201]"); EXPECT_EQ(printByteBuf(buf.data(), 8, ByteOrder::big, 3), "[0807 060504 030201]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 3), "[0a0807 060504 030201]"); } TEST(PrintByteBuf, ChunkSize) { const std::array buf = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xa}; EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 1), "[01 02 03 04 05 06 07 08 0a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 2), "[0102 0304 0506 0708 0a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 3), "[010203 040506 07080a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 4), "[01020304 05060708 0a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 5), "[0102030405 0607080a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 6), "[010203040506 07080a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 7), "[01020304050607 080a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 8), "[0102030405060708 0a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 9), "[01020304050607080a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 10), "[01020304050607080a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::little, 100), "[01020304050607080a]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 1), "[0a 08 07 06 05 04 03 02 01]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 2), "[0a 0807 0605 0403 0201]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 3), "[0a0807 060504 030201]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 4), "[0a 08070605 04030201]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 5), "[0a080706 0504030201]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 6), "[0a0807 060504030201]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 7), "[0a08 07060504030201]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 8), "[0a 0807060504030201]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 9), "[0a0807060504030201]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 10), "[0a0807060504030201]"); EXPECT_EQ(printByteBuf(buf.data(), 9, ByteOrder::big, 100), "[0a0807060504030201]"); }