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