1*113ad28cSMatt Spinler #include "extensions/openpower-pels/stream.hpp" 2*113ad28cSMatt Spinler 3*113ad28cSMatt Spinler #include <iostream> 4*113ad28cSMatt Spinler 5*113ad28cSMatt Spinler #include <gtest/gtest.h> 6*113ad28cSMatt Spinler 7*113ad28cSMatt Spinler using namespace openpower::pels; 8*113ad28cSMatt Spinler 9*113ad28cSMatt Spinler TEST(StreamTest, TestExtract) 10*113ad28cSMatt Spinler { 11*113ad28cSMatt Spinler std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 12*113ad28cSMatt Spinler 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 13*113ad28cSMatt Spinler 0x08, 'h', 'e', 'l', 'l', 'o'}; 14*113ad28cSMatt Spinler Stream stream{data}; 15*113ad28cSMatt Spinler 16*113ad28cSMatt Spinler { 17*113ad28cSMatt Spinler uint8_t v; 18*113ad28cSMatt Spinler stream >> v; 19*113ad28cSMatt Spinler EXPECT_EQ(v, 0x11); 20*113ad28cSMatt Spinler } 21*113ad28cSMatt Spinler { 22*113ad28cSMatt Spinler uint16_t v; 23*113ad28cSMatt Spinler stream >> v; 24*113ad28cSMatt Spinler EXPECT_EQ(v, 0x2233); 25*113ad28cSMatt Spinler } 26*113ad28cSMatt Spinler { 27*113ad28cSMatt Spinler uint32_t v; 28*113ad28cSMatt Spinler stream >> v; 29*113ad28cSMatt Spinler EXPECT_EQ(v, 0x44556677); 30*113ad28cSMatt Spinler } 31*113ad28cSMatt Spinler { 32*113ad28cSMatt Spinler uint64_t v; 33*113ad28cSMatt Spinler stream >> v; 34*113ad28cSMatt Spinler EXPECT_EQ(v, 0x0102030405060708); 35*113ad28cSMatt Spinler } 36*113ad28cSMatt Spinler { 37*113ad28cSMatt Spinler char v[6] = {0}; 38*113ad28cSMatt Spinler stream.read(v, 5); 39*113ad28cSMatt Spinler EXPECT_EQ(memcmp(v, "hello", 5), 0); 40*113ad28cSMatt Spinler } 41*113ad28cSMatt Spinler 42*113ad28cSMatt Spinler EXPECT_EQ(stream.remaining(), 0); 43*113ad28cSMatt Spinler 44*113ad28cSMatt Spinler // At the end, so should throw. 45*113ad28cSMatt Spinler uint8_t v; 46*113ad28cSMatt Spinler EXPECT_THROW(stream >> v, std::out_of_range); 47*113ad28cSMatt Spinler } 48*113ad28cSMatt Spinler 49*113ad28cSMatt Spinler TEST(StreamTest, InputTestNoExpansion) 50*113ad28cSMatt Spinler { 51*113ad28cSMatt Spinler std::vector<uint8_t> data(256, 0); 52*113ad28cSMatt Spinler Stream stream(data); 53*113ad28cSMatt Spinler uint8_t v1 = 0x11; 54*113ad28cSMatt Spinler uint16_t v2 = 0x2233; 55*113ad28cSMatt Spinler uint64_t v3 = 0x445566778899AABB; 56*113ad28cSMatt Spinler uint32_t v4 = 0xCCDDEEFF; 57*113ad28cSMatt Spinler 58*113ad28cSMatt Spinler stream << v3 << v2 << v4 << v1; 59*113ad28cSMatt Spinler 60*113ad28cSMatt Spinler uint8_t e1; 61*113ad28cSMatt Spinler uint16_t e2; 62*113ad28cSMatt Spinler uint64_t e3; 63*113ad28cSMatt Spinler uint32_t e4; 64*113ad28cSMatt Spinler 65*113ad28cSMatt Spinler stream.offset(0); 66*113ad28cSMatt Spinler stream >> e3 >> e2 >> e4 >> e1; 67*113ad28cSMatt Spinler 68*113ad28cSMatt Spinler EXPECT_EQ(v1, e1); 69*113ad28cSMatt Spinler EXPECT_EQ(v2, e2); 70*113ad28cSMatt Spinler EXPECT_EQ(v3, e3); 71*113ad28cSMatt Spinler EXPECT_EQ(v4, e4); 72*113ad28cSMatt Spinler } 73*113ad28cSMatt Spinler 74*113ad28cSMatt Spinler TEST(StreamTest, InputTestExpansion) 75*113ad28cSMatt Spinler { 76*113ad28cSMatt Spinler // The stream will expand the underlying vector 77*113ad28cSMatt Spinler std::vector<uint8_t> data; 78*113ad28cSMatt Spinler Stream stream(data); 79*113ad28cSMatt Spinler 80*113ad28cSMatt Spinler uint32_t v1 = 0xAABBCCDD; 81*113ad28cSMatt Spinler stream << v1; 82*113ad28cSMatt Spinler 83*113ad28cSMatt Spinler stream.offset(0); 84*113ad28cSMatt Spinler uint32_t e1; 85*113ad28cSMatt Spinler stream >> e1; 86*113ad28cSMatt Spinler EXPECT_EQ(data.size(), 4); 87*113ad28cSMatt Spinler EXPECT_EQ(v1, e1); 88*113ad28cSMatt Spinler 89*113ad28cSMatt Spinler stream.offset(2); 90*113ad28cSMatt Spinler 91*113ad28cSMatt Spinler uint64_t v2 = 0x0102030405060708; 92*113ad28cSMatt Spinler stream << v2; 93*113ad28cSMatt Spinler 94*113ad28cSMatt Spinler EXPECT_EQ(data.size(), 10); 95*113ad28cSMatt Spinler uint64_t e2; 96*113ad28cSMatt Spinler stream.offset(2); 97*113ad28cSMatt Spinler stream >> e2; 98*113ad28cSMatt Spinler 99*113ad28cSMatt Spinler EXPECT_EQ(v2, e2); 100*113ad28cSMatt Spinler 101*113ad28cSMatt Spinler auto origSize = data.size(); 102*113ad28cSMatt Spinler uint8_t v3 = 0xCC; 103*113ad28cSMatt Spinler stream << v3; 104*113ad28cSMatt Spinler 105*113ad28cSMatt Spinler EXPECT_EQ(origSize + 1, data.size()); 106*113ad28cSMatt Spinler stream.offset(stream.offset() - 1); 107*113ad28cSMatt Spinler uint8_t e3; 108*113ad28cSMatt Spinler stream >> e3; 109*113ad28cSMatt Spinler EXPECT_EQ(v3, e3); 110*113ad28cSMatt Spinler } 111*113ad28cSMatt Spinler 112*113ad28cSMatt Spinler TEST(StreamTest, ReadWriteTest) 113*113ad28cSMatt Spinler { 114*113ad28cSMatt Spinler std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 115*113ad28cSMatt Spinler 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc}; 116*113ad28cSMatt Spinler Stream stream{data}; 117*113ad28cSMatt Spinler uint8_t buf[data.size()]; 118*113ad28cSMatt Spinler 119*113ad28cSMatt Spinler stream.read(buf, data.size()); 120*113ad28cSMatt Spinler 121*113ad28cSMatt Spinler for (size_t i = 0; i < data.size(); i++) 122*113ad28cSMatt Spinler { 123*113ad28cSMatt Spinler EXPECT_EQ(buf[i], data[i]); 124*113ad28cSMatt Spinler 125*113ad28cSMatt Spinler // for the next test 126*113ad28cSMatt Spinler buf[i] = 0x20 + i; 127*113ad28cSMatt Spinler } 128*113ad28cSMatt Spinler 129*113ad28cSMatt Spinler stream.offset(6); 130*113ad28cSMatt Spinler stream.write(buf, 6); 131*113ad28cSMatt Spinler for (size_t i = 0; i < 6; i++) 132*113ad28cSMatt Spinler { 133*113ad28cSMatt Spinler EXPECT_EQ(buf[i], data[i + 6]); 134*113ad28cSMatt Spinler } 135*113ad28cSMatt Spinler } 136*113ad28cSMatt Spinler 137*113ad28cSMatt Spinler TEST(StreamTest, TestOffsets) 138*113ad28cSMatt Spinler { 139*113ad28cSMatt Spinler std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}; 140*113ad28cSMatt Spinler Stream stream{data, 3}; 141*113ad28cSMatt Spinler 142*113ad28cSMatt Spinler { 143*113ad28cSMatt Spinler uint8_t v; 144*113ad28cSMatt Spinler stream >> v; 145*113ad28cSMatt Spinler EXPECT_EQ(v, 0x44); 146*113ad28cSMatt Spinler EXPECT_EQ(stream.offset(), 4); 147*113ad28cSMatt Spinler } 148*113ad28cSMatt Spinler 149*113ad28cSMatt Spinler stream.offset(6); 150*113ad28cSMatt Spinler 151*113ad28cSMatt Spinler { 152*113ad28cSMatt Spinler uint8_t v; 153*113ad28cSMatt Spinler stream >> v; 154*113ad28cSMatt Spinler EXPECT_EQ(v, 0x77); 155*113ad28cSMatt Spinler EXPECT_EQ(stream.offset(), 7); 156*113ad28cSMatt Spinler EXPECT_EQ(stream.remaining(), 0); 157*113ad28cSMatt Spinler } 158*113ad28cSMatt Spinler 159*113ad28cSMatt Spinler EXPECT_THROW(stream.offset(100), std::out_of_range); 160*113ad28cSMatt Spinler } 161