197f7abcfSMatt Spinler /**
297f7abcfSMatt Spinler  * Copyright © 2019 IBM Corporation
397f7abcfSMatt Spinler  *
497f7abcfSMatt Spinler  * Licensed under the Apache License, Version 2.0 (the "License");
597f7abcfSMatt Spinler  * you may not use this file except in compliance with the License.
697f7abcfSMatt Spinler  * You may obtain a copy of the License at
797f7abcfSMatt Spinler  *
897f7abcfSMatt Spinler  *     http://www.apache.org/licenses/LICENSE-2.0
997f7abcfSMatt Spinler  *
1097f7abcfSMatt Spinler  * Unless required by applicable law or agreed to in writing, software
1197f7abcfSMatt Spinler  * distributed under the License is distributed on an "AS IS" BASIS,
1297f7abcfSMatt Spinler  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1397f7abcfSMatt Spinler  * See the License for the specific language governing permissions and
1497f7abcfSMatt Spinler  * limitations under the License.
1597f7abcfSMatt 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 
TEST(StreamTest,TestExtract)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 
TEST(StreamTest,InputTestNoExpansion)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 
TEST(StreamTest,InputTestExpansion)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 
TEST(StreamTest,ReadWriteTest)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 
133*d26fa3e7SPatrick Williams     auto buf = decltype(data)(data.size());
134*d26fa3e7SPatrick Williams     ASSERT_EQ(data.size(), buf.size());
135*d26fa3e7SPatrick Williams 
136*d26fa3e7SPatrick Williams     stream.read(buf.data(), buf.size());
137113ad28cSMatt Spinler 
138113ad28cSMatt Spinler     for (size_t i = 0; i < data.size(); i++)
139113ad28cSMatt Spinler     {
140113ad28cSMatt Spinler         EXPECT_EQ(buf[i], data[i]);
141113ad28cSMatt Spinler 
142113ad28cSMatt Spinler         // for the next test
143113ad28cSMatt Spinler         buf[i] = 0x20 + i;
144113ad28cSMatt Spinler     }
145113ad28cSMatt Spinler 
146113ad28cSMatt Spinler     stream.offset(6);
147*d26fa3e7SPatrick Williams     stream.write(buf.data(), 6);
148113ad28cSMatt Spinler     for (size_t i = 0; i < 6; i++)
149113ad28cSMatt Spinler     {
150113ad28cSMatt Spinler         EXPECT_EQ(buf[i], data[i + 6]);
151113ad28cSMatt Spinler     }
152113ad28cSMatt Spinler }
153113ad28cSMatt Spinler 
TEST(StreamTest,TestOffsets)154113ad28cSMatt Spinler TEST(StreamTest, TestOffsets)
155113ad28cSMatt Spinler {
156113ad28cSMatt Spinler     std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
157113ad28cSMatt Spinler     Stream stream{data, 3};
158113ad28cSMatt Spinler 
159113ad28cSMatt Spinler     {
160113ad28cSMatt Spinler         uint8_t v;
161113ad28cSMatt Spinler         stream >> v;
162113ad28cSMatt Spinler         EXPECT_EQ(v, 0x44);
163113ad28cSMatt Spinler         EXPECT_EQ(stream.offset(), 4);
164113ad28cSMatt Spinler     }
165113ad28cSMatt Spinler 
166113ad28cSMatt Spinler     stream.offset(6);
167113ad28cSMatt Spinler 
168113ad28cSMatt Spinler     {
169113ad28cSMatt Spinler         uint8_t v;
170113ad28cSMatt Spinler         stream >> v;
171113ad28cSMatt Spinler         EXPECT_EQ(v, 0x77);
172113ad28cSMatt Spinler         EXPECT_EQ(stream.offset(), 7);
173113ad28cSMatt Spinler         EXPECT_EQ(stream.remaining(), 0);
174113ad28cSMatt Spinler     }
175113ad28cSMatt Spinler 
176113ad28cSMatt Spinler     EXPECT_THROW(stream.offset(100), std::out_of_range);
177113ad28cSMatt Spinler }
178d377793cSMatt Spinler 
TEST(StreamTest,TestVectorInsertExtract)179d377793cSMatt Spinler TEST(StreamTest, TestVectorInsertExtract)
180d377793cSMatt Spinler {
181d377793cSMatt Spinler     std::vector<uint8_t> toInsert{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
182d377793cSMatt Spinler     std::vector<uint8_t> data;
183d377793cSMatt Spinler 
184d377793cSMatt Spinler     // Insert
185d377793cSMatt Spinler     Stream stream{data};
186d377793cSMatt Spinler     stream << toInsert;
187d377793cSMatt Spinler     EXPECT_EQ(data, toInsert);
188d377793cSMatt Spinler 
189d377793cSMatt Spinler     // Extract
190d377793cSMatt Spinler     std::vector<uint8_t> toExtract;
191d377793cSMatt Spinler     toExtract.resize(toInsert.size());
192d377793cSMatt Spinler     stream.offset(0);
193d377793cSMatt Spinler     stream >> toExtract;
194d377793cSMatt Spinler 
195d377793cSMatt Spinler     EXPECT_EQ(data, toExtract);
196d377793cSMatt Spinler 
197d377793cSMatt Spinler     // Go off the end
198d377793cSMatt Spinler     EXPECT_THROW(stream >> toExtract, std::out_of_range);
199d377793cSMatt Spinler }
200