1*a3c33e77SMatt Spinler /** 2*a3c33e77SMatt Spinler * Copyright © 2018 IBM Corporation 3*a3c33e77SMatt Spinler * 4*a3c33e77SMatt Spinler * Licensed under the Apache License, Version 2.0 (the "License"); 5*a3c33e77SMatt Spinler * you may not use this file except in compliance with the License. 6*a3c33e77SMatt Spinler * You may obtain a copy of the License at 7*a3c33e77SMatt Spinler * 8*a3c33e77SMatt Spinler * http://www.apache.org/licenses/LICENSE-2.0 9*a3c33e77SMatt Spinler * 10*a3c33e77SMatt Spinler * Unless required by applicable law or agreed to in writing, software 11*a3c33e77SMatt Spinler * distributed under the License is distributed on an "AS IS" BASIS, 12*a3c33e77SMatt Spinler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*a3c33e77SMatt Spinler * See the License for the specific language governing permissions and 14*a3c33e77SMatt Spinler * limitations under the License. 15*a3c33e77SMatt Spinler */ 16*a3c33e77SMatt Spinler #include <fstream> 17*a3c33e77SMatt Spinler #include <gtest/gtest.h> 18*a3c33e77SMatt Spinler #include <experimental/filesystem> 19*a3c33e77SMatt Spinler #include "callout.hpp" 20*a3c33e77SMatt Spinler #include "dbus.hpp" 21*a3c33e77SMatt Spinler 22*a3c33e77SMatt Spinler using namespace ibm::logging; 23*a3c33e77SMatt Spinler 24*a3c33e77SMatt Spinler class CalloutTest : public ::testing::Test 25*a3c33e77SMatt Spinler { 26*a3c33e77SMatt Spinler protected: 27*a3c33e77SMatt Spinler virtual void SetUp() 28*a3c33e77SMatt Spinler { 29*a3c33e77SMatt Spinler char dir[] = {"./calloutsXXXXXX"}; 30*a3c33e77SMatt Spinler 31*a3c33e77SMatt Spinler persistDir = mkdtemp(dir); 32*a3c33e77SMatt Spinler } 33*a3c33e77SMatt Spinler 34*a3c33e77SMatt Spinler virtual void TearDown() 35*a3c33e77SMatt Spinler { 36*a3c33e77SMatt Spinler fs::remove_all(persistDir); 37*a3c33e77SMatt Spinler } 38*a3c33e77SMatt Spinler 39*a3c33e77SMatt Spinler fs::path persistDir; 40*a3c33e77SMatt Spinler }; 41*a3c33e77SMatt Spinler 42*a3c33e77SMatt Spinler TEST_F(CalloutTest, TestPersist) 43*a3c33e77SMatt Spinler { 44*a3c33e77SMatt Spinler using namespace std::literals::string_literals; 45*a3c33e77SMatt Spinler 46*a3c33e77SMatt Spinler auto bus = sdbusplus::bus::new_default(); 47*a3c33e77SMatt Spinler std::string objectPath{"/callout/path/0"}; 48*a3c33e77SMatt Spinler std::string calloutPath{"/some/inventory/object"}; 49*a3c33e77SMatt Spinler size_t id = 0; 50*a3c33e77SMatt Spinler uint64_t ts = 5; 51*a3c33e77SMatt Spinler 52*a3c33e77SMatt Spinler DbusPropertyMap assetProps{{"BuildDate"s, Value{"Date42"s}}, 53*a3c33e77SMatt Spinler {"Manufacturer"s, Value{"Mfg42"s}}, 54*a3c33e77SMatt Spinler {"Model"s, Value{"Model42"s}}, 55*a3c33e77SMatt Spinler {"PartNumber"s, Value{"PN42"s}}, 56*a3c33e77SMatt Spinler {"SerialNumber"s, Value{"SN42"s}}}; 57*a3c33e77SMatt Spinler { 58*a3c33e77SMatt Spinler auto callout = std::make_unique<Callout>(bus, objectPath, calloutPath, 59*a3c33e77SMatt Spinler id, ts, assetProps); 60*a3c33e77SMatt Spinler callout->serialize(persistDir); 61*a3c33e77SMatt Spinler 62*a3c33e77SMatt Spinler ASSERT_EQ(fs::exists(persistDir / std::to_string(id)), true); 63*a3c33e77SMatt Spinler } 64*a3c33e77SMatt Spinler 65*a3c33e77SMatt Spinler // Test object restoration 66*a3c33e77SMatt Spinler { 67*a3c33e77SMatt Spinler auto callout = std::make_unique<Callout>(bus, objectPath, id, ts); 68*a3c33e77SMatt Spinler 69*a3c33e77SMatt Spinler ASSERT_EQ(callout->deserialize(persistDir), true); 70*a3c33e77SMatt Spinler 71*a3c33e77SMatt Spinler ASSERT_EQ(callout->id(), id); 72*a3c33e77SMatt Spinler ASSERT_EQ(callout->ts(), ts); 73*a3c33e77SMatt Spinler ASSERT_EQ(callout->path(), calloutPath); 74*a3c33e77SMatt Spinler ASSERT_EQ(callout->buildDate(), 75*a3c33e77SMatt Spinler assetProps["BuildDate"].get<std::string>()); 76*a3c33e77SMatt Spinler ASSERT_EQ(callout->manufacturer(), 77*a3c33e77SMatt Spinler assetProps["Manufacturer"].get<std::string>()); 78*a3c33e77SMatt Spinler ASSERT_EQ(callout->model(), assetProps["Model"].get<std::string>()); 79*a3c33e77SMatt Spinler ASSERT_EQ(callout->partNumber(), 80*a3c33e77SMatt Spinler assetProps["PartNumber"].get<std::string>()); 81*a3c33e77SMatt Spinler ASSERT_EQ(callout->serialNumber(), 82*a3c33e77SMatt Spinler assetProps["SerialNumber"].get<std::string>()); 83*a3c33e77SMatt Spinler } 84*a3c33e77SMatt Spinler 85*a3c33e77SMatt Spinler // Test a serialization failure due to a bad timestamp 86*a3c33e77SMatt Spinler { 87*a3c33e77SMatt Spinler auto callout = std::make_unique<Callout>(bus, objectPath, id, ts + 1); 88*a3c33e77SMatt Spinler 89*a3c33e77SMatt Spinler ASSERT_EQ(callout->deserialize(persistDir), false); 90*a3c33e77SMatt Spinler ASSERT_EQ(fs::exists(persistDir / std::to_string(id)), false); 91*a3c33e77SMatt Spinler } 92*a3c33e77SMatt Spinler } 93