blob: 4dd69b7a90a8398835d3414522d4ed9771baa5db [file] [log] [blame]
Alexander Hansen40fb5492025-10-28 17:56:12 +01001// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright 2019 IBM Corporation
3
Matt Spinler113ad282019-07-09 14:44:13 -05004#include "extensions/openpower-pels/stream.hpp"
5
6#include <iostream>
7
8#include <gtest/gtest.h>
9
10using namespace openpower::pels;
11
12TEST(StreamTest, TestExtract)
13{
14 std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
15 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
16 0x08, 'h', 'e', 'l', 'l', 'o'};
17 Stream stream{data};
18
19 {
20 uint8_t v;
21 stream >> v;
22 EXPECT_EQ(v, 0x11);
23 }
24 {
25 uint16_t v;
26 stream >> v;
27 EXPECT_EQ(v, 0x2233);
28 }
29 {
30 uint32_t v;
31 stream >> v;
32 EXPECT_EQ(v, 0x44556677);
33 }
34 {
35 uint64_t v;
36 stream >> v;
37 EXPECT_EQ(v, 0x0102030405060708);
38 }
39 {
40 char v[6] = {0};
41 stream.read(v, 5);
42 EXPECT_EQ(memcmp(v, "hello", 5), 0);
43 }
44
45 EXPECT_EQ(stream.remaining(), 0);
46
47 // At the end, so should throw.
48 uint8_t v;
49 EXPECT_THROW(stream >> v, std::out_of_range);
50}
51
52TEST(StreamTest, InputTestNoExpansion)
53{
54 std::vector<uint8_t> data(256, 0);
55 Stream stream(data);
56 uint8_t v1 = 0x11;
57 uint16_t v2 = 0x2233;
58 uint64_t v3 = 0x445566778899AABB;
59 uint32_t v4 = 0xCCDDEEFF;
60
61 stream << v3 << v2 << v4 << v1;
62
63 uint8_t e1;
64 uint16_t e2;
65 uint64_t e3;
66 uint32_t e4;
67
68 stream.offset(0);
69 stream >> e3 >> e2 >> e4 >> e1;
70
71 EXPECT_EQ(v1, e1);
72 EXPECT_EQ(v2, e2);
73 EXPECT_EQ(v3, e3);
74 EXPECT_EQ(v4, e4);
75}
76
77TEST(StreamTest, InputTestExpansion)
78{
79 // The stream will expand the underlying vector
80 std::vector<uint8_t> data;
81 Stream stream(data);
82
83 uint32_t v1 = 0xAABBCCDD;
84 stream << v1;
85
86 stream.offset(0);
87 uint32_t e1;
88 stream >> e1;
89 EXPECT_EQ(data.size(), 4);
90 EXPECT_EQ(v1, e1);
91
92 stream.offset(2);
93
94 uint64_t v2 = 0x0102030405060708;
95 stream << v2;
96
97 EXPECT_EQ(data.size(), 10);
98 uint64_t e2;
99 stream.offset(2);
100 stream >> e2;
101
102 EXPECT_EQ(v2, e2);
103
104 auto origSize = data.size();
105 uint8_t v3 = 0xCC;
106 stream << v3;
107
108 EXPECT_EQ(origSize + 1, data.size());
109 stream.offset(stream.offset() - 1);
110 uint8_t e3;
111 stream >> e3;
112 EXPECT_EQ(v3, e3);
113}
114
115TEST(StreamTest, ReadWriteTest)
116{
117 std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66,
118 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc};
119 Stream stream{data};
Matt Spinler113ad282019-07-09 14:44:13 -0500120
Patrick Williamsd26fa3e2021-04-21 15:22:23 -0500121 auto buf = decltype(data)(data.size());
122 ASSERT_EQ(data.size(), buf.size());
123
124 stream.read(buf.data(), buf.size());
Matt Spinler113ad282019-07-09 14:44:13 -0500125
126 for (size_t i = 0; i < data.size(); i++)
127 {
128 EXPECT_EQ(buf[i], data[i]);
129
130 // for the next test
131 buf[i] = 0x20 + i;
132 }
133
134 stream.offset(6);
Patrick Williamsd26fa3e2021-04-21 15:22:23 -0500135 stream.write(buf.data(), 6);
Matt Spinler113ad282019-07-09 14:44:13 -0500136 for (size_t i = 0; i < 6; i++)
137 {
138 EXPECT_EQ(buf[i], data[i + 6]);
139 }
140}
141
142TEST(StreamTest, TestOffsets)
143{
144 std::vector<uint8_t> data{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
145 Stream stream{data, 3};
146
147 {
148 uint8_t v;
149 stream >> v;
150 EXPECT_EQ(v, 0x44);
151 EXPECT_EQ(stream.offset(), 4);
152 }
153
154 stream.offset(6);
155
156 {
157 uint8_t v;
158 stream >> v;
159 EXPECT_EQ(v, 0x77);
160 EXPECT_EQ(stream.offset(), 7);
161 EXPECT_EQ(stream.remaining(), 0);
162 }
163
164 EXPECT_THROW(stream.offset(100), std::out_of_range);
165}
Matt Spinlerd3777932019-09-24 13:38:47 -0500166
167TEST(StreamTest, TestVectorInsertExtract)
168{
169 std::vector<uint8_t> toInsert{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77};
170 std::vector<uint8_t> data;
171
172 // Insert
173 Stream stream{data};
174 stream << toInsert;
175 EXPECT_EQ(data, toInsert);
176
177 // Extract
178 std::vector<uint8_t> toExtract;
179 toExtract.resize(toInsert.size());
180 stream.offset(0);
181 stream >> toExtract;
182
183 EXPECT_EQ(data, toExtract);
184
185 // Go off the end
186 EXPECT_THROW(stream >> toExtract, std::out_of_range);
187}