1c180a189SMatt Spinler /**
2c180a189SMatt Spinler  * Copyright © 2017 IBM Corporation
3c180a189SMatt Spinler  *
4c180a189SMatt Spinler  * Licensed under the Apache License, Version 2.0 (the "License");
5c180a189SMatt Spinler  * you may not use this file except in compliance with the License.
6c180a189SMatt Spinler  * You may obtain a copy of the License at
7c180a189SMatt Spinler  *
8c180a189SMatt Spinler  *     http://www.apache.org/licenses/LICENSE-2.0
9c180a189SMatt Spinler  *
10c180a189SMatt Spinler  * Unless required by applicable law or agreed to in writing, software
11c180a189SMatt Spinler  * distributed under the License is distributed on an "AS IS" BASIS,
12c180a189SMatt Spinler  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c180a189SMatt Spinler  * See the License for the specific language governing permissions and
14c180a189SMatt Spinler  * limitations under the License.
15c180a189SMatt Spinler  */
16c180a189SMatt Spinler #include "../record_manager.hpp"
17f0f02b9aSMatt Spinler #include "names_values.hpp"
18f0f02b9aSMatt Spinler 
19f0f02b9aSMatt Spinler #include <iostream>
20f0f02b9aSMatt Spinler 
21f0f02b9aSMatt Spinler #include <gtest/gtest.h>
22c180a189SMatt Spinler 
23*ab093328SLei YU using namespace phosphor::power::history;
24c180a189SMatt Spinler 
25c180a189SMatt Spinler /**
26c180a189SMatt Spinler  * Test the linearToInteger function with different
27c180a189SMatt Spinler  * combinations of positive and negative mantissas and
28c180a189SMatt Spinler  * exponents.
29c180a189SMatt Spinler  *
30c180a189SMatt Spinler  * Value = mantissa * 2**exponent
31c180a189SMatt Spinler  */
TEST(LinearFormatTest,TestConversions)32c180a189SMatt Spinler TEST(LinearFormatTest, TestConversions)
33c180a189SMatt Spinler {
34c180a189SMatt Spinler     // Mantissa > 0, exponent = 0
35c180a189SMatt Spinler     EXPECT_EQ(0, RecordManager::linearToInteger(0));
36c180a189SMatt Spinler     EXPECT_EQ(1, RecordManager::linearToInteger(1));
37c180a189SMatt Spinler     EXPECT_EQ(38, RecordManager::linearToInteger(0x26));
38c180a189SMatt Spinler     EXPECT_EQ(1023, RecordManager::linearToInteger(0x3FF));
39c180a189SMatt Spinler 
40c180a189SMatt Spinler     // Mantissa < 0, exponent = 0
41c180a189SMatt Spinler     EXPECT_EQ(-1, RecordManager::linearToInteger(0x7FF));
42c180a189SMatt Spinler     EXPECT_EQ(-20, RecordManager::linearToInteger(0x7EC));
43c180a189SMatt Spinler     EXPECT_EQ(-769, RecordManager::linearToInteger(0x4FF));
44c180a189SMatt Spinler     EXPECT_EQ(-989, RecordManager::linearToInteger(0x423));
45c180a189SMatt Spinler     EXPECT_EQ(-1024, RecordManager::linearToInteger(0x400));
46c180a189SMatt Spinler 
47c180a189SMatt Spinler     // Mantissa >= 0, exponent > 0
48c180a189SMatt Spinler     // M = 1, E = 2
49c180a189SMatt Spinler     EXPECT_EQ(4, RecordManager::linearToInteger(0x1001));
50c180a189SMatt Spinler 
51c180a189SMatt Spinler     // M = 1000, E = 10
52c180a189SMatt Spinler     EXPECT_EQ(1024000, RecordManager::linearToInteger(0x53E8));
53c180a189SMatt Spinler 
54c180a189SMatt Spinler     // M = 10, E = 15
55c180a189SMatt Spinler     EXPECT_EQ(327680, RecordManager::linearToInteger(0x780A));
56c180a189SMatt Spinler 
57c180a189SMatt Spinler     // Mantissa >= 0, exponent < 0
58c180a189SMatt Spinler     // M = 0, E = -1
59c180a189SMatt Spinler     EXPECT_EQ(0, RecordManager::linearToInteger(0xF800));
60c180a189SMatt Spinler 
61c180a189SMatt Spinler     // M = 100, E = -2
62c180a189SMatt Spinler     EXPECT_EQ(25, RecordManager::linearToInteger(0xF064));
63c180a189SMatt Spinler 
64c180a189SMatt Spinler     // Mantissa < 0, exponent < 0
65c180a189SMatt Spinler     // M = -100, E = -1
66c180a189SMatt Spinler     EXPECT_EQ(-50, RecordManager::linearToInteger(0xFF9C));
67c180a189SMatt Spinler 
68c180a189SMatt Spinler     // M = -1024, E = -7
69c180a189SMatt Spinler     EXPECT_EQ(-8, RecordManager::linearToInteger(0xCC00));
70c180a189SMatt Spinler }
71c180a189SMatt Spinler 
72c180a189SMatt Spinler /**
73c180a189SMatt Spinler  * @brief Helper function to create a record buffer
74c180a189SMatt Spinler  *
75c180a189SMatt Spinler  * @param sequenceID - the ID to use
76c180a189SMatt Spinler  * @param avgPower - the average power, in linear format
77c180a189SMatt Spinler  * @param maxPower - the max power, in linear format
78c180a189SMatt Spinler  *
79c180a189SMatt Spinler  * @return vector<uint8_t> the record buffer
80c180a189SMatt Spinler  */
makeRawRecord(uint8_t sequenceID,uint16_t avgPower,uint16_t maxPower)81f0f02b9aSMatt Spinler std::vector<uint8_t> makeRawRecord(uint8_t sequenceID, uint16_t avgPower,
82c180a189SMatt Spinler                                    uint16_t maxPower)
83c180a189SMatt Spinler {
84c180a189SMatt Spinler     std::vector<uint8_t> record;
85c180a189SMatt Spinler 
86c180a189SMatt Spinler     record.push_back(sequenceID);
87c180a189SMatt Spinler     record.push_back(avgPower & 0xFF);
88c180a189SMatt Spinler     record.push_back(avgPower >> 8);
89c180a189SMatt Spinler     record.push_back(maxPower & 0xFF);
90c180a189SMatt Spinler     record.push_back(maxPower >> 8);
91c180a189SMatt Spinler 
92c180a189SMatt Spinler     return record;
93c180a189SMatt Spinler }
94c180a189SMatt Spinler 
95c180a189SMatt Spinler /**
96c180a189SMatt Spinler  * Test record queue management
97c180a189SMatt Spinler  */
TEST(ManagerTest,TestRecordAdds)98c180a189SMatt Spinler TEST(ManagerTest, TestRecordAdds)
99c180a189SMatt Spinler {
100c180a189SMatt Spinler     // Hold 5 max records.  IDs roll over at 8.
101c180a189SMatt Spinler     RecordManager mgr{5, 8};
102c180a189SMatt Spinler 
103c180a189SMatt Spinler     EXPECT_EQ(0, mgr.getNumRecords());
104c180a189SMatt Spinler 
105c180a189SMatt Spinler     mgr.add(makeRawRecord(0, 0, 0));
106c180a189SMatt Spinler     EXPECT_EQ(1, mgr.getNumRecords());
107c180a189SMatt Spinler 
108c180a189SMatt Spinler     mgr.add(makeRawRecord(1, 0, 0));
109c180a189SMatt Spinler     EXPECT_EQ(2, mgr.getNumRecords());
110c180a189SMatt Spinler 
111c180a189SMatt Spinler     mgr.add(makeRawRecord(2, 0, 0));
112c180a189SMatt Spinler     EXPECT_EQ(3, mgr.getNumRecords());
113c180a189SMatt Spinler 
114c180a189SMatt Spinler     mgr.add(makeRawRecord(3, 0, 0));
115c180a189SMatt Spinler     EXPECT_EQ(4, mgr.getNumRecords());
116c180a189SMatt Spinler 
117c180a189SMatt Spinler     mgr.add(makeRawRecord(4, 0, 0));
118c180a189SMatt Spinler     EXPECT_EQ(5, mgr.getNumRecords());
119c180a189SMatt Spinler 
120c180a189SMatt Spinler     // start pruning
121c180a189SMatt Spinler     mgr.add(makeRawRecord(5, 0, 0));
122c180a189SMatt Spinler     EXPECT_EQ(5, mgr.getNumRecords());
123c180a189SMatt Spinler 
124c180a189SMatt Spinler     mgr.add(makeRawRecord(6, 0, 0));
125c180a189SMatt Spinler     EXPECT_EQ(5, mgr.getNumRecords());
126c180a189SMatt Spinler 
127c180a189SMatt Spinler     mgr.add(makeRawRecord(7, 0, 0));
128c180a189SMatt Spinler     EXPECT_EQ(5, mgr.getNumRecords());
129c180a189SMatt Spinler 
130c180a189SMatt Spinler     mgr.add(makeRawRecord(8, 0, 0));
131c180a189SMatt Spinler     EXPECT_EQ(5, mgr.getNumRecords());
132c180a189SMatt Spinler 
133c180a189SMatt Spinler     // rollover
134c180a189SMatt Spinler     mgr.add(makeRawRecord(0, 0, 0));
135c180a189SMatt Spinler     EXPECT_EQ(5, mgr.getNumRecords());
136c180a189SMatt Spinler 
137c180a189SMatt Spinler     mgr.add(makeRawRecord(1, 0, 0));
138c180a189SMatt Spinler     EXPECT_EQ(5, mgr.getNumRecords());
139c180a189SMatt Spinler 
140c180a189SMatt Spinler     // nonsequential ID, clear previous
141c180a189SMatt Spinler     mgr.add(makeRawRecord(4, 0, 10));
142c180a189SMatt Spinler     EXPECT_EQ(1, mgr.getNumRecords());
143c180a189SMatt Spinler 
144c180a189SMatt Spinler     // back to normal
145c180a189SMatt Spinler     mgr.add(makeRawRecord(5, 1, 11));
146c180a189SMatt Spinler     EXPECT_EQ(2, mgr.getNumRecords());
147c180a189SMatt Spinler 
148c180a189SMatt Spinler     // One more good record
149c180a189SMatt Spinler     mgr.add(makeRawRecord(6, 2, 12));
150c180a189SMatt Spinler     EXPECT_EQ(3, mgr.getNumRecords());
151c180a189SMatt Spinler 
152c180a189SMatt Spinler     // Add a garbage length record. No size change
153c180a189SMatt Spinler     mgr.add(std::vector<uint8_t>(6, 0));
154c180a189SMatt Spinler     EXPECT_EQ(3, mgr.getNumRecords());
155c180a189SMatt Spinler 
156c180a189SMatt Spinler     // Test the DBus Records
157c180a189SMatt Spinler     auto avgRecords = mgr.getAverageRecords();
158c180a189SMatt Spinler     EXPECT_EQ(3, avgRecords.size());
159c180a189SMatt Spinler 
160c180a189SMatt Spinler     auto maxRecords = mgr.getMaximumRecords();
161c180a189SMatt Spinler     EXPECT_EQ(3, maxRecords.size());
162c180a189SMatt Spinler 
163c180a189SMatt Spinler     auto avg = 2;
164c180a189SMatt Spinler     for (const auto& r : avgRecords)
165c180a189SMatt Spinler     {
166c180a189SMatt Spinler         EXPECT_EQ(avg, std::get<1>(r));
167c180a189SMatt Spinler         avg--;
168c180a189SMatt Spinler     }
169c180a189SMatt Spinler 
170c180a189SMatt Spinler     auto max = 12;
171c180a189SMatt Spinler     for (const auto& r : maxRecords)
172c180a189SMatt Spinler     {
173c180a189SMatt Spinler         EXPECT_EQ(max, std::get<1>(r));
174c180a189SMatt Spinler         max--;
175c180a189SMatt Spinler     }
176c180a189SMatt Spinler 
177c180a189SMatt Spinler     // Add a zero length record. Records cleared.
178c180a189SMatt Spinler     mgr.add(std::vector<uint8_t>{});
179c180a189SMatt Spinler     EXPECT_EQ(0, mgr.getNumRecords());
180c180a189SMatt Spinler }
181