blob: 338dc60262963c2fc341d11bb77ebfc347bcb0ae [file] [log] [blame]
Lei YU12c9f4c2019-09-11 15:08:15 +08001#include "activation.hpp"
Lei YUff83c2a2019-09-12 13:55:18 +08002#include "mocked_utils.hpp"
Lei YU12c9f4c2019-09-11 15:08:15 +08003
4#include <sdbusplus/test/sdbus_mock.hpp>
5
6#include <gmock/gmock.h>
7#include <gtest/gtest.h>
8
9using namespace phosphor::software::updater;
10
Lei YUff83c2a2019-09-12 13:55:18 +080011using ::testing::_;
12using ::testing::Return;
13
Lei YU12c9f4c2019-09-11 15:08:15 +080014class TestActivation : public ::testing::Test
15{
16 public:
Lei YUff83c2a2019-09-12 13:55:18 +080017 using Status = Activation::Status;
18 using RequestedStatus = Activation::RequestedActivations;
19 TestActivation() :
20 mockedUtils(
21 reinterpret_cast<const utils::MockedUtils&>(utils::getUtils()))
Lei YU12c9f4c2019-09-11 15:08:15 +080022 {
23 }
24 ~TestActivation()
25 {
26 }
Lei YUff83c2a2019-09-12 13:55:18 +080027
28 void onUpdateDone()
29 {
30 activation->onUpdateDone();
31 }
32 void onUpdateFailed()
33 {
34 activation->onUpdateFailed();
35 }
36 int getProgress()
37 {
38 return activation->activationProgress->progress();
39 }
Lei YU12c9f4c2019-09-11 15:08:15 +080040 static constexpr auto dBusPath = SOFTWARE_OBJPATH;
41 sdbusplus::SdBusMock sdbusMock;
42 sdbusplus::bus::bus mockedBus = sdbusplus::get_mocked_new(&sdbusMock);
Lei YUff83c2a2019-09-12 13:55:18 +080043 const utils::MockedUtils& mockedUtils;
Lei YU12c9f4c2019-09-11 15:08:15 +080044 std::unique_ptr<Activation> activation;
45 std::string versionId = "abcdefgh";
46 std::string extVersion = "Some Ext Version";
Lei YUff83c2a2019-09-12 13:55:18 +080047 Status status = Status::Ready;
Lei YU12c9f4c2019-09-11 15:08:15 +080048 AssociationList associations;
49};
50
51TEST_F(TestActivation, ctordtor)
52{
53 activation = std::make_unique<Activation>(mockedBus, dBusPath, versionId,
54 extVersion, status, associations);
55}
56
57namespace phosphor::software::updater::internal
58{
59extern std::string getUpdateService(const std::string& psuInventoryPath,
60 const std::string& versionId);
61}
62
63TEST_F(TestActivation, getUpdateService)
64{
65 std::string psuInventoryPath = "/com/example/inventory/powersupply1";
66 std::string versionId = "12345678";
67 std::string toCompare = "psu-update@-com-example-inventory-"
68 "powersupply1\\x20-tmp-images-12345678.service";
69
70 auto service = phosphor::software::updater::internal::getUpdateService(
71 psuInventoryPath, versionId);
72 EXPECT_EQ(toCompare, service);
73}
Lei YUff83c2a2019-09-12 13:55:18 +080074
75TEST_F(TestActivation, doUpdateWhenNoPSU)
76{
77 activation = std::make_unique<Activation>(mockedBus, dBusPath, versionId,
78 extVersion, status, associations);
79 ON_CALL(mockedUtils, getPSUInventoryPath(_))
80 .WillByDefault(
81 Return(std::vector<std::string>({}))); // No PSU inventory
82 activation->requestedActivation(RequestedStatus::Active);
83
84 EXPECT_EQ(Status::Failed, activation->activation());
85}
86
87TEST_F(TestActivation, doUpdateOnePSUOK)
88{
89 constexpr auto psu0 = "/com/example/inventory/psu0";
90 activation = std::make_unique<Activation>(mockedBus, dBusPath, versionId,
91 extVersion, status, associations);
92 ON_CALL(mockedUtils, getPSUInventoryPath(_))
93 .WillByDefault(
94 Return(std::vector<std::string>({psu0}))); // One PSU inventory
95 activation->requestedActivation(RequestedStatus::Active);
96
97 EXPECT_EQ(Status::Activating, activation->activation());
98
99 onUpdateDone();
100 EXPECT_EQ(Status::Active, activation->activation());
101}
102
103TEST_F(TestActivation, doUpdateFourPSUsOK)
104{
105 constexpr auto psu0 = "/com/example/inventory/psu0";
106 constexpr auto psu1 = "/com/example/inventory/psu1";
107 constexpr auto psu2 = "/com/example/inventory/psu2";
108 constexpr auto psu3 = "/com/example/inventory/psu3";
109 activation = std::make_unique<Activation>(mockedBus, dBusPath, versionId,
110 extVersion, status, associations);
111 ON_CALL(mockedUtils, getPSUInventoryPath(_))
112 .WillByDefault(Return(
113 std::vector<std::string>({psu0, psu1, psu2, psu3}))); // 4 PSUs
114 activation->requestedActivation(RequestedStatus::Active);
115
116 EXPECT_EQ(Status::Activating, activation->activation());
117 EXPECT_EQ(10, getProgress());
118
119 onUpdateDone();
120 EXPECT_EQ(Status::Activating, activation->activation());
121 EXPECT_EQ(30, getProgress());
122
123 onUpdateDone();
124 EXPECT_EQ(Status::Activating, activation->activation());
125 EXPECT_EQ(50, getProgress());
126
127 onUpdateDone();
128 EXPECT_EQ(Status::Activating, activation->activation());
129 EXPECT_EQ(70, getProgress());
130
131 onUpdateDone();
132 EXPECT_EQ(Status::Active, activation->activation());
133}
134
135TEST_F(TestActivation, doUpdateFourPSUsFailonSecond)
136{
137 constexpr auto psu0 = "/com/example/inventory/psu0";
138 constexpr auto psu1 = "/com/example/inventory/psu1";
139 constexpr auto psu2 = "/com/example/inventory/psu2";
140 constexpr auto psu3 = "/com/example/inventory/psu3";
141 activation = std::make_unique<Activation>(mockedBus, dBusPath, versionId,
142 extVersion, status, associations);
143 ON_CALL(mockedUtils, getPSUInventoryPath(_))
144 .WillByDefault(Return(
145 std::vector<std::string>({psu0, psu1, psu2, psu3}))); // 4 PSUs
146 activation->requestedActivation(RequestedStatus::Active);
147
148 EXPECT_EQ(Status::Activating, activation->activation());
149 EXPECT_EQ(10, getProgress());
150
151 onUpdateDone();
152 EXPECT_EQ(Status::Activating, activation->activation());
153 EXPECT_EQ(30, getProgress());
154
155 onUpdateFailed();
156 EXPECT_EQ(Status::Failed, activation->activation());
157}
158
159TEST_F(TestActivation, doUpdateOnExceptionFromDbus)
160{
161 constexpr auto psu0 = "/com/example/inventory/psu0";
162 activation = std::make_unique<Activation>(mockedBus, dBusPath, versionId,
163 extVersion, status, associations);
164 ON_CALL(mockedUtils, getPSUInventoryPath(_))
165 .WillByDefault(
166 Return(std::vector<std::string>({psu0}))); // One PSU inventory
167 ON_CALL(sdbusMock, sd_bus_call(_, _, _, _, nullptr))
168 .WillByDefault(Return(-1)); // Make sdbus call failure
169 activation->requestedActivation(RequestedStatus::Active);
170
171 EXPECT_EQ(Status::Failed, activation->activation());
172}