xref: /openbmc/phosphor-logging/test/openpower-pels/stream_test.cpp (revision 40fb54935ce7367636a7156039396ee91cc4d5e2)
1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright 2019 IBM Corporation
3 
4 #include "extensions/openpower-pels/stream.hpp"
5 
6 #include <iostream>
7 
8 #include <gtest/gtest.h>
9 
10 using namespace openpower::pels;
11 
TEST(StreamTest,TestExtract)12 TEST(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 
TEST(StreamTest,InputTestNoExpansion)52 TEST(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 
TEST(StreamTest,InputTestExpansion)77 TEST(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 
TEST(StreamTest,ReadWriteTest)115 TEST(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};
120 
121     auto buf = decltype(data)(data.size());
122     ASSERT_EQ(data.size(), buf.size());
123 
124     stream.read(buf.data(), buf.size());
125 
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);
135     stream.write(buf.data(), 6);
136     for (size_t i = 0; i < 6; i++)
137     {
138         EXPECT_EQ(buf[i], data[i + 6]);
139     }
140 }
141 
TEST(StreamTest,TestOffsets)142 TEST(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 }
166 
TEST(StreamTest,TestVectorInsertExtract)167 TEST(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 }
188