Skip to content

Commit 1891ddc

Browse files
cm: launcher: add unit tests for launcher
Signed-off-by: Mykola Kobets <[email protected]>
1 parent f19ff4e commit 1891ddc

File tree

8 files changed

+2647
-0
lines changed

8 files changed

+2647
-0
lines changed

tests/cm/launcher/launcher_test.cpp

Lines changed: 1573 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
/*
2+
* Copyright (C) 2025 EPAM Systems, Inc.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef AOS_CM_LAUNCHER_STUBS_IMAGEPROVIDER_HPP_
8+
#define AOS_CM_LAUNCHER_STUBS_IMAGEPROVIDER_HPP_
9+
10+
#include <aos/cm/imageprovider.hpp>
11+
12+
#include <algorithm>
13+
#include <map>
14+
#include <vector>
15+
16+
namespace aos::cm::imageprovider {
17+
18+
/**
19+
* Stub implementation of ImageProviderItf interface
20+
*/
21+
class ImageProviderStub : public ImageProviderItf {
22+
public:
23+
/**
24+
* Initializes stub object.
25+
*/
26+
void Init()
27+
{
28+
mServices.clear();
29+
mLayers.clear();
30+
mListeners.clear();
31+
mRemovedServiceQueue.clear();
32+
}
33+
34+
/**
35+
* Retrieves information about specified service.
36+
*
37+
* @param serviceID identifier of the service.
38+
* @param[out] serviceInfo service information.
39+
* @return Error.
40+
*/
41+
Error GetServiceInfo(const String& serviceID, ServiceInfo& serviceInfo) override
42+
{
43+
auto it = mServices.find(serviceID);
44+
if (it != mServices.end()) {
45+
serviceInfo = it->second;
46+
47+
return ErrorEnum::eNone;
48+
}
49+
50+
return ErrorEnum::eNotFound;
51+
}
52+
53+
/**
54+
* Retrieves metadata about an image layer.
55+
*
56+
* @param digest layer digest.
57+
* @param[out] layerInfo layer info.
58+
* @return Error.
59+
*/
60+
Error GetLayerInfo(const String& digest, LayerInfo& layerInfo) override
61+
{
62+
auto it = mLayers.find(digest);
63+
if (it != mLayers.end()) {
64+
layerInfo = it->second;
65+
66+
return ErrorEnum::eNone;
67+
}
68+
69+
return ErrorEnum::eNotFound;
70+
}
71+
72+
/**
73+
* Subscribes listener on service information updates.
74+
*
75+
* @param listener service listener.
76+
* @return Error.
77+
*/
78+
Error SubscribeListener(ServiceListenerItf& listener) override
79+
{
80+
mListeners.push_back(&listener);
81+
82+
return ErrorEnum::eNone;
83+
}
84+
85+
/**
86+
* Unsubscribes service information listener.
87+
*
88+
* @param listener service listener.
89+
* @return Error.
90+
*/
91+
Error UnsubscribeListener(ServiceListenerItf& listener) override
92+
{
93+
mListeners.erase(std::remove(mListeners.begin(), mListeners.end(), &listener), mListeners.end());
94+
95+
return ErrorEnum::eNotFound;
96+
}
97+
98+
/**
99+
* Adds a service to the test provider.
100+
*
101+
* @param serviceID service identifier.
102+
* @param serviceInfo service information.
103+
*/
104+
void AddService(const String& serviceID, const ServiceInfo& serviceInfo) { mServices[serviceID] = serviceInfo; }
105+
106+
/**
107+
* Adds a layer to the test provider.
108+
*
109+
* @param digest layer digest.
110+
* @param layerInfo layer information.
111+
*/
112+
void AddLayer(const String& digest, const LayerInfo& layerInfo) { mLayers[digest] = layerInfo; }
113+
114+
/**
115+
* Removes a service from the test provider and notifies listeners.
116+
*
117+
* @param serviceID service identifier.
118+
* @return Error.
119+
*/
120+
Error RemoveService(const String& serviceID)
121+
{
122+
auto it = mServices.find(serviceID);
123+
if (it == mServices.end()) {
124+
return ErrorEnum::eNotFound;
125+
}
126+
127+
mServices.erase(it);
128+
129+
for (auto* listener : mListeners) {
130+
listener->OnServiceRemoved(serviceID);
131+
}
132+
133+
mRemovedServiceQueue.push_back(serviceID);
134+
135+
return ErrorEnum::eNone;
136+
}
137+
138+
/**
139+
* Removes a layer from the test provider.
140+
*
141+
* @param digest layer digest.
142+
* @return Error.
143+
*/
144+
Error RemoveLayer(const String& digest)
145+
{
146+
auto it = mLayers.find(digest);
147+
if (it == mLayers.end()) {
148+
return ErrorEnum::eNotFound;
149+
}
150+
151+
mLayers.erase(it);
152+
153+
return ErrorEnum::eNone;
154+
}
155+
156+
private:
157+
std::map<StaticString<cServiceIDLen>, ServiceInfo> mServices;
158+
std::map<StaticString<cLayerDigestLen>, LayerInfo> mLayers;
159+
std::vector<ServiceListenerItf*> mListeners;
160+
std::vector<StaticString<cServiceIDLen>> mRemovedServiceQueue;
161+
};
162+
163+
} // namespace aos::cm::imageprovider
164+
165+
#endif
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
/*
2+
* Copyright (C) 2025 EPAM Systems, Inc.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef AOS_CM_LAUNCHER_STUBS_NETWORKMANAGER_HPP_
8+
#define AOS_CM_LAUNCHER_STUBS_NETWORKMANAGER_HPP_
9+
10+
#include <aos/cm/networkmanager.hpp>
11+
#include <map>
12+
#include <set>
13+
#include <sstream>
14+
#include <string>
15+
#include <vector>
16+
17+
namespace aos::cm::networkmanager {
18+
19+
/**
20+
* Stub implementation of NetworkManagerItf interface
21+
*/
22+
class NetworkManagerStub : public NetworkManagerItf {
23+
public:
24+
/**
25+
* Initializes network manager stub.
26+
*/
27+
void Init()
28+
{
29+
mCurrentIP = 0xAC110001;
30+
mSubnet = "172.17.0.0/16";
31+
}
32+
33+
/**
34+
* Prepares and assigns network parameters for a service instance.
35+
*
36+
* @param instanceIdent instance identifier.
37+
* @param networkID identifier of the target network.
38+
* @param nodeID node identifier.
39+
* @param instanceData input parameters for network setup.
40+
* @param[out] result result network parameters.
41+
* @return Error.
42+
*/
43+
Error PrepareInstanceNetworkParameters(const InstanceIdent& instanceIdent, const String& networkID,
44+
const String& nodeID, const NetworkInstanceData& instanceData, NetworkParameters& result) override
45+
{
46+
(void)nodeID;
47+
(void)instanceData;
48+
49+
mNetworkInfo[networkID.CStr()].insert(instanceIdent);
50+
51+
mCurrentIP++;
52+
53+
NetworkParameters params;
54+
55+
params.mIP = IPToString(mCurrentIP).c_str();
56+
params.mSubnet = mSubnet.c_str();
57+
params.mDNSServers.PushBack(cDNSServer);
58+
59+
result = params;
60+
61+
return ErrorEnum::eNone;
62+
}
63+
64+
/**
65+
* Removes assigned network parameters for the specified service instance.
66+
*
67+
* @param instanceIdent instance identifier.
68+
* @param nodeID node identifier.
69+
* @return Error.
70+
*/
71+
Error RemoveInstanceNetworkParameters(const InstanceIdent& instanceIdent, const String& nodeID) override
72+
{
73+
(void)nodeID;
74+
75+
for (auto& [key, network] : mNetworkInfo) {
76+
network.erase(instanceIdent);
77+
}
78+
79+
return ErrorEnum::eNone;
80+
}
81+
82+
/**
83+
* Restarts DNS server.
84+
*
85+
* @return Error.
86+
*/
87+
Error RestartDNSServer() override { return ErrorEnum::eNone; }
88+
89+
/**
90+
* Returns all service instances registered in network manager.
91+
*
92+
* @param[out] instances list of instances.
93+
* @return Error.
94+
*/
95+
Error GetInstances(Array<InstanceIdent>& instances) const override
96+
{
97+
instances.Clear();
98+
99+
for (const auto& [key, network] : mNetworkInfo) {
100+
for (const auto& instanceIdent : network) {
101+
if (auto err = instances.PushBack(instanceIdent); !err.IsNone()) {
102+
return err;
103+
}
104+
}
105+
}
106+
107+
return ErrorEnum::eNone;
108+
}
109+
110+
/**
111+
* Updates network configuration for the given providers and node.
112+
*
113+
* @param providers a list of provider ids.
114+
* @param nodeID node identifier.
115+
* @return Error.
116+
*/
117+
Error UpdateProviderNetwork(const Array<StaticString<cProviderIDLen>>& providers, const String& nodeID) override
118+
{
119+
(void)providers;
120+
(void)nodeID;
121+
122+
return ErrorEnum::eNone;
123+
}
124+
125+
private:
126+
std::map<std::string, std::set<InstanceIdent>> mNetworkInfo;
127+
uint32_t mCurrentIP;
128+
std::string mSubnet;
129+
static constexpr auto cDNSServer = "10.10.0.1";
130+
131+
std::string IPToString(uint32_t ip) const
132+
{
133+
uint8_t a = (ip >> 24) & 0xFF;
134+
uint8_t b = (ip >> 16) & 0xFF;
135+
uint8_t c = (ip >> 8) & 0xFF;
136+
uint8_t d = ip & 0xFF;
137+
138+
std::ostringstream oss;
139+
oss << static_cast<int>(a) << '.' << static_cast<int>(b) << '.' << static_cast<int>(c) << '.'
140+
<< static_cast<int>(d);
141+
142+
return oss.str();
143+
}
144+
};
145+
146+
} // namespace aos::cm::networkmanager
147+
148+
#endif

0 commit comments

Comments
 (0)