xref: /openbmc/phosphor-bmc-code-mgmt/test/common/software/software.cpp (revision 18b5e61bcd99b658aac04c021c5cee65c0b004a6)
1 #include "../exampledevice/example_device.hpp"
2 
3 #include <phosphor-logging/lg2.hpp>
4 #include <sdbusplus/asio/connection.hpp>
5 #include <sdbusplus/asio/object_server.hpp>
6 #include <sdbusplus/async.hpp>
7 #include <sdbusplus/server.hpp>
8 
9 #include <memory>
10 #include <regex>
11 
12 #include <gtest/gtest.h>
13 
14 PHOSPHOR_LOG2_USING;
15 
16 using namespace phosphor::software;
17 using namespace phosphor::software::example_device;
18 
19 class SoftwareTest : public testing::Test
20 {
21   protected:
SoftwareTest()22     SoftwareTest() :
23         exampleUpdater(ctx, true, nullptr), device(exampleUpdater.getDevice())
24     {}
~SoftwareTest()25     ~SoftwareTest() noexcept override {}
26 
27     sdbusplus::async::context ctx;
28     ExampleCodeUpdater exampleUpdater;
29     std::unique_ptr<ExampleDevice>& device;
30 
31   public:
32     SoftwareTest(const SoftwareTest&) = delete;
33     SoftwareTest(SoftwareTest&&) = delete;
34     SoftwareTest& operator=(const SoftwareTest&) = delete;
35     SoftwareTest& operator=(SoftwareTest&&) = delete;
36 };
37 
TEST_F(SoftwareTest,TestSoftwareConstructor)38 TEST_F(SoftwareTest, TestSoftwareConstructor)
39 {
40     // the software version is currently unknown
41     EXPECT_EQ(device->softwareCurrent, nullptr);
42 
43     auto sw = std::make_unique<Software>(ctx, *device);
44 
45     // since that software is not an update, there is no progress
46     EXPECT_EQ(sw->softwareActivationProgress, nullptr);
47 }
48 
TEST_F(SoftwareTest,TestVersionPurpose)49 TEST_F(SoftwareTest, TestVersionPurpose)
50 {
51     auto sw = std::make_unique<ExampleSoftware>(ctx, *device);
52 
53     EXPECT_EQ(sw->getPurpose(), std::nullopt);
54 
55     sw->setVersion("swVersion");
56     EXPECT_EQ(sw->getPurpose(), SoftwareVersion::VersionPurpose::Unknown);
57 }
58 
TEST_F(SoftwareTest,TestSoftwareId)59 TEST_F(SoftwareTest, TestSoftwareId)
60 {
61     auto sw = std::make_unique<Software>(ctx, *device);
62 
63     std::regex re("ExampleSoftware_[0-9]+");
64     std::cmatch m;
65 
66     // design: Swid = <DeviceX>_<RandomId>
67     EXPECT_TRUE(std::regex_match(sw->swid.c_str(), m, re));
68 }
69 
TEST_F(SoftwareTest,TestSoftwareObjectPath)70 TEST_F(SoftwareTest, TestSoftwareObjectPath)
71 {
72     auto sw = std::make_unique<ExampleSoftware>(ctx, *device);
73 
74     debug("{PATH}", "PATH", sw->objectPath);
75 
76     // assert that the object path is as per the design
77     // design: /xyz/openbmc_project/Software/<SwId>
78     EXPECT_TRUE(std::string(sw->objectPath)
79                     .starts_with("/xyz/openbmc_project/software/"));
80 }
81