xref: /openbmc/phosphor-logging/test/openpower-pels/repository_test.cpp (revision be952d2edc63d9c9ad6ed389e012043b345e483e)
197f7abcfSMatt Spinler /**
297f7abcfSMatt Spinler  * Copyright © 2019 IBM Corporation
397f7abcfSMatt Spinler  *
497f7abcfSMatt Spinler  * Licensed under the Apache License, Version 2.0 (the "License");
597f7abcfSMatt Spinler  * you may not use this file except in compliance with the License.
697f7abcfSMatt Spinler  * You may obtain a copy of the License at
797f7abcfSMatt Spinler  *
897f7abcfSMatt Spinler  *     http://www.apache.org/licenses/LICENSE-2.0
997f7abcfSMatt Spinler  *
1097f7abcfSMatt Spinler  * Unless required by applicable law or agreed to in writing, software
1197f7abcfSMatt Spinler  * distributed under the License is distributed on an "AS IS" BASIS,
1297f7abcfSMatt Spinler  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1397f7abcfSMatt Spinler  * See the License for the specific language governing permissions and
1497f7abcfSMatt Spinler  * limitations under the License.
1597f7abcfSMatt Spinler  */
1689fa082aSMatt Spinler #include "extensions/openpower-pels/paths.hpp"
1789fa082aSMatt Spinler #include "extensions/openpower-pels/repository.hpp"
1889fa082aSMatt Spinler #include "pel_utils.hpp"
1989fa082aSMatt Spinler 
2089fa082aSMatt Spinler #include <ext/stdio_filebuf.h>
2189fa082aSMatt Spinler 
2289fa082aSMatt Spinler #include <filesystem>
2389fa082aSMatt Spinler 
2489fa082aSMatt Spinler #include <gtest/gtest.h>
2589fa082aSMatt Spinler 
2689fa082aSMatt Spinler using namespace openpower::pels;
2789fa082aSMatt Spinler namespace fs = std::filesystem;
2889fa082aSMatt Spinler 
2989fa082aSMatt Spinler /**
3089fa082aSMatt Spinler  * Clean the Repo after every testcase.
3189fa082aSMatt Spinler  * And because we have PEL object, also clean up
3289fa082aSMatt Spinler  * the log ID.
3389fa082aSMatt Spinler  */
3489fa082aSMatt Spinler class RepositoryTest : public CleanLogID
3589fa082aSMatt Spinler {
3689fa082aSMatt Spinler   protected:
SetUp()3789fa082aSMatt Spinler     void SetUp() override
3889fa082aSMatt Spinler     {
3989fa082aSMatt Spinler         repoPath = getPELRepoPath();
4089fa082aSMatt Spinler     }
4189fa082aSMatt Spinler 
TearDown()4289fa082aSMatt Spinler     void TearDown() override
4389fa082aSMatt Spinler     {
4489fa082aSMatt Spinler         fs::remove_all(repoPath);
4589fa082aSMatt Spinler     }
4689fa082aSMatt Spinler 
4789fa082aSMatt Spinler     fs::path repoPath;
4889fa082aSMatt Spinler };
4989fa082aSMatt Spinler 
TEST_F(RepositoryTest,FilenameTest)5089fa082aSMatt Spinler TEST_F(RepositoryTest, FilenameTest)
5189fa082aSMatt Spinler {
5289fa082aSMatt Spinler     BCDTime date = {0x20, 0x30, 0x11, 0x28, 0x13, 0x6, 0x7, 0x8};
5389fa082aSMatt Spinler 
5489fa082aSMatt Spinler     EXPECT_EQ(Repository::getPELFilename(0x12345678, date),
5589fa082aSMatt Spinler               "2030112813060708_12345678");
5689fa082aSMatt Spinler 
5789fa082aSMatt Spinler     EXPECT_EQ(Repository::getPELFilename(0xAABBCCDD, date),
5889fa082aSMatt Spinler               "2030112813060708_AABBCCDD");
5989fa082aSMatt Spinler 
6089fa082aSMatt Spinler     EXPECT_EQ(Repository::getPELFilename(0x3AFF1, date),
6189fa082aSMatt Spinler               "2030112813060708_0003AFF1");
6289fa082aSMatt Spinler 
6389fa082aSMatt Spinler     EXPECT_EQ(Repository::getPELFilename(100, date),
6489fa082aSMatt Spinler               "2030112813060708_00000064");
6589fa082aSMatt Spinler 
6689fa082aSMatt Spinler     EXPECT_EQ(Repository::getPELFilename(0, date), "2030112813060708_00000000");
6789fa082aSMatt Spinler }
6889fa082aSMatt Spinler 
TEST_F(RepositoryTest,AddTest)6989fa082aSMatt Spinler TEST_F(RepositoryTest, AddTest)
7089fa082aSMatt Spinler {
7189fa082aSMatt Spinler     Repository repo{repoPath};
7242828bd9SMatt Spinler     auto data = pelDataFactory(TestPELType::pelSimple);
7342828bd9SMatt Spinler     auto pel = std::make_unique<PEL>(data);
7489fa082aSMatt Spinler 
7589fa082aSMatt Spinler     repo.add(pel);
7689fa082aSMatt Spinler 
7789fa082aSMatt Spinler     // Check that the PEL was stored where it was supposed to be,
7889fa082aSMatt Spinler     // and that it wrote the PEL data.
7997d19b48SMatt Spinler     const auto ts = pel->privateHeader().commitTimestamp();
8089fa082aSMatt Spinler     auto name = Repository::getPELFilename(pel->id(), ts);
8189fa082aSMatt Spinler 
8289fa082aSMatt Spinler     fs::path file = repoPath / "logs" / name;
8389fa082aSMatt Spinler     EXPECT_TRUE(fs::exists(file));
8489fa082aSMatt Spinler 
8589fa082aSMatt Spinler     auto newData = readPELFile(file);
8689fa082aSMatt Spinler     auto pelData = pel->data();
8789fa082aSMatt Spinler     EXPECT_EQ(*newData, pelData);
8844893cc9SMatt Spinler 
8944893cc9SMatt Spinler     EXPECT_EQ(repo.lastPelID(), pel->id());
9089fa082aSMatt Spinler }
91475e574dSMatt Spinler 
TEST_F(RepositoryTest,RemoveTest)9252602e35SMatt Spinler TEST_F(RepositoryTest, RemoveTest)
9352602e35SMatt Spinler {
9452602e35SMatt Spinler     using pelID = Repository::LogID::Pel;
9552602e35SMatt Spinler     using obmcID = Repository::LogID::Obmc;
9652602e35SMatt Spinler 
9752602e35SMatt Spinler     // Add and remove a PEL from the repo
9852602e35SMatt Spinler 
9952602e35SMatt Spinler     Repository repo{repoPath};
10052602e35SMatt Spinler 
10152602e35SMatt Spinler     auto data = pelDataFactory(TestPELType::pelSimple);
10252602e35SMatt Spinler     auto pel = std::make_unique<PEL>(data, 1);
10352602e35SMatt Spinler 
10452602e35SMatt Spinler     pel->assignID();
10552602e35SMatt Spinler     Repository::LogID id{pelID{pel->id()}, obmcID{pel->obmcLogID()}};
10652602e35SMatt Spinler 
10752602e35SMatt Spinler     repo.add(pel);
10852602e35SMatt Spinler 
10952602e35SMatt Spinler     auto removedID = repo.remove(id);
11052602e35SMatt Spinler     ASSERT_TRUE(removedID);
11152602e35SMatt Spinler     EXPECT_EQ(*removedID, id);
11252602e35SMatt Spinler 
11352602e35SMatt Spinler     EXPECT_FALSE(repo.hasPEL(id));
11452602e35SMatt Spinler 
11552602e35SMatt Spinler     // Try to remove it again, not there
11652602e35SMatt Spinler     EXPECT_FALSE(repo.remove(id));
11752602e35SMatt Spinler }
11852602e35SMatt Spinler 
TEST_F(RepositoryTest,RestoreTest)119475e574dSMatt Spinler TEST_F(RepositoryTest, RestoreTest)
120475e574dSMatt Spinler {
121475e574dSMatt Spinler     using pelID = Repository::LogID::Pel;
122475e574dSMatt Spinler     using obmcID = Repository::LogID::Obmc;
123475e574dSMatt Spinler 
124475e574dSMatt Spinler     std::vector<Repository::LogID> ids;
125475e574dSMatt Spinler 
126475e574dSMatt Spinler     {
127475e574dSMatt Spinler         Repository repo{repoPath};
128475e574dSMatt Spinler 
129475e574dSMatt Spinler         // Add some PELs to the repository
130475e574dSMatt Spinler         {
13142828bd9SMatt Spinler             auto data = pelDataFactory(TestPELType::pelSimple);
13242828bd9SMatt Spinler             auto pel = std::make_unique<PEL>(data, 1);
133475e574dSMatt Spinler             pel->assignID();
134475e574dSMatt Spinler             repo.add(pel);
135475e574dSMatt Spinler             ids.emplace_back(pelID(pel->id()), obmcID(1));
136475e574dSMatt Spinler         }
137475e574dSMatt Spinler         {
13842828bd9SMatt Spinler             auto data = pelDataFactory(TestPELType::pelSimple);
13942828bd9SMatt Spinler             auto pel = std::make_unique<PEL>(data, 2);
140475e574dSMatt Spinler             pel->assignID();
141475e574dSMatt Spinler             repo.add(pel);
142475e574dSMatt Spinler             ids.emplace_back(pelID(pel->id()), obmcID(2));
143475e574dSMatt Spinler         }
144475e574dSMatt Spinler 
145475e574dSMatt Spinler         // Check they're there
146475e574dSMatt Spinler         EXPECT_TRUE(repo.hasPEL(ids[0]));
147475e574dSMatt Spinler         EXPECT_TRUE(repo.hasPEL(ids[1]));
148475e574dSMatt Spinler 
149475e574dSMatt Spinler         // Do some other search tests while we're here.
150475e574dSMatt Spinler 
151475e574dSMatt Spinler         // Search based on PEL ID
152475e574dSMatt Spinler         Repository::LogID id(pelID(ids[0].pelID));
153475e574dSMatt Spinler         EXPECT_TRUE(repo.hasPEL(id));
154475e574dSMatt Spinler 
155475e574dSMatt Spinler         // Search based on OBMC log ID
156475e574dSMatt Spinler         id.pelID.id = 0;
157475e574dSMatt Spinler         id.obmcID = ids[0].obmcID;
158475e574dSMatt Spinler         EXPECT_TRUE(repo.hasPEL(id));
159475e574dSMatt Spinler 
160475e574dSMatt Spinler         // ... based on the other PEL ID
161475e574dSMatt Spinler         id.pelID = ids[1].pelID;
162475e574dSMatt Spinler         id.obmcID.id = 0;
163475e574dSMatt Spinler         EXPECT_TRUE(repo.hasPEL(id));
164475e574dSMatt Spinler 
165475e574dSMatt Spinler         // Not found
166475e574dSMatt Spinler         id.pelID.id = 99;
167475e574dSMatt Spinler         id.obmcID.id = 100;
168475e574dSMatt Spinler         EXPECT_FALSE(repo.hasPEL(id));
16952602e35SMatt Spinler 
17052602e35SMatt Spinler         // Try to remove it anyway
17152602e35SMatt Spinler         EXPECT_FALSE(repo.remove(id));
172475e574dSMatt Spinler     }
173475e574dSMatt Spinler 
174475e574dSMatt Spinler     {
175475e574dSMatt Spinler         // Restore and check they're still there, then
176475e574dSMatt Spinler         // remove them.
177475e574dSMatt Spinler         Repository repo{repoPath};
178475e574dSMatt Spinler         EXPECT_TRUE(repo.hasPEL(ids[0]));
179475e574dSMatt Spinler         EXPECT_TRUE(repo.hasPEL(ids[1]));
180475e574dSMatt Spinler 
181475e574dSMatt Spinler         repo.remove(ids[0]);
182475e574dSMatt Spinler         EXPECT_FALSE(repo.hasPEL(ids[0]));
183475e574dSMatt Spinler 
184475e574dSMatt Spinler         repo.remove(ids[1]);
185475e574dSMatt Spinler         EXPECT_FALSE(repo.hasPEL(ids[1]));
186475e574dSMatt Spinler     }
187475e574dSMatt Spinler }
1882813f36dSMatt Spinler 
TEST_F(RepositoryTest,TestGetPELData)1892813f36dSMatt Spinler TEST_F(RepositoryTest, TestGetPELData)
1902813f36dSMatt Spinler {
1912813f36dSMatt Spinler     using ID = Repository::LogID;
1922813f36dSMatt Spinler     Repository repo{repoPath};
1932813f36dSMatt Spinler 
1942813f36dSMatt Spinler     ID badID{ID::Pel(42)};
1952813f36dSMatt Spinler     auto noData = repo.getPELData(badID);
1962813f36dSMatt Spinler     EXPECT_FALSE(noData);
1972813f36dSMatt Spinler 
1982813f36dSMatt Spinler     // Add a PEL to the repo, and get the data back with getPELData.
19942828bd9SMatt Spinler     auto data = pelDataFactory(TestPELType::pelSimple);
20042828bd9SMatt Spinler     auto dataCopy = data;
20142828bd9SMatt Spinler     auto pel = std::make_unique<PEL>(data);
2022813f36dSMatt Spinler     auto pelID = pel->id();
2032813f36dSMatt Spinler     repo.add(pel);
2042813f36dSMatt Spinler 
2052813f36dSMatt Spinler     ID id{ID::Pel(pelID)};
2062813f36dSMatt Spinler     auto pelData = repo.getPELData(id);
2072813f36dSMatt Spinler 
2082813f36dSMatt Spinler     ASSERT_TRUE(pelData);
2092813f36dSMatt Spinler     EXPECT_EQ(dataCopy, *pelData);
2102813f36dSMatt Spinler }
2111ea78801SMatt Spinler 
TEST_F(RepositoryTest,TestForEach)2121ea78801SMatt Spinler TEST_F(RepositoryTest, TestForEach)
2131ea78801SMatt Spinler {
2141ea78801SMatt Spinler     Repository repo{repoPath};
2151ea78801SMatt Spinler 
2161ea78801SMatt Spinler     // Add 2 PELs
2171ea78801SMatt Spinler     auto data = pelDataFactory(TestPELType::pelSimple);
2181ea78801SMatt Spinler     auto pel = std::make_unique<PEL>(data);
2191ea78801SMatt Spinler     repo.add(pel);
2201ea78801SMatt Spinler 
2211ea78801SMatt Spinler     pel = std::make_unique<PEL>(data);
2221ea78801SMatt Spinler     pel->assignID();
2231ea78801SMatt Spinler     pel->setCommitTime();
2241ea78801SMatt Spinler     repo.add(pel);
2251ea78801SMatt Spinler 
2261ea78801SMatt Spinler     // Make a function that saves the IDs
2271ea78801SMatt Spinler     std::vector<uint32_t> ids;
2281ea78801SMatt Spinler     Repository::ForEachFunc f1 = [&ids](const PEL& pel) {
2291ea78801SMatt Spinler         ids.push_back(pel.id());
2301ea78801SMatt Spinler         return false;
2311ea78801SMatt Spinler     };
2321ea78801SMatt Spinler 
2331ea78801SMatt Spinler     repo.for_each(f1);
2341ea78801SMatt Spinler 
2351ea78801SMatt Spinler     EXPECT_EQ(ids.size(), 2);
2361ea78801SMatt Spinler 
2371ea78801SMatt Spinler     // Stop after the first time in.
2381ea78801SMatt Spinler     Repository::ForEachFunc f2 = [&ids](const PEL& pel) {
2391ea78801SMatt Spinler         ids.push_back(pel.id());
2401ea78801SMatt Spinler         return true;
2411ea78801SMatt Spinler     };
2421ea78801SMatt Spinler 
2431ea78801SMatt Spinler     ids.clear();
2441ea78801SMatt Spinler     repo.for_each(f2);
2451ea78801SMatt Spinler     EXPECT_EQ(ids.size(), 1);
2461ea78801SMatt Spinler }
247421f6531SMatt Spinler 
TEST_F(RepositoryTest,TestSubscriptions)248421f6531SMatt Spinler TEST_F(RepositoryTest, TestSubscriptions)
249421f6531SMatt Spinler {
250421f6531SMatt Spinler     std::vector<uint32_t> added;
251421f6531SMatt Spinler     std::vector<uint32_t> removed;
252421f6531SMatt Spinler 
253421f6531SMatt Spinler     Repository::AddCallback ac = [&added](const PEL& pel) {
254421f6531SMatt Spinler         added.push_back(pel.id());
255421f6531SMatt Spinler     };
256421f6531SMatt Spinler 
257421f6531SMatt Spinler     Repository::DeleteCallback dc = [&removed](uint32_t id) {
258421f6531SMatt Spinler         removed.push_back(id);
259421f6531SMatt Spinler     };
260421f6531SMatt Spinler 
261421f6531SMatt Spinler     Repository repo{repoPath};
262421f6531SMatt Spinler     repo.subscribeToAdds("test", ac);
263421f6531SMatt Spinler     repo.subscribeToDeletes("test", dc);
264421f6531SMatt Spinler 
265421f6531SMatt Spinler     auto data = pelDataFactory(TestPELType::pelSimple);
266421f6531SMatt Spinler     auto pel = std::make_unique<PEL>(data);
267421f6531SMatt Spinler     auto pelID = pel->id();
268421f6531SMatt Spinler     repo.add(pel);
269421f6531SMatt Spinler 
270421f6531SMatt Spinler     EXPECT_EQ(added.size(), 1);
271421f6531SMatt Spinler 
272421f6531SMatt Spinler     using ID = Repository::LogID;
273421f6531SMatt Spinler     ID id{ID::Pel(pelID)};
274421f6531SMatt Spinler     repo.remove(id);
275421f6531SMatt Spinler 
276421f6531SMatt Spinler     EXPECT_EQ(removed.size(), 1);
277421f6531SMatt Spinler 
278421f6531SMatt Spinler     repo.unsubscribeFromAdds("test");
279421f6531SMatt Spinler     repo.unsubscribeFromDeletes("test");
280421f6531SMatt Spinler 
281421f6531SMatt Spinler     added.clear();
282421f6531SMatt Spinler     removed.clear();
283421f6531SMatt Spinler 
284421f6531SMatt Spinler     repo.add(pel);
285421f6531SMatt Spinler     EXPECT_EQ(added.size(), 0);
286421f6531SMatt Spinler 
287421f6531SMatt Spinler     repo.remove(id);
288421f6531SMatt Spinler     EXPECT_EQ(removed.size(), 0);
289421f6531SMatt Spinler }
2900ff00485SMatt Spinler 
TEST_F(RepositoryTest,TestGetAttributes)2910ff00485SMatt Spinler TEST_F(RepositoryTest, TestGetAttributes)
2920ff00485SMatt Spinler {
2930ff00485SMatt Spinler     uint32_t pelID = 0;
2940ff00485SMatt Spinler     std::bitset<16> actionFlags;
2950ff00485SMatt Spinler 
2960ff00485SMatt Spinler     {
2970ff00485SMatt Spinler         Repository repo{repoPath};
2980ff00485SMatt Spinler 
2990ff00485SMatt Spinler         // Add a PEL to the repo
3000ff00485SMatt Spinler         auto data = pelDataFactory(TestPELType::pelSimple);
3010ff00485SMatt Spinler         auto pel = std::make_unique<PEL>(data);
3020ff00485SMatt Spinler         repo.add(pel);
3030ff00485SMatt Spinler 
3040ff00485SMatt Spinler         pelID = pel->id();
3050ff00485SMatt Spinler         actionFlags = pel->userHeader().actionFlags();
3060ff00485SMatt Spinler 
3070ff00485SMatt Spinler         using ID = Repository::LogID;
3080ff00485SMatt Spinler         ID id{ID::Pel(pelID)};
3090ff00485SMatt Spinler 
3100ff00485SMatt Spinler         auto a = repo.getPELAttributes(id);
3110ff00485SMatt Spinler         EXPECT_TRUE(a);
3120ff00485SMatt Spinler         EXPECT_EQ((*a).get().actionFlags, actionFlags);
3130ff00485SMatt Spinler 
3140ff00485SMatt Spinler         id.pelID.id = 0;
3150ff00485SMatt Spinler         a = repo.getPELAttributes(id);
3160ff00485SMatt Spinler         EXPECT_FALSE(a);
3170ff00485SMatt Spinler     }
3180ff00485SMatt Spinler 
3190ff00485SMatt Spinler     {
3200ff00485SMatt Spinler         // Restore the repository and check again
3210ff00485SMatt Spinler         Repository repo{repoPath};
3220ff00485SMatt Spinler 
3230ff00485SMatt Spinler         using ID = Repository::LogID;
3240ff00485SMatt Spinler         ID id{ID::Pel(pelID)};
3250ff00485SMatt Spinler 
3260ff00485SMatt Spinler         auto a = repo.getPELAttributes(id);
3270ff00485SMatt Spinler         EXPECT_TRUE(a);
3280ff00485SMatt Spinler         EXPECT_EQ((*a).get().actionFlags, actionFlags);
3290ff00485SMatt Spinler 
3300ff00485SMatt Spinler         id.pelID.id = 0;
3310ff00485SMatt Spinler         a = repo.getPELAttributes(id);
3320ff00485SMatt Spinler         EXPECT_FALSE(a);
3330ff00485SMatt Spinler     }
3340ff00485SMatt Spinler }
33529d18c11SMatt Spinler 
TEST_F(RepositoryTest,TestSetHostState)33629d18c11SMatt Spinler TEST_F(RepositoryTest, TestSetHostState)
33729d18c11SMatt Spinler {
33829d18c11SMatt Spinler     // Add a PEL to the repo
33929d18c11SMatt Spinler     auto data = pelDataFactory(TestPELType::pelSimple);
34029d18c11SMatt Spinler     auto pel = std::make_unique<PEL>(data);
34129d18c11SMatt Spinler     using ID = Repository::LogID;
34229d18c11SMatt Spinler     ID id{ID::Pel(pel->id())};
34329d18c11SMatt Spinler 
34429d18c11SMatt Spinler     {
34529d18c11SMatt Spinler         Repository repo{repoPath};
34629d18c11SMatt Spinler 
34729d18c11SMatt Spinler         repo.add(pel);
34829d18c11SMatt Spinler 
34929d18c11SMatt Spinler         auto a = repo.getPELAttributes(id);
35029d18c11SMatt Spinler         EXPECT_EQ((*a).get().hostState, TransmissionState::newPEL);
35129d18c11SMatt Spinler 
35229d18c11SMatt Spinler         repo.setPELHostTransState(pel->id(), TransmissionState::acked);
35329d18c11SMatt Spinler 
35429d18c11SMatt Spinler         // First, check the attributes
35529d18c11SMatt Spinler         a = repo.getPELAttributes(id);
35629d18c11SMatt Spinler         EXPECT_EQ((*a).get().hostState, TransmissionState::acked);
35729d18c11SMatt Spinler 
35829d18c11SMatt Spinler         // Next, check the PEL data itself
35929d18c11SMatt Spinler         auto pelData = repo.getPELData(id);
36029d18c11SMatt Spinler         PEL newPEL{*pelData};
36129d18c11SMatt Spinler         EXPECT_EQ(newPEL.hostTransmissionState(), TransmissionState::acked);
36229d18c11SMatt Spinler     }
36329d18c11SMatt Spinler 
36429d18c11SMatt Spinler     {
36529d18c11SMatt Spinler         // Now restore, and check again
36629d18c11SMatt Spinler         Repository repo{repoPath};
36729d18c11SMatt Spinler 
36829d18c11SMatt Spinler         // First, check the attributes
36929d18c11SMatt Spinler         auto a = repo.getPELAttributes(id);
37029d18c11SMatt Spinler         EXPECT_EQ((*a).get().hostState, TransmissionState::acked);
37129d18c11SMatt Spinler 
37229d18c11SMatt Spinler         // Next, check the PEL data itself
37329d18c11SMatt Spinler         auto pelData = repo.getPELData(id);
37429d18c11SMatt Spinler         PEL newPEL{*pelData};
37529d18c11SMatt Spinler         EXPECT_EQ(newPEL.hostTransmissionState(), TransmissionState::acked);
37629d18c11SMatt Spinler     }
37729d18c11SMatt Spinler }
37829d18c11SMatt Spinler 
TEST_F(RepositoryTest,TestSetHMCState)37929d18c11SMatt Spinler TEST_F(RepositoryTest, TestSetHMCState)
38029d18c11SMatt Spinler {
38129d18c11SMatt Spinler     // Add a PEL to the repo
38229d18c11SMatt Spinler     auto data = pelDataFactory(TestPELType::pelSimple);
38329d18c11SMatt Spinler     auto pel = std::make_unique<PEL>(data);
38429d18c11SMatt Spinler     using ID = Repository::LogID;
38529d18c11SMatt Spinler     ID id{ID::Pel(pel->id())};
38629d18c11SMatt Spinler 
38729d18c11SMatt Spinler     {
38829d18c11SMatt Spinler         Repository repo{repoPath};
38929d18c11SMatt Spinler 
39029d18c11SMatt Spinler         repo.add(pel);
39129d18c11SMatt Spinler 
39229d18c11SMatt Spinler         auto a = repo.getPELAttributes(id);
39329d18c11SMatt Spinler         EXPECT_EQ((*a).get().hmcState, TransmissionState::newPEL);
39429d18c11SMatt Spinler 
39529d18c11SMatt Spinler         repo.setPELHMCTransState(pel->id(), TransmissionState::acked);
39629d18c11SMatt Spinler 
39729d18c11SMatt Spinler         // First, check the attributes
39829d18c11SMatt Spinler         a = repo.getPELAttributes(id);
39929d18c11SMatt Spinler         EXPECT_EQ((*a).get().hmcState, TransmissionState::acked);
40029d18c11SMatt Spinler 
40129d18c11SMatt Spinler         // Next, check the PEL data itself
40229d18c11SMatt Spinler         auto pelData = repo.getPELData(id);
40329d18c11SMatt Spinler         PEL newPEL{*pelData};
40429d18c11SMatt Spinler         EXPECT_EQ(newPEL.hmcTransmissionState(), TransmissionState::acked);
40529d18c11SMatt Spinler     }
40629d18c11SMatt Spinler 
40729d18c11SMatt Spinler     {
40829d18c11SMatt Spinler         // Now restore, and check again
40929d18c11SMatt Spinler         Repository repo{repoPath};
41029d18c11SMatt Spinler 
41129d18c11SMatt Spinler         // First, check the attributes
41229d18c11SMatt Spinler         auto a = repo.getPELAttributes(id);
41329d18c11SMatt Spinler         EXPECT_EQ((*a).get().hmcState, TransmissionState::acked);
41429d18c11SMatt Spinler 
41529d18c11SMatt Spinler         // Next, check the PEL data itself
41629d18c11SMatt Spinler         auto pelData = repo.getPELData(id);
41729d18c11SMatt Spinler         PEL newPEL{*pelData};
41829d18c11SMatt Spinler         EXPECT_EQ(newPEL.hmcTransmissionState(), TransmissionState::acked);
41929d18c11SMatt Spinler     }
42029d18c11SMatt Spinler }
4216d51224bSMatt Spinler 
TEST_F(RepositoryTest,TestGetPELFD)4226d51224bSMatt Spinler TEST_F(RepositoryTest, TestGetPELFD)
4236d51224bSMatt Spinler {
4246d51224bSMatt Spinler     Repository repo{repoPath};
4256d51224bSMatt Spinler 
4266d51224bSMatt Spinler     auto data = pelDataFactory(TestPELType::pelSimple);
4276d51224bSMatt Spinler     auto pel = std::make_unique<PEL>(data);
4286d51224bSMatt Spinler     pel->setCommitTime();
4296d51224bSMatt Spinler     pel->assignID();
4306d51224bSMatt Spinler 
4316d51224bSMatt Spinler     repo.add(pel);
4326d51224bSMatt Spinler 
4336d51224bSMatt Spinler     using ID = Repository::LogID;
4346d51224bSMatt Spinler     ID id{ID::Pel(pel->id())};
4356d51224bSMatt Spinler 
4366d51224bSMatt Spinler     auto fd = repo.getPELFD(id);
4376d51224bSMatt Spinler 
4386d51224bSMatt Spinler     EXPECT_TRUE(fd);
4396d51224bSMatt Spinler 
4406d51224bSMatt Spinler     // Get the size
4416d51224bSMatt Spinler     struct stat s;
4426d51224bSMatt Spinler     int r = fstat(*fd, &s);
4436d51224bSMatt Spinler     ASSERT_EQ(r, 0);
4446d51224bSMatt Spinler 
4456d51224bSMatt Spinler     auto size = s.st_size;
4466d51224bSMatt Spinler 
4476d51224bSMatt Spinler     // Read the PEL data out of the FD
4486d51224bSMatt Spinler     FILE* fp = fdopen(*fd, "r");
4496d51224bSMatt Spinler     ASSERT_NE(fp, nullptr);
4506d51224bSMatt Spinler 
4516d51224bSMatt Spinler     std::vector<uint8_t> newData;
4526d51224bSMatt Spinler     newData.resize(size);
4536d51224bSMatt Spinler     r = fread(newData.data(), 1, size, fp);
4546d51224bSMatt Spinler     EXPECT_EQ(r, size);
4556d51224bSMatt Spinler 
4566d51224bSMatt Spinler     PEL newPEL{newData};
4576d51224bSMatt Spinler 
4586d51224bSMatt Spinler     EXPECT_TRUE(newPEL.valid());
4596d51224bSMatt Spinler     EXPECT_EQ(newPEL.id(), pel->id());
4606d51224bSMatt Spinler 
4616d51224bSMatt Spinler     fclose(fp);
4626d51224bSMatt Spinler 
4636d51224bSMatt Spinler     // Call getPELFD again, this time with a bad ID
4646d51224bSMatt Spinler     id.pelID.id = 42;
4656d51224bSMatt Spinler     fd = repo.getPELFD(id);
4666d51224bSMatt Spinler 
4676d51224bSMatt Spinler     EXPECT_FALSE(fd);
4686d51224bSMatt Spinler }
469b188f78aSMatt Spinler 
470b188f78aSMatt Spinler // Test the repo size statistics
TEST_F(RepositoryTest,TestRepoSizes)471b188f78aSMatt Spinler TEST_F(RepositoryTest, TestRepoSizes)
472b188f78aSMatt Spinler {
473b188f78aSMatt Spinler     uint32_t id = 1;
474b188f78aSMatt Spinler 
475b188f78aSMatt Spinler     Repository repo{repoPath, 10000, 500};
476b188f78aSMatt Spinler 
477b188f78aSMatt Spinler     // All of the size stats are the sizes on disk a PEL takes up,
478b188f78aSMatt Spinler     // which is different than the file size.  Disk usage seems
479b188f78aSMatt Spinler     // to have a granularity of 4096 bytes.  This probably shouldn't
480b188f78aSMatt Spinler     // be hardcoded, but I don't know how to look it up dynamically.
481b188f78aSMatt Spinler 
482b188f78aSMatt Spinler     // All sizes are zero
483b188f78aSMatt Spinler     {
484b188f78aSMatt Spinler         const auto& stats = repo.getSizeStats();
485b188f78aSMatt Spinler         EXPECT_EQ(stats.total, 0);
486b188f78aSMatt Spinler         EXPECT_EQ(stats.bmc, 0);
487b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMC, 0);
488b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcServiceable, 0);
489b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcInfo, 0);
490b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCServiceable, 0);
491b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCInfo, 0);
492b188f78aSMatt Spinler     }
493b188f78aSMatt Spinler 
494b188f78aSMatt Spinler     // Add a 2000B BMC predictive error
495b188f78aSMatt Spinler     auto data = pelFactory(id++, 'O', 0x20, 0x8800, 2000);
496b188f78aSMatt Spinler     auto pel = std::make_unique<PEL>(data);
497b188f78aSMatt Spinler     auto pelID1 = pel->id();
498b188f78aSMatt Spinler     repo.add(pel);
499b188f78aSMatt Spinler 
500b188f78aSMatt Spinler     {
501b188f78aSMatt Spinler         const auto& stats = repo.getSizeStats();
502b188f78aSMatt Spinler         EXPECT_EQ(stats.total, 4096);
503b188f78aSMatt Spinler         EXPECT_EQ(stats.bmc, 4096);
504b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMC, 0);
505b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcServiceable, 4096);
506b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcInfo, 0);
507b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCServiceable, 0);
508b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCInfo, 0);
509b188f78aSMatt Spinler     }
510b188f78aSMatt Spinler 
511b188f78aSMatt Spinler     // Add a 5000B BMC informational error
512b188f78aSMatt Spinler     data = pelFactory(id++, 'O', 0x00, 0x8800, 5000);
513b188f78aSMatt Spinler     pel = std::make_unique<PEL>(data);
514b188f78aSMatt Spinler     auto pelID2 = pel->id();
515b188f78aSMatt Spinler     repo.add(pel);
516b188f78aSMatt Spinler 
517b188f78aSMatt Spinler     {
518b188f78aSMatt Spinler         const auto& stats = repo.getSizeStats();
519b188f78aSMatt Spinler         EXPECT_EQ(stats.total, 4096 + 8192);
520b188f78aSMatt Spinler         EXPECT_EQ(stats.bmc, 4096 + 8192);
521b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMC, 0);
522b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcServiceable, 4096);
523b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcInfo, 8192);
524b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCServiceable, 0);
525b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCInfo, 0);
526b188f78aSMatt Spinler     }
527b188f78aSMatt Spinler 
528b188f78aSMatt Spinler     // Add a 4000B Hostboot unrecoverable error
529b188f78aSMatt Spinler     data = pelFactory(id++, 'B', 0x40, 0x8800, 4000);
530b188f78aSMatt Spinler     pel = std::make_unique<PEL>(data);
531b188f78aSMatt Spinler     auto pelID3 = pel->id();
532b188f78aSMatt Spinler     repo.add(pel);
533b188f78aSMatt Spinler 
534b188f78aSMatt Spinler     {
535b188f78aSMatt Spinler         const auto& stats = repo.getSizeStats();
536b188f78aSMatt Spinler         EXPECT_EQ(stats.total, 4096 + 8192 + 4096);
537b188f78aSMatt Spinler         EXPECT_EQ(stats.bmc, 4096 + 8192);
538b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMC, 4096);
539b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcServiceable, 4096);
540b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcInfo, 8192);
541b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCServiceable, 4096);
542b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCInfo, 0);
543b188f78aSMatt Spinler     }
544b188f78aSMatt Spinler 
545b188f78aSMatt Spinler     // Add a 5000B Hostboot informational error
546b188f78aSMatt Spinler     data = pelFactory(id++, 'B', 0x00, 0x8800, 5000);
547b188f78aSMatt Spinler     pel = std::make_unique<PEL>(data);
548b188f78aSMatt Spinler     auto pelID4 = pel->id();
549b188f78aSMatt Spinler     repo.add(pel);
550b188f78aSMatt Spinler 
551b188f78aSMatt Spinler     {
552b188f78aSMatt Spinler         const auto& stats = repo.getSizeStats();
553b188f78aSMatt Spinler         EXPECT_EQ(stats.total, 4096 + 8192 + 4096 + 8192);
554b188f78aSMatt Spinler         EXPECT_EQ(stats.bmc, 4096 + 8192);
555b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMC, 4096 + 8192);
556b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcServiceable, 4096);
557b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcInfo, 8192);
558b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCServiceable, 4096);
559b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCInfo, 8192);
560b188f78aSMatt Spinler     }
561b188f78aSMatt Spinler 
562b188f78aSMatt Spinler     // Remove the BMC serviceable error
563b188f78aSMatt Spinler     using ID = Repository::LogID;
564b188f78aSMatt Spinler     ID id1{ID::Pel(pelID1)};
565b188f78aSMatt Spinler 
566b188f78aSMatt Spinler     repo.remove(id1);
567b188f78aSMatt Spinler     {
568b188f78aSMatt Spinler         const auto& stats = repo.getSizeStats();
569b188f78aSMatt Spinler         EXPECT_EQ(stats.total, 8192 + 4096 + 8192);
570b188f78aSMatt Spinler         EXPECT_EQ(stats.bmc, 8192);
571b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMC, 4096 + 8192);
572b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcServiceable, 0);
573b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcInfo, 8192);
574b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCServiceable, 4096);
575b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCInfo, 8192);
576b188f78aSMatt Spinler     }
577b188f78aSMatt Spinler 
578b188f78aSMatt Spinler     // Remove the Hostboot informational error
579b188f78aSMatt Spinler     ID id4{ID::Pel(pelID4)};
580b188f78aSMatt Spinler 
581b188f78aSMatt Spinler     repo.remove(id4);
582b188f78aSMatt Spinler     {
583b188f78aSMatt Spinler         const auto& stats = repo.getSizeStats();
584b188f78aSMatt Spinler         EXPECT_EQ(stats.total, 8192 + 4096);
585b188f78aSMatt Spinler         EXPECT_EQ(stats.bmc, 8192);
586b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMC, 4096);
587b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcServiceable, 0);
588b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcInfo, 8192);
589b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCServiceable, 4096);
590b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCInfo, 0);
591b188f78aSMatt Spinler     }
592b188f78aSMatt Spinler 
593b188f78aSMatt Spinler     // Remove the BMC informational error
594b188f78aSMatt Spinler     ID id2{ID::Pel(pelID2)};
595b188f78aSMatt Spinler 
596b188f78aSMatt Spinler     repo.remove(id2);
597b188f78aSMatt Spinler     {
598b188f78aSMatt Spinler         const auto& stats = repo.getSizeStats();
599b188f78aSMatt Spinler         EXPECT_EQ(stats.total, 4096);
600b188f78aSMatt Spinler         EXPECT_EQ(stats.bmc, 0);
601b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMC, 4096);
602b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcServiceable, 0);
603b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcInfo, 0);
604b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCServiceable, 4096);
605b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCInfo, 0);
606b188f78aSMatt Spinler     }
607b188f78aSMatt Spinler 
608b188f78aSMatt Spinler     // Remove the hostboot unrecoverable error
609b188f78aSMatt Spinler     ID id3{ID::Pel(pelID3)};
610b188f78aSMatt Spinler 
611b188f78aSMatt Spinler     repo.remove(id3);
612b188f78aSMatt Spinler     {
613b188f78aSMatt Spinler         const auto& stats = repo.getSizeStats();
614b188f78aSMatt Spinler         EXPECT_EQ(stats.total, 0);
615b188f78aSMatt Spinler         EXPECT_EQ(stats.bmc, 0);
616b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMC, 0);
617b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcServiceable, 0);
618b188f78aSMatt Spinler         EXPECT_EQ(stats.bmcInfo, 0);
619b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCServiceable, 0);
620b188f78aSMatt Spinler         EXPECT_EQ(stats.nonBMCInfo, 0);
621b188f78aSMatt Spinler     }
622b188f78aSMatt Spinler }
623b0a8df5bSMatt Spinler 
624b0a8df5bSMatt Spinler // Prune PELs, when no HMC/OS/PHYP acks
TEST_F(RepositoryTest,TestPruneNoAcks)625b0a8df5bSMatt Spinler TEST_F(RepositoryTest, TestPruneNoAcks)
626b0a8df5bSMatt Spinler {
627027bf285SSumit Kumar     std::vector<uint32_t> id;
628b0a8df5bSMatt Spinler     Repository repo{repoPath, 4096 * 20, 100};
629b0a8df5bSMatt Spinler 
630b0a8df5bSMatt Spinler     // Add 10 4096B (on disk) PELs of BMC nonInfo, Info and nonBMC info,
631b0a8df5bSMatt Spinler     // nonInfo errors. None of them acked by PHYP, host, or HMC.
632b0a8df5bSMatt Spinler     for (uint32_t i = 1; i <= 10; i++)
633b0a8df5bSMatt Spinler     {
634b0a8df5bSMatt Spinler         // BMC predictive
635b0a8df5bSMatt Spinler         auto data = pelFactory(i, 'O', 0x20, 0x8800, 500);
636b0a8df5bSMatt Spinler         auto pel = std::make_unique<PEL>(data);
637b0a8df5bSMatt Spinler         repo.add(pel);
638b0a8df5bSMatt Spinler 
639b0a8df5bSMatt Spinler         // BMC info
640b0a8df5bSMatt Spinler         data = pelFactory(i + 100, 'O', 0x0, 0x8800, 500);
641b0a8df5bSMatt Spinler         pel = std::make_unique<PEL>(data);
642b0a8df5bSMatt Spinler         repo.add(pel);
643b0a8df5bSMatt Spinler 
644b0a8df5bSMatt Spinler         // Hostboot predictive
645b0a8df5bSMatt Spinler         data = pelFactory(i + 200, 'B', 0x20, 0x8800, 500);
646b0a8df5bSMatt Spinler         pel = std::make_unique<PEL>(data);
647b0a8df5bSMatt Spinler         repo.add(pel);
648b0a8df5bSMatt Spinler 
649b0a8df5bSMatt Spinler         // Hostboot info
650b0a8df5bSMatt Spinler         data = pelFactory(i + 300, 'B', 0x0, 0x8800, 500);
651b0a8df5bSMatt Spinler         pel = std::make_unique<PEL>(data);
652b0a8df5bSMatt Spinler         repo.add(pel);
653b0a8df5bSMatt Spinler     }
654b0a8df5bSMatt Spinler 
655b0a8df5bSMatt Spinler     const auto& sizes = repo.getSizeStats();
656b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.total, 4096 * 40);
657b0a8df5bSMatt Spinler 
658b0a8df5bSMatt Spinler     // Sanity check the very first PELs with IDs 1 to 4 are
659b0a8df5bSMatt Spinler     // there so we can check they are removed after the prune.
660b0a8df5bSMatt Spinler     for (uint32_t i = 1; i < 5; i++)
661b0a8df5bSMatt Spinler     {
662*be952d2eSMatt Spinler         Repository::LogID logID{Repository::LogID::Pel{i}};
663*be952d2eSMatt Spinler         EXPECT_TRUE(repo.getPELAttributes(logID));
664b0a8df5bSMatt Spinler     }
665b0a8df5bSMatt Spinler 
666b0a8df5bSMatt Spinler     // Prune down to 15%/30%/15%/30% = 90% total
667027bf285SSumit Kumar     auto IDs = repo.prune(id);
668b0a8df5bSMatt Spinler 
669b0a8df5bSMatt Spinler     // Check the final sizes
670b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.total, 4096 * 18);            // 90% of 20 PELs
671b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.bmcInfo, 4096 * 3);           // 15% of 20 PELs
672b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.bmcServiceable, 4096 * 6);    // 30% of 20 PELs
673b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.nonBMCInfo, 4096 * 3);        // 15% of 20 PELs
674b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.nonBMCServiceable, 4096 * 6); // 30% of 20 PELs
675b0a8df5bSMatt Spinler 
676b0a8df5bSMatt Spinler     // Check that at least the 4 oldest, which are the oldest of
677b0a8df5bSMatt Spinler     // each type, were removed.
678b0a8df5bSMatt Spinler     for (uint32_t i = 1; i < 5; i++)
679b0a8df5bSMatt Spinler     {
680*be952d2eSMatt Spinler         Repository::LogID logID{Repository::LogID::Pel{i}};
681*be952d2eSMatt Spinler         EXPECT_FALSE(repo.getPELAttributes(logID));
682b0a8df5bSMatt Spinler 
683b0a8df5bSMatt Spinler         // Make sure the corresponding OpenBMC event log ID which is
684b0a8df5bSMatt Spinler         // 500 + the PEL ID is in the list.
685b0a8df5bSMatt Spinler         EXPECT_TRUE(std::find(IDs.begin(), IDs.end(), 500 + i) != IDs.end());
686b0a8df5bSMatt Spinler     }
687b0a8df5bSMatt Spinler }
688b0a8df5bSMatt Spinler 
689b0a8df5bSMatt Spinler // Test that if filled completely with 1 type of PEL, that
690b0a8df5bSMatt Spinler // pruning still works properly
TEST_F(RepositoryTest,TestPruneInfoOnly)691b0a8df5bSMatt Spinler TEST_F(RepositoryTest, TestPruneInfoOnly)
692b0a8df5bSMatt Spinler {
693027bf285SSumit Kumar     std::vector<uint32_t> id;
694b0a8df5bSMatt Spinler     Repository repo{repoPath, 4096 * 22, 100};
695b0a8df5bSMatt Spinler 
696b0a8df5bSMatt Spinler     // Fill 4096*23 bytes on disk of BMC info PELs
697b0a8df5bSMatt Spinler     for (uint32_t i = 1; i <= 23; i++)
698b0a8df5bSMatt Spinler     {
699b0a8df5bSMatt Spinler         auto data = pelFactory(i, 'O', 0, 0x8800, 1000);
700b0a8df5bSMatt Spinler         auto pel = std::make_unique<PEL>(data);
701b0a8df5bSMatt Spinler         repo.add(pel);
702b0a8df5bSMatt Spinler     }
703b0a8df5bSMatt Spinler 
704b0a8df5bSMatt Spinler     const auto& sizes = repo.getSizeStats();
705b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.total, 4096 * 23);
706b0a8df5bSMatt Spinler 
707b0a8df5bSMatt Spinler     // Pruning to 15% of 4096 * 22 will leave 3 4096B PELs.
708b0a8df5bSMatt Spinler 
709b0a8df5bSMatt Spinler     // Sanity check the oldest 20 are there so when they
710b0a8df5bSMatt Spinler     // get pruned below we'll know they were removed.
711b0a8df5bSMatt Spinler     for (uint32_t i = 1; i <= 20; i++)
712b0a8df5bSMatt Spinler     {
713*be952d2eSMatt Spinler         Repository::LogID logID{Repository::LogID::Pel{i}};
714*be952d2eSMatt Spinler         EXPECT_TRUE(repo.getPELAttributes(logID));
715b0a8df5bSMatt Spinler     }
716b0a8df5bSMatt Spinler 
717027bf285SSumit Kumar     auto IDs = repo.prune(id);
718b0a8df5bSMatt Spinler 
719b0a8df5bSMatt Spinler     // Check the final sizes
720b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.total, 4096 * 3);
721b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.bmcInfo, 4096 * 3);
722b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.bmcServiceable, 0);
723b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.nonBMCInfo, 0);
724b0a8df5bSMatt Spinler     EXPECT_EQ(sizes.nonBMCServiceable, 0);
725b0a8df5bSMatt Spinler 
726b0a8df5bSMatt Spinler     EXPECT_EQ(IDs.size(), 20);
727b0a8df5bSMatt Spinler 
728b0a8df5bSMatt Spinler     // Can no longer find the oldest 20 PELs.
729b0a8df5bSMatt Spinler     for (uint32_t i = 1; i <= 20; i++)
730b0a8df5bSMatt Spinler     {
731*be952d2eSMatt Spinler         Repository::LogID logID{Repository::LogID::Pel{i}};
732*be952d2eSMatt Spinler         EXPECT_FALSE(repo.getPELAttributes(logID));
733b0a8df5bSMatt Spinler         EXPECT_TRUE(std::find(IDs.begin(), IDs.end(), 500 + i) != IDs.end());
734b0a8df5bSMatt Spinler     }
735b0a8df5bSMatt Spinler }
736b0a8df5bSMatt Spinler 
737b0a8df5bSMatt Spinler // Test that the HMC/OS/PHYP ack values affect the
738b0a8df5bSMatt Spinler // pruning order.
TEST_F(RepositoryTest,TestPruneWithAcks)739b0a8df5bSMatt Spinler TEST_F(RepositoryTest, TestPruneWithAcks)
740b0a8df5bSMatt Spinler {
741027bf285SSumit Kumar     std::vector<uint32_t> id;
742b0a8df5bSMatt Spinler     Repository repo{repoPath, 4096 * 20, 100};
743b0a8df5bSMatt Spinler 
744b0a8df5bSMatt Spinler     // Fill 30% worth of BMC non-info non-acked PELs
745b0a8df5bSMatt Spinler     for (uint32_t i = 1; i <= 6; i++)
746b0a8df5bSMatt Spinler     {
747b0a8df5bSMatt Spinler         // BMC predictive
748b0a8df5bSMatt Spinler         auto data = pelFactory(i, 'O', 0x20, 0x8800, 500);
749b0a8df5bSMatt Spinler         auto pel = std::make_unique<PEL>(data);
750b0a8df5bSMatt Spinler         repo.add(pel);
751b0a8df5bSMatt Spinler     }
752b0a8df5bSMatt Spinler 
753b0a8df5bSMatt Spinler     // Add another PEL to push it over the 30%, each time adding
754b0a8df5bSMatt Spinler     // a different type that should be pruned before the above ones
755b0a8df5bSMatt Spinler     // even though those are older.
756b0a8df5bSMatt Spinler     for (uint32_t i = 1; i <= 3; i++)
757b0a8df5bSMatt Spinler     {
758b0a8df5bSMatt Spinler         auto data = pelFactory(i, 'O', 0x20, 0x8800, 500);
759b0a8df5bSMatt Spinler         auto pel = std::make_unique<PEL>(data);
760b0a8df5bSMatt Spinler         auto idToDelete = pel->obmcLogID();
761b0a8df5bSMatt Spinler         repo.add(pel);
762b0a8df5bSMatt Spinler 
763*be952d2eSMatt Spinler         if (1 == i)
764b0a8df5bSMatt Spinler         {
765b0a8df5bSMatt Spinler             repo.setPELHMCTransState(pel->id(), TransmissionState::acked);
766b0a8df5bSMatt Spinler         }
767*be952d2eSMatt Spinler         else if (2 == i)
768b0a8df5bSMatt Spinler         {
769b0a8df5bSMatt Spinler             repo.setPELHostTransState(pel->id(), TransmissionState::acked);
770b0a8df5bSMatt Spinler         }
771b0a8df5bSMatt Spinler         else
772b0a8df5bSMatt Spinler         {
773b0a8df5bSMatt Spinler             repo.setPELHostTransState(pel->id(), TransmissionState::sent);
774b0a8df5bSMatt Spinler         }
775b0a8df5bSMatt Spinler 
776027bf285SSumit Kumar         auto IDs = repo.prune(id);
777b0a8df5bSMatt Spinler         EXPECT_EQ(repo.getSizeStats().total, 4096 * 6);
778b0a8df5bSMatt Spinler 
779b0a8df5bSMatt Spinler         // The newest PEL should be the one deleted
780b0a8df5bSMatt Spinler         ASSERT_EQ(IDs.size(), 1);
781b0a8df5bSMatt Spinler         EXPECT_EQ(IDs[0], idToDelete);
782b0a8df5bSMatt Spinler     }
783b0a8df5bSMatt Spinler }
784b0a8df5bSMatt Spinler 
785b0a8df5bSMatt Spinler // Test that the total number of PELs limit is enforced.
TEST_F(RepositoryTest,TestPruneTooManyPELs)786b0a8df5bSMatt Spinler TEST_F(RepositoryTest, TestPruneTooManyPELs)
787b0a8df5bSMatt Spinler {
788027bf285SSumit Kumar     std::vector<uint32_t> id;
789b0a8df5bSMatt Spinler     Repository repo{repoPath, 4096 * 100, 10};
790b0a8df5bSMatt Spinler 
791b0a8df5bSMatt Spinler     // Add 10, which is the limit and is still OK
792b0a8df5bSMatt Spinler     for (uint32_t i = 1; i <= 10; i++)
793b0a8df5bSMatt Spinler     {
794b0a8df5bSMatt Spinler         auto data = pelFactory(i, 'O', 0x20, 0x8800, 500);
795b0a8df5bSMatt Spinler         auto pel = std::make_unique<PEL>(data);
796b0a8df5bSMatt Spinler         repo.add(pel);
797b0a8df5bSMatt Spinler     }
798b0a8df5bSMatt Spinler 
799027bf285SSumit Kumar     auto IDs = repo.prune(id);
800b0a8df5bSMatt Spinler 
801b0a8df5bSMatt Spinler     // Nothing pruned yet
802b0a8df5bSMatt Spinler     EXPECT_TRUE(IDs.empty());
803b0a8df5bSMatt Spinler 
804b0a8df5bSMatt Spinler     // Add 1 more PEL which will be too many.
805b0a8df5bSMatt Spinler     {
806b0a8df5bSMatt Spinler         auto data = pelFactory(11, 'O', 0x20, 0x8800, 500);
807b0a8df5bSMatt Spinler         auto pel = std::make_unique<PEL>(data);
808b0a8df5bSMatt Spinler         repo.add(pel);
809b0a8df5bSMatt Spinler     }
810b0a8df5bSMatt Spinler 
811b0a8df5bSMatt Spinler     // Now that's it's over the limit of 10, it will bring it down
812b0a8df5bSMatt Spinler     // to 80%, which is 8 after it removes 3.
813027bf285SSumit Kumar     IDs = repo.prune(id);
814b0a8df5bSMatt Spinler     EXPECT_EQ(repo.getSizeStats().total, 4096 * 8);
815b0a8df5bSMatt Spinler     ASSERT_EQ(IDs.size(), 3);
816b0a8df5bSMatt Spinler 
817b0a8df5bSMatt Spinler     // Check that it deleted the oldest ones.
818b0a8df5bSMatt Spinler     // The OpenBMC log ID is the PEL ID + 500.
819b0a8df5bSMatt Spinler     EXPECT_EQ(IDs[0], 500 + 1);
820b0a8df5bSMatt Spinler     EXPECT_EQ(IDs[1], 500 + 2);
821b0a8df5bSMatt Spinler     EXPECT_EQ(IDs[2], 500 + 3);
822b0a8df5bSMatt Spinler }
8237e727a39SMatt Spinler 
8247e727a39SMatt Spinler // Test the sizeWarning function
TEST_F(RepositoryTest,TestSizeWarning)8257e727a39SMatt Spinler TEST_F(RepositoryTest, TestSizeWarning)
8267e727a39SMatt Spinler {
8277e727a39SMatt Spinler     uint32_t id = 1;
8287e727a39SMatt Spinler     Repository repo{repoPath, 100 * 4096, 500};
8297e727a39SMatt Spinler 
8307e727a39SMatt Spinler     EXPECT_FALSE(repo.sizeWarning());
8317e727a39SMatt Spinler 
8327e727a39SMatt Spinler     // 95% is still OK (disk size for these is 4096)
8337e727a39SMatt Spinler     for (uint32_t i = 1; i <= 95; i++)
8347e727a39SMatt Spinler     {
8357e727a39SMatt Spinler         auto data = pelFactory(i, 'O', 0x20, 0x8800, 500);
8367e727a39SMatt Spinler         auto pel = std::make_unique<PEL>(data);
8377e727a39SMatt Spinler         repo.add(pel);
8387e727a39SMatt Spinler     }
8397e727a39SMatt Spinler 
8407e727a39SMatt Spinler     EXPECT_FALSE(repo.sizeWarning());
8417e727a39SMatt Spinler 
8427e727a39SMatt Spinler     // Now at 96%
8436c081cc4SMatt Spinler     auto data = pelFactory(id++, 'B', 0x20, 0x8800, 500);
8447e727a39SMatt Spinler     auto pel = std::make_unique<PEL>(data);
8457e727a39SMatt Spinler     repo.add(pel);
8467e727a39SMatt Spinler 
8477e727a39SMatt Spinler     EXPECT_TRUE(repo.sizeWarning());
8487e727a39SMatt Spinler }
8497e727a39SMatt Spinler 
8507e727a39SMatt Spinler // Test sizeWarning when there are too many PEls
TEST_F(RepositoryTest,TestSizeWarningNumPELs)8517e727a39SMatt Spinler TEST_F(RepositoryTest, TestSizeWarningNumPELs)
8527e727a39SMatt Spinler {
8537e727a39SMatt Spinler     Repository repo{repoPath, 4096 * 100, 5};
8547e727a39SMatt Spinler 
8557e727a39SMatt Spinler     EXPECT_FALSE(repo.sizeWarning());
8567e727a39SMatt Spinler 
8577e727a39SMatt Spinler     for (uint32_t i = 1; i <= 5; i++)
8587e727a39SMatt Spinler     {
8597e727a39SMatt Spinler         auto data = pelFactory(i, 'O', 0x20, 0x8800, 500);
8607e727a39SMatt Spinler         auto pel = std::make_unique<PEL>(data);
8617e727a39SMatt Spinler         repo.add(pel);
8627e727a39SMatt Spinler     }
8637e727a39SMatt Spinler 
8647e727a39SMatt Spinler     EXPECT_FALSE(repo.sizeWarning());
8657e727a39SMatt Spinler 
8667e727a39SMatt Spinler     // Add 1 more for a total of 6, now over the limit
8677e727a39SMatt Spinler     {
8687e727a39SMatt Spinler         auto data = pelFactory(6, 'O', 0x20, 0x8800, 500);
8697e727a39SMatt Spinler         auto pel = std::make_unique<PEL>(data);
8707e727a39SMatt Spinler         repo.add(pel);
8717e727a39SMatt Spinler     }
8727e727a39SMatt Spinler 
8737e727a39SMatt Spinler     EXPECT_TRUE(repo.sizeWarning());
8747e727a39SMatt Spinler }
8751d8835bbSSumit Kumar 
8761d8835bbSSumit Kumar // Test existense of archive file
TEST_F(RepositoryTest,TestArchiveFile)8771d8835bbSSumit Kumar TEST_F(RepositoryTest, TestArchiveFile)
8781d8835bbSSumit Kumar {
8791d8835bbSSumit Kumar     using pelID = Repository::LogID::Pel;
8801d8835bbSSumit Kumar     using obmcID = Repository::LogID::Obmc;
8811d8835bbSSumit Kumar 
8821d8835bbSSumit Kumar     // Add and remove a PEL from the repo
8831d8835bbSSumit Kumar 
8841d8835bbSSumit Kumar     Repository repo{repoPath};
8851d8835bbSSumit Kumar 
8861d8835bbSSumit Kumar     fs::path archivePath = repoPath / "logs" / "archive";
8871d8835bbSSumit Kumar     EXPECT_TRUE(fs::exists(archivePath));
8881d8835bbSSumit Kumar 
8891d8835bbSSumit Kumar     auto data = pelDataFactory(TestPELType::pelSimple);
8901d8835bbSSumit Kumar     auto pel = std::make_unique<PEL>(data, 1);
8911d8835bbSSumit Kumar 
8921d8835bbSSumit Kumar     pel->assignID();
8931d8835bbSSumit Kumar     Repository::LogID id{pelID{pel->id()}, obmcID{pel->obmcLogID()}};
8941d8835bbSSumit Kumar 
8951d8835bbSSumit Kumar     repo.add(pel);
8961d8835bbSSumit Kumar 
8971d8835bbSSumit Kumar     auto path = repoPath / "logs" /
8981d8835bbSSumit Kumar                 Repository::getPELFilename(pel->id(), pel->commitTime());
8991d8835bbSSumit Kumar     EXPECT_TRUE(fs::exists(path));
9001d8835bbSSumit Kumar 
9011d8835bbSSumit Kumar     auto removedID = repo.remove(id);
9021d8835bbSSumit Kumar     ASSERT_TRUE(removedID);
9031d8835bbSSumit Kumar     EXPECT_EQ(*removedID, id);
9041d8835bbSSumit Kumar 
9051d8835bbSSumit Kumar     archivePath /= Repository::getPELFilename(pel->id(), pel->commitTime());
9061d8835bbSSumit Kumar     EXPECT_TRUE(fs::exists(archivePath));
9071d8835bbSSumit Kumar 
9081d8835bbSSumit Kumar     EXPECT_FALSE(repo.hasPEL(id));
9091d8835bbSSumit Kumar }
9101d8835bbSSumit Kumar 
9111d8835bbSSumit Kumar // Test archive folder size with sizeWarning function
TEST_F(RepositoryTest,TestArchiveSize)9121d8835bbSSumit Kumar TEST_F(RepositoryTest, TestArchiveSize)
9131d8835bbSSumit Kumar {
9141d8835bbSSumit Kumar     using pelID = Repository::LogID::Pel;
9151d8835bbSSumit Kumar     using obmcID = Repository::LogID::Obmc;
9161d8835bbSSumit Kumar 
9171d8835bbSSumit Kumar     // Create repo with max PEL=500 and space=4096*100
9181d8835bbSSumit Kumar     Repository repo{repoPath, 100 * 4096, 500};
9191d8835bbSSumit Kumar 
9201d8835bbSSumit Kumar     // Fill 94% (disk size for these is 4096)
9211d8835bbSSumit Kumar     for (uint32_t i = 1; i <= 94; i++)
9221d8835bbSSumit Kumar     {
9231d8835bbSSumit Kumar         auto data = pelFactory(i, 'O', 0x20, 0x8800, 500);
9241d8835bbSSumit Kumar         auto pel = std::make_unique<PEL>(data);
9251d8835bbSSumit Kumar         repo.add(pel);
9261d8835bbSSumit Kumar     }
9271d8835bbSSumit Kumar 
9281d8835bbSSumit Kumar     // Add another PEL which makes 95% still ok
9291d8835bbSSumit Kumar     auto data = pelDataFactory(TestPELType::pelSimple);
9301d8835bbSSumit Kumar     auto pel = std::make_unique<PEL>(data, 1);
9311d8835bbSSumit Kumar     pel->assignID();
9321d8835bbSSumit Kumar     Repository::LogID id{pelID{pel->id()}, obmcID{pel->obmcLogID()}};
9331d8835bbSSumit Kumar     repo.add(pel);
9341d8835bbSSumit Kumar 
9351d8835bbSSumit Kumar     // With 95% full expect no size warning
9361d8835bbSSumit Kumar     EXPECT_FALSE(repo.sizeWarning());
9371d8835bbSSumit Kumar 
9381d8835bbSSumit Kumar     // Remove last created PEL
9391d8835bbSSumit Kumar     repo.remove(id);
9401d8835bbSSumit Kumar 
9411d8835bbSSumit Kumar     // Repo is 94% full with one PEL in archive log
9421d8835bbSSumit Kumar     // Total repo size 95% full (including archive) still ok
9431d8835bbSSumit Kumar     EXPECT_FALSE(repo.sizeWarning());
9441d8835bbSSumit Kumar 
9451d8835bbSSumit Kumar     // Confirm the repo size 94% full
9461d8835bbSSumit Kumar     const auto& sizes = repo.getSizeStats();
9471d8835bbSSumit Kumar     EXPECT_EQ(sizes.total, 4096 * 94);
9481d8835bbSSumit Kumar 
9491d8835bbSSumit Kumar     // Make sure archive contain the one deleted file
9501d8835bbSSumit Kumar     fs::path archivePath = repoPath / "logs" / "archive";
9511d8835bbSSumit Kumar     archivePath /= Repository::getPELFilename(pel->id(), pel->commitTime());
9521d8835bbSSumit Kumar     EXPECT_TRUE(fs::exists(archivePath));
9531d8835bbSSumit Kumar 
9541d8835bbSSumit Kumar     // Add another PEL which makes repo 95% full
9551d8835bbSSumit Kumar     data = pelDataFactory(TestPELType::pelSimple);
9561d8835bbSSumit Kumar     pel = std::make_unique<PEL>(data, 1);
9571d8835bbSSumit Kumar     pel->assignID();
9581d8835bbSSumit Kumar     Repository::LogID idx{pelID{pel->id()}, obmcID{pel->obmcLogID()}};
9591d8835bbSSumit Kumar     repo.add(pel);
9601d8835bbSSumit Kumar 
9611d8835bbSSumit Kumar     // Repo with 95% full + one archive file becomes 96%
9621d8835bbSSumit Kumar     // which is greater than the warning
9631d8835bbSSumit Kumar     // expect archive file to be deleted to get repo size back to 95%
9641d8835bbSSumit Kumar     EXPECT_FALSE(repo.sizeWarning());
9651d8835bbSSumit Kumar     EXPECT_FALSE(fs::exists(archivePath));
9661d8835bbSSumit Kumar }
96799f3717cSRamesh Iyyar 
TEST_F(RepositoryTest,GetLogIDFoundTC)96899f3717cSRamesh Iyyar TEST_F(RepositoryTest, GetLogIDFoundTC)
96999f3717cSRamesh Iyyar {
97099f3717cSRamesh Iyyar     // Add and Check the created LogId
97199f3717cSRamesh Iyyar 
97299f3717cSRamesh Iyyar     Repository repo{repoPath};
97399f3717cSRamesh Iyyar     auto data = pelDataFactory(TestPELType::pelSimple);
97499f3717cSRamesh Iyyar     auto pel = std::make_unique<PEL>(data, 1);
97599f3717cSRamesh Iyyar 
97699f3717cSRamesh Iyyar     pel->assignID();
97799f3717cSRamesh Iyyar 
97899f3717cSRamesh Iyyar     repo.add(pel);
97999f3717cSRamesh Iyyar 
98099f3717cSRamesh Iyyar     // Getting by PEL Id
98199f3717cSRamesh Iyyar     Repository::LogID idWithPelId{Repository::LogID::Pel(pel->id())};
98299f3717cSRamesh Iyyar     auto logID = repo.getLogID(idWithPelId);
98399f3717cSRamesh Iyyar     ASSERT_TRUE(logID.has_value());
98499f3717cSRamesh Iyyar     EXPECT_EQ(logID->obmcID.id, pel->obmcLogID());
98599f3717cSRamesh Iyyar     EXPECT_EQ(logID->pelID.id, pel->id());
98699f3717cSRamesh Iyyar 
98799f3717cSRamesh Iyyar     // Getting by OBMC Event Log Id
98899f3717cSRamesh Iyyar     Repository::LogID idWithObmcLogId{
98999f3717cSRamesh Iyyar         Repository::LogID::Obmc(pel->obmcLogID())};
99099f3717cSRamesh Iyyar     logID = repo.getLogID(idWithObmcLogId);
99199f3717cSRamesh Iyyar     ASSERT_TRUE(logID.has_value());
99299f3717cSRamesh Iyyar     EXPECT_EQ(logID->obmcID.id, pel->obmcLogID());
99399f3717cSRamesh Iyyar     EXPECT_EQ(logID->pelID.id, pel->id());
99499f3717cSRamesh Iyyar }
99599f3717cSRamesh Iyyar 
TEST_F(RepositoryTest,GetLogIDNotFoundTC)99699f3717cSRamesh Iyyar TEST_F(RepositoryTest, GetLogIDNotFoundTC)
99799f3717cSRamesh Iyyar {
99899f3717cSRamesh Iyyar     // Add and Check the created LogId
99999f3717cSRamesh Iyyar 
100099f3717cSRamesh Iyyar     Repository repo{repoPath};
100199f3717cSRamesh Iyyar     auto data = pelDataFactory(TestPELType::pelSimple);
100299f3717cSRamesh Iyyar     auto pel = std::make_unique<PEL>(data, 1);
100399f3717cSRamesh Iyyar 
100499f3717cSRamesh Iyyar     pel->assignID();
100599f3717cSRamesh Iyyar 
100699f3717cSRamesh Iyyar     repo.add(pel);
100799f3717cSRamesh Iyyar 
100899f3717cSRamesh Iyyar     // Getting by invalid PEL Id
100999f3717cSRamesh Iyyar     Repository::LogID idWithPelId{Repository::LogID::Pel(0xFFFFFFFF)};
101099f3717cSRamesh Iyyar     auto logID = repo.getLogID(idWithPelId);
101199f3717cSRamesh Iyyar     ASSERT_TRUE(!logID.has_value());
101299f3717cSRamesh Iyyar 
101399f3717cSRamesh Iyyar     // Getting by invalid OBMC Event Log ID
101499f3717cSRamesh Iyyar     Repository::LogID idWithObmcLogId{Repository::LogID::Obmc(0xFFFFFFFF)};
101599f3717cSRamesh Iyyar     logID = repo.getLogID(idWithObmcLogId);
101699f3717cSRamesh Iyyar     ASSERT_TRUE(!logID.has_value());
101799f3717cSRamesh Iyyar }
1018027bf285SSumit Kumar 
1019027bf285SSumit Kumar // Test that OpenBMC log Id with hardware isolation entry is not removed.
TEST_F(RepositoryTest,TestPruneWithIdHwIsoEntry)1020027bf285SSumit Kumar TEST_F(RepositoryTest, TestPruneWithIdHwIsoEntry)
1021027bf285SSumit Kumar {
1022027bf285SSumit Kumar     std::vector<uint32_t> id{502};
1023027bf285SSumit Kumar     Repository repo{repoPath, 4096 * 100, 10};
1024027bf285SSumit Kumar 
1025027bf285SSumit Kumar     // Add 10, which is the limit and is still OK
1026027bf285SSumit Kumar     for (uint32_t i = 1; i <= 10; i++)
1027027bf285SSumit Kumar     {
1028027bf285SSumit Kumar         auto data = pelFactory(i, 'O', 0x20, 0x8800, 500);
1029027bf285SSumit Kumar         auto pel = std::make_unique<PEL>(data);
1030027bf285SSumit Kumar         repo.add(pel);
1031027bf285SSumit Kumar     }
1032027bf285SSumit Kumar 
1033027bf285SSumit Kumar     auto IDs = repo.prune(id);
1034027bf285SSumit Kumar 
1035027bf285SSumit Kumar     // Nothing pruned yet
1036027bf285SSumit Kumar     EXPECT_TRUE(IDs.empty());
1037027bf285SSumit Kumar 
1038027bf285SSumit Kumar     // Add 1 more PEL which will be too many.
1039027bf285SSumit Kumar     {
1040027bf285SSumit Kumar         auto data = pelFactory(11, 'O', 0x20, 0x8800, 500);
1041027bf285SSumit Kumar         auto pel = std::make_unique<PEL>(data);
1042027bf285SSumit Kumar         repo.add(pel);
1043027bf285SSumit Kumar     }
1044027bf285SSumit Kumar 
1045027bf285SSumit Kumar     // Now that's it's over the limit of 10, it will bring it down
1046027bf285SSumit Kumar     // to 80%, which is 8 after it removes 3.
1047027bf285SSumit Kumar     IDs = repo.prune(id);
1048027bf285SSumit Kumar     EXPECT_EQ(repo.getSizeStats().total, 4096 * 8);
1049027bf285SSumit Kumar     ASSERT_EQ(IDs.size(), 3);
1050027bf285SSumit Kumar 
1051027bf285SSumit Kumar     // Check that it deleted the oldest ones.
1052027bf285SSumit Kumar     // And the Id with hw isolation entry is NOT removed.
1053027bf285SSumit Kumar     // The OpenBMC log ID is the PEL ID + 500.
1054027bf285SSumit Kumar     EXPECT_EQ(IDs[0], 500 + 1);
1055027bf285SSumit Kumar     EXPECT_EQ(IDs[1], 500 + 3);
1056027bf285SSumit Kumar     EXPECT_EQ(IDs[2], 500 + 4);
1057027bf285SSumit Kumar }
1058