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