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