1*97f7abcfSMatt Spinler /**
2*97f7abcfSMatt Spinler  * Copyright © 2019 IBM Corporation
3*97f7abcfSMatt Spinler  *
4*97f7abcfSMatt Spinler  * Licensed under the Apache License, Version 2.0 (the "License");
5*97f7abcfSMatt Spinler  * you may not use this file except in compliance with the License.
6*97f7abcfSMatt Spinler  * You may obtain a copy of the License at
7*97f7abcfSMatt Spinler  *
8*97f7abcfSMatt Spinler  *     http://www.apache.org/licenses/LICENSE-2.0
9*97f7abcfSMatt Spinler  *
10*97f7abcfSMatt Spinler  * Unless required by applicable law or agreed to in writing, software
11*97f7abcfSMatt Spinler  * distributed under the License is distributed on an "AS IS" BASIS,
12*97f7abcfSMatt Spinler  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*97f7abcfSMatt Spinler  * See the License for the specific language governing permissions and
14*97f7abcfSMatt Spinler  * limitations under the License.
15*97f7abcfSMatt Spinler  */
16113ad28cSMatt Spinler #include "extensions/openpower-pels/stream.hpp"
17113ad28cSMatt Spinler 
18113ad28cSMatt Spinler #include <iostream>
19113ad28cSMatt Spinler 
20113ad28cSMatt Spinler #include <gtest/gtest.h>
21113ad28cSMatt Spinler 
22113ad28cSMatt Spinler using namespace openpower::pels;
23113ad28cSMatt Spinler 
24113ad28cSMatt Spinler TEST(StreamTest, TestExtract)
25113ad28cSMatt Spinler {
26113ad28cSMatt Spinler     std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
27113ad28cSMatt Spinler                               0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
28113ad28cSMatt Spinler                               0x08, 'h',  'e',  'l',  'l',  'o'};
29113ad28cSMatt Spinler     Stream stream{data};
30113ad28cSMatt Spinler 
31113ad28cSMatt Spinler     {
32113ad28cSMatt Spinler         uint8_t v;
33113ad28cSMatt Spinler         stream >> v;
34113ad28cSMatt Spinler         EXPECT_EQ(v, 0x11);
35113ad28cSMatt Spinler     }
36113ad28cSMatt Spinler     {
37113ad28cSMatt Spinler         uint16_t v;
38113ad28cSMatt Spinler         stream >> v;
39113ad28cSMatt Spinler         EXPECT_EQ(v, 0x2233);
40113ad28cSMatt Spinler     }
41113ad28cSMatt Spinler     {
42113ad28cSMatt Spinler         uint32_t v;
43113ad28cSMatt Spinler         stream >> v;
44113ad28cSMatt Spinler         EXPECT_EQ(v, 0x44556677);
45113ad28cSMatt Spinler     }
46113ad28cSMatt Spinler     {
47113ad28cSMatt Spinler         uint64_t v;
48113ad28cSMatt Spinler         stream >> v;
49113ad28cSMatt Spinler         EXPECT_EQ(v, 0x0102030405060708);
50113ad28cSMatt Spinler     }
51113ad28cSMatt Spinler     {
52113ad28cSMatt Spinler         char v[6] = {0};
53113ad28cSMatt Spinler         stream.read(v, 5);
54113ad28cSMatt Spinler         EXPECT_EQ(memcmp(v, "hello", 5), 0);
55113ad28cSMatt Spinler     }
56113ad28cSMatt Spinler 
57113ad28cSMatt Spinler     EXPECT_EQ(stream.remaining(), 0);
58113ad28cSMatt Spinler 
59113ad28cSMatt Spinler     // At the end, so should throw.
60113ad28cSMatt Spinler     uint8_t v;
61113ad28cSMatt Spinler     EXPECT_THROW(stream >> v, std::out_of_range);
62113ad28cSMatt Spinler }
63113ad28cSMatt Spinler 
64113ad28cSMatt Spinler TEST(StreamTest, InputTestNoExpansion)
65113ad28cSMatt Spinler {
66113ad28cSMatt Spinler     std::vector<uint8_t> data(256, 0);
67113ad28cSMatt Spinler     Stream stream(data);
68113ad28cSMatt Spinler     uint8_t v1 = 0x11;
69113ad28cSMatt Spinler     uint16_t v2 = 0x2233;
70113ad28cSMatt Spinler     uint64_t v3 = 0x445566778899AABB;
71113ad28cSMatt Spinler     uint32_t v4 = 0xCCDDEEFF;
72113ad28cSMatt Spinler 
73113ad28cSMatt Spinler     stream << v3 << v2 << v4 << v1;
74113ad28cSMatt Spinler 
75113ad28cSMatt Spinler     uint8_t e1;
76113ad28cSMatt Spinler     uint16_t e2;
77113ad28cSMatt Spinler     uint64_t e3;
78113ad28cSMatt Spinler     uint32_t e4;
79113ad28cSMatt Spinler 
80113ad28cSMatt Spinler     stream.offset(0);
81113ad28cSMatt Spinler     stream >> e3 >> e2 >> e4 >> e1;
82113ad28cSMatt Spinler 
83113ad28cSMatt Spinler     EXPECT_EQ(v1, e1);
84113ad28cSMatt Spinler     EXPECT_EQ(v2, e2);
85113ad28cSMatt Spinler     EXPECT_EQ(v3, e3);
86113ad28cSMatt Spinler     EXPECT_EQ(v4, e4);
87113ad28cSMatt Spinler }
88113ad28cSMatt Spinler 
89113ad28cSMatt Spinler TEST(StreamTest, InputTestExpansion)
90113ad28cSMatt Spinler {
91113ad28cSMatt Spinler     // The stream will expand the underlying vector
92113ad28cSMatt Spinler     std::vector<uint8_t> data;
93113ad28cSMatt Spinler     Stream stream(data);
94113ad28cSMatt Spinler 
95113ad28cSMatt Spinler     uint32_t v1 = 0xAABBCCDD;
96113ad28cSMatt Spinler     stream << v1;
97113ad28cSMatt Spinler 
98113ad28cSMatt Spinler     stream.offset(0);
99113ad28cSMatt Spinler     uint32_t e1;
100113ad28cSMatt Spinler     stream >> e1;
101113ad28cSMatt Spinler     EXPECT_EQ(data.size(), 4);
102113ad28cSMatt Spinler     EXPECT_EQ(v1, e1);
103113ad28cSMatt Spinler 
104113ad28cSMatt Spinler     stream.offset(2);
105113ad28cSMatt Spinler 
106113ad28cSMatt Spinler     uint64_t v2 = 0x0102030405060708;
107113ad28cSMatt Spinler     stream << v2;
108113ad28cSMatt Spinler 
109113ad28cSMatt Spinler     EXPECT_EQ(data.size(), 10);
110113ad28cSMatt Spinler     uint64_t e2;
111113ad28cSMatt Spinler     stream.offset(2);
112113ad28cSMatt Spinler     stream >> e2;
113113ad28cSMatt Spinler 
114113ad28cSMatt Spinler     EXPECT_EQ(v2, e2);
115113ad28cSMatt Spinler 
116113ad28cSMatt Spinler     auto origSize = data.size();
117113ad28cSMatt Spinler     uint8_t v3 = 0xCC;
118113ad28cSMatt Spinler     stream << v3;
119113ad28cSMatt Spinler 
120113ad28cSMatt Spinler     EXPECT_EQ(origSize + 1, data.size());
121113ad28cSMatt Spinler     stream.offset(stream.offset() - 1);
122113ad28cSMatt Spinler     uint8_t e3;
123113ad28cSMatt Spinler     stream >> e3;
124113ad28cSMatt Spinler     EXPECT_EQ(v3, e3);
125113ad28cSMatt Spinler }
126113ad28cSMatt Spinler 
127113ad28cSMatt Spinler TEST(StreamTest, ReadWriteTest)
128113ad28cSMatt Spinler {
129113ad28cSMatt Spinler     std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
130113ad28cSMatt Spinler                               0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc};
131113ad28cSMatt Spinler     Stream stream{data};
132113ad28cSMatt Spinler     uint8_t buf[data.size()];
133113ad28cSMatt Spinler 
134113ad28cSMatt Spinler     stream.read(buf, data.size());
135113ad28cSMatt Spinler 
136113ad28cSMatt Spinler     for (size_t i = 0; i < data.size(); i++)
137113ad28cSMatt Spinler     {
138113ad28cSMatt Spinler         EXPECT_EQ(buf[i], data[i]);
139113ad28cSMatt Spinler 
140113ad28cSMatt Spinler         // for the next test
141113ad28cSMatt Spinler         buf[i] = 0x20 + i;
142113ad28cSMatt Spinler     }
143113ad28cSMatt Spinler 
144113ad28cSMatt Spinler     stream.offset(6);
145113ad28cSMatt Spinler     stream.write(buf, 6);
146113ad28cSMatt Spinler     for (size_t i = 0; i < 6; i++)
147113ad28cSMatt Spinler     {
148113ad28cSMatt Spinler         EXPECT_EQ(buf[i], data[i + 6]);
149113ad28cSMatt Spinler     }
150113ad28cSMatt Spinler }
151113ad28cSMatt Spinler 
152113ad28cSMatt Spinler TEST(StreamTest, TestOffsets)
153113ad28cSMatt Spinler {
154113ad28cSMatt Spinler     std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
155113ad28cSMatt Spinler     Stream stream{data, 3};
156113ad28cSMatt Spinler 
157113ad28cSMatt Spinler     {
158113ad28cSMatt Spinler         uint8_t v;
159113ad28cSMatt Spinler         stream >> v;
160113ad28cSMatt Spinler         EXPECT_EQ(v, 0x44);
161113ad28cSMatt Spinler         EXPECT_EQ(stream.offset(), 4);
162113ad28cSMatt Spinler     }
163113ad28cSMatt Spinler 
164113ad28cSMatt Spinler     stream.offset(6);
165113ad28cSMatt Spinler 
166113ad28cSMatt Spinler     {
167113ad28cSMatt Spinler         uint8_t v;
168113ad28cSMatt Spinler         stream >> v;
169113ad28cSMatt Spinler         EXPECT_EQ(v, 0x77);
170113ad28cSMatt Spinler         EXPECT_EQ(stream.offset(), 7);
171113ad28cSMatt Spinler         EXPECT_EQ(stream.remaining(), 0);
172113ad28cSMatt Spinler     }
173113ad28cSMatt Spinler 
174113ad28cSMatt Spinler     EXPECT_THROW(stream.offset(100), std::out_of_range);
175113ad28cSMatt Spinler }
176d377793cSMatt Spinler 
177d377793cSMatt Spinler TEST(StreamTest, TestVectorInsertExtract)
178d377793cSMatt Spinler {
179d377793cSMatt Spinler     std::vector<uint8_t> toInsert{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
180d377793cSMatt Spinler     std::vector<uint8_t> data;
181d377793cSMatt Spinler 
182d377793cSMatt Spinler     // Insert
183d377793cSMatt Spinler     Stream stream{data};
184d377793cSMatt Spinler     stream << toInsert;
185d377793cSMatt Spinler     EXPECT_EQ(data, toInsert);
186d377793cSMatt Spinler 
187d377793cSMatt Spinler     // Extract
188d377793cSMatt Spinler     std::vector<uint8_t> toExtract;
189d377793cSMatt Spinler     toExtract.resize(toInsert.size());
190d377793cSMatt Spinler     stream.offset(0);
191d377793cSMatt Spinler     stream >> toExtract;
192d377793cSMatt Spinler 
193d377793cSMatt Spinler     EXPECT_EQ(data, toExtract);
194d377793cSMatt Spinler 
195d377793cSMatt Spinler     // Go off the end
196d377793cSMatt Spinler     EXPECT_THROW(stream >> toExtract, std::out_of_range);
197d377793cSMatt Spinler }
198