xref: /openbmc/phosphor-logging/test/openpower-pels/mru_test.cpp (revision 40fb54935ce7367636a7156039396ee91cc4d5e2)
1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright 2019 IBM Corporation
3 
4 #include "extensions/openpower-pels/mru.hpp"
5 
6 #include <gtest/gtest.h>
7 
8 using namespace openpower::pels;
9 using namespace openpower::pels::src;
10 
TEST(MRUTest,TestConstructor)11 TEST(MRUTest, TestConstructor)
12 {
13     std::vector<uint8_t> data{
14         'M',  'R',  0x28, 0x04, // ID, size, flags
15         0x00, 0x00, 0x00, 0x00, // Reserved
16         0x00, 0x00, 0x00, 'H',  // priority for MRU ID 0
17         0x01, 0x01, 0x01, 0x01, // MRU ID 0
18         0x00, 0x00, 0x00, 'M',  // priority for MRU ID 1
19         0x02, 0x02, 0x02, 0x02, // MRU ID 1
20         0x00, 0x00, 0x00, 'L',  // priority for MRU ID 2
21         0x03, 0x03, 0x03, 0x03, // MRU ID 2
22         0x00, 0x00, 0x00, 'H',  // priority for MRU ID 3
23         0x04, 0x04, 0x04, 0x04, // MRU ID 3
24     };
25 
26     Stream stream{data};
27 
28     MRU mru{stream};
29 
30     EXPECT_EQ(mru.flattenedSize(), data.size());
31     EXPECT_EQ(mru.mrus().size(), 4);
32     EXPECT_EQ(mru.flags(), 4);
33 
34     EXPECT_EQ(mru.mrus().at(0).priority, 'H');
35     EXPECT_EQ(mru.mrus().at(0).id, 0x01010101);
36     EXPECT_EQ(mru.mrus().at(1).priority, 'M');
37     EXPECT_EQ(mru.mrus().at(1).id, 0x02020202);
38     EXPECT_EQ(mru.mrus().at(2).priority, 'L');
39     EXPECT_EQ(mru.mrus().at(2).id, 0x03030303);
40     EXPECT_EQ(mru.mrus().at(3).priority, 'H');
41     EXPECT_EQ(mru.mrus().at(3).id, 0x04040404);
42 
43     // Now flatten
44     std::vector<uint8_t> newData;
45     Stream newStream{newData};
46 
47     mru.flatten(newStream);
48     EXPECT_EQ(data, newData);
49 }
50 
TEST(MRUTest,TestBadData)51 TEST(MRUTest, TestBadData)
52 {
53     // 4 MRUs expected, but only 1
54     std::vector<uint8_t> data{
55         'M',  'R',  0x28, 0x04, // ID, size, flags
56         0x00, 0x00, 0x00, 0x00, // Reserved
57         0x00, 0x00, 0x00, 'H',  // priority 0
58         0x01, 0x01, 0x01, 0x01, // MRU ID 0
59     };
60 
61     Stream stream{data};
62     EXPECT_THROW(MRU mru{stream}, std::out_of_range);
63 }
64 
TEST(MRUTest,TestVectorConstructor)65 TEST(MRUTest, TestVectorConstructor)
66 {
67     {
68         std::vector<MRU::MRUCallout> mrus{{'H', 1}, {'M', 2}, {'L', 3}};
69 
70         MRU mru{mrus};
71 
72         EXPECT_EQ(mru.mrus().size(), 3);
73         EXPECT_EQ(mru.flags(), 3);
74 
75         EXPECT_EQ(mru.mrus().at(0).priority, 'H');
76         EXPECT_EQ(mru.mrus().at(0).id, 1);
77         EXPECT_EQ(mru.mrus().at(1).priority, 'M');
78         EXPECT_EQ(mru.mrus().at(1).id, 2);
79         EXPECT_EQ(mru.mrus().at(2).priority, 'L');
80         EXPECT_EQ(mru.mrus().at(2).id, 3);
81 
82         // Flatten and unflatten
83         std::vector<uint8_t> data;
84         Stream stream{data};
85 
86         mru.flatten(stream);
87         EXPECT_EQ(mru.size(), data.size());
88 
89         stream.offset(0);
90         MRU newMRU{stream};
91 
92         EXPECT_EQ(newMRU.flattenedSize(), data.size());
93         EXPECT_EQ(newMRU.size(), data.size());
94         EXPECT_EQ(newMRU.mrus().size(), 3);
95 
96         EXPECT_EQ(newMRU.mrus().at(0).priority, 'H');
97         EXPECT_EQ(newMRU.mrus().at(0).id, 1);
98         EXPECT_EQ(newMRU.mrus().at(1).priority, 'M');
99         EXPECT_EQ(newMRU.mrus().at(1).id, 2);
100         EXPECT_EQ(newMRU.mrus().at(2).priority, 'L');
101         EXPECT_EQ(newMRU.mrus().at(2).id, 3);
102     }
103 
104     {
105         // Too many MRUs
106         std::vector<MRU::MRUCallout> mrus;
107         for (uint32_t i = 0; i < 20; i++)
108         {
109             MRU::MRUCallout mru = {'H', i};
110             mrus.push_back(mru);
111         }
112 
113         MRU mru{mrus};
114 
115         EXPECT_EQ(mru.mrus().size(), 15);
116         EXPECT_EQ(mru.flags(), 15);
117     }
118 
119     {
120         // Too few MRUs
121         std::vector<MRU::MRUCallout> mrus;
122         EXPECT_THROW(MRU mru{mrus}, std::runtime_error);
123     }
124 }
125