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