Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions score/mw/com/api_surface.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,16 @@
"signature": "InitializeRuntime : void (const RuntimeConfiguration &)"
},
{
"name": "InitializeRuntimeAddonConfiguration",
"qualified_name": "score::mw::com::runtime::InitializeRuntimeAddonConfiguration",
"name": "AddConfiguration",
"qualified_name": "score::mw::com::runtime::AddConfiguration",
"kind": "function",
"signature": "InitializeRuntimeAddonConfiguration : Result<void> (const RuntimeConfiguration &)"
"signature": "AddConfiguration : Result<void> (const RuntimeConfiguration &)"
},
{
"name": "InitializeRuntimeAddonConfiguration",
"qualified_name": "score::mw::com::runtime::InitializeRuntimeAddonConfiguration",
"name": "AddConfiguration",
"qualified_name": "score::mw::com::runtime::AddConfiguration",
"kind": "function",
"signature": "InitializeRuntimeAddonConfiguration : Result<void> (score::json::Any)"
"signature": "AddConfiguration : Result<void> (score::json::Any)"
},
{
"name": "RuntimeConfiguration",
Expand Down
6 changes: 3 additions & 3 deletions score/mw/com/doc/user_facing_API_examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ This document contains examples of each mw::com user facing API.
| [`RuntimeConfiguration(argc, argv)`](#example-3-using-runtimeconfiguration-for-configuration-management) |
| [`RuntimeConfiguration(Path)`](#example-3-using-runtimeconfiguration-for-configuration-management) |
| [`RuntimeConfiguration::GetConfigurationPath()`](#example-3-using-runtimeconfiguration-for-configuration-management) |
| [`RuntimeConfiguration::InitializeRuntimeAddonConfiguration()`](#example-4-using-initializeruntimeaddonconfiguration-to-load-additional-mwcom-configurations) |
| [`RuntimeConfiguration::AddConfiguration()`](#example-4-using-AddConfiguration-to-load-additional-mwcom-configurations) |
| **Data Types** |
| [`InstanceIdentifier::Create()`](#example-1-using-instanceidentifier-for-service-instance-management) |
| [`InstanceIdentifier::ToString()`](#example-1-using-instanceidentifier-for-service-instance-management) |
Expand Down Expand Up @@ -276,9 +276,9 @@ const auto& config_path = default_config.GetConfigurationPath();
---


### Example 4: Using `InitializeRuntimeAddonConfiguration` to load additional `mw::com` configurations
### Example 4: Using `AddConfiguration` to load additional `mw::com` configurations

`Runtime` provides the APIs `InitializeRuntimeAddonConfiguration(RuntimeConfiguration&)` and `InitializeRuntimeAddonConfiguration(score::json::Any)`
`Runtime` provides the APIs `AddConfiguration(RuntimeConfiguration&)` and `AddConfiguration(score::json::Any)`
to load additional configurations. For example, this can be used by libraries that also rely on mw::com to load their
configuration in addition to the application's configuration. It is assumed that prior to that call a complete mw::com configuration has been
loaded via `InitializeRuntime()`. If not this call will cause an application termination.
Expand Down
4 changes: 2 additions & 2 deletions score/mw/com/impl/runtime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,14 +133,14 @@ void Runtime::Initialize(const runtime::RuntimeConfiguration& runtime_configurat
score::cpp::ignore = initialization_config_.emplace(std::move(config));
}

Result<void> Runtime::InitializeRuntimeAddonConfiguration(const runtime::RuntimeConfiguration& runtime_configuration)
Result<void> Runtime::AddConfiguration(const runtime::RuntimeConfiguration& runtime_configuration)
{
auto config = configuration::Parse(runtime_configuration.GetConfigurationPath().Native());

return HandleAddonConfiguration(config);
}

Result<void> Runtime::InitializeRuntimeAddonConfiguration(score::json::Any json)
Result<void> Runtime::AddConfiguration(score::json::Any json)
{
auto config = configuration::Parse(std::move(json));

Expand Down
4 changes: 2 additions & 2 deletions score/mw/com/impl/runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,15 +82,15 @@ class Runtime final : public IRuntime
/// \attention This function will call std::terminate() in case no initial configuration has been loaded yet, or
/// that the configuration is incompatible to the previously loaded one.
/// \param runtime_configuration object containing service definitions which should be added to existing set
static Result<void> InitializeRuntimeAddonConfiguration(const runtime::RuntimeConfiguration& runtime_configuration);
static Result<void> AddConfiguration(const runtime::RuntimeConfiguration& runtime_configuration);

/// \brief Extends mw::com subsystem with the given add-on configuration provided as a JSON object.
/// \details This call is optional and shall allow loading additional mw::com configuration as an in-memory JSON
/// object in order to extend already loaded configurations.
/// \attention This function will call std::terminate() in case no initial configuration has been loaded yet, or
/// that the configuration is incompatible to the previously loaded one.
/// \param json object containing service definitions which should be added to existing set
static Result<void> InitializeRuntimeAddonConfiguration(score::json::Any json);
static Result<void> AddConfiguration(score::json::Any json);

/// \brief get singleton.
/// \details Might return either reference to a real Runtime instance or to a mock.
Expand Down
19 changes: 8 additions & 11 deletions score/mw/com/impl/runtime_single_exec_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,9 +271,8 @@ TEST_F(RuntimeInitializationTest, ConfigurationGetsMergedAndLoadedIfInitialConfi
const auto configuration = runtime::RuntimeConfiguration{config_with_tire_pressure_port_other_};
Runtime::Initialize(configuration);

// When loading an add-on configuration with InitializeRuntimeAddonConfiguration
const auto addon_init_result =
Runtime::InitializeRuntimeAddonConfiguration(runtime::RuntimeConfiguration{config_to_merge_});
// When loading an add-on configuration with AddConfiguration
const auto addon_init_result = Runtime::AddConfiguration(runtime::RuntimeConfiguration{config_to_merge_});

auto& updated_runtime = static_cast<Runtime&>(Runtime::getInstance());

Expand All @@ -297,13 +296,11 @@ TEST_F(RuntimeInitializationTest, ConcurrentAddonConfigurationInitializationSucc
std::optional<Result<void>> result_thread_2{};

std::thread thread_1{[&result_thread_1, this]() {
result_thread_1 =
Runtime::InitializeRuntimeAddonConfiguration(runtime::RuntimeConfiguration{config_to_merge_});
result_thread_1 = Runtime::AddConfiguration(runtime::RuntimeConfiguration{config_to_merge_});
}};

std::thread thread_2{[&result_thread_2, this]() {
result_thread_2 =
Runtime::InitializeRuntimeAddonConfiguration(runtime::RuntimeConfiguration{config_to_merge_second_});
result_thread_2 = Runtime::AddConfiguration(runtime::RuntimeConfiguration{config_to_merge_second_});
}};

thread_1.join();
Expand Down Expand Up @@ -333,8 +330,8 @@ TEST_F(RuntimeInitializationDeathTest, InitializationFailsIfNoAppConfigurationHa
{
// Given no configuration has been loaded
const auto runtime_configuration = runtime::RuntimeConfiguration{config_with_tire_pressure_port_};
// When loading an add-on configuration via InitializeRuntimeAddonConfiguration()
std::ignore = Runtime::InitializeRuntimeAddonConfiguration(runtime_configuration);
// When loading an add-on configuration via AddConfiguration()
std::ignore = Runtime::AddConfiguration(runtime_configuration);
// Then the process terminates via std::terminate()
},
".*");
Expand All @@ -351,9 +348,9 @@ TEST_F(RuntimeInitializationDeathTest, AddOnConfigurationInitializationFailsIfMe
const auto runtime_configuration = runtime::RuntimeConfiguration{config_with_tire_pressure_port_};
Runtime::Initialize(runtime_configuration);
std::ignore = static_cast<Runtime&>(Runtime::getInstance());
// When loading the same configuration via InitializeRuntimeAddonConfiguration()
// When loading the same configuration via AddConfiguration()
const auto add_on_configuration = runtime::RuntimeConfiguration{config_with_tire_pressure_port_};
std::ignore = Runtime::InitializeRuntimeAddonConfiguration(add_on_configuration);
std::ignore = Runtime::AddConfiguration(add_on_configuration);
// Then the process terminates via std::terminate() because there is a clash of service identifiers
},
".*");
Expand Down
8 changes: 4 additions & 4 deletions score/mw/com/runtime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,14 +86,14 @@ void InitializeRuntime(const RuntimeConfiguration& runtime_configuration)
impl::Runtime::Initialize(runtime_configuration);
}

Result<void> InitializeRuntimeAddonConfiguration(const RuntimeConfiguration& runtime_configuration)
Result<void> AddConfiguration(const RuntimeConfiguration& runtime_configuration)
{
return impl::Runtime::InitializeRuntimeAddonConfiguration(runtime_configuration);
return impl::Runtime::AddConfiguration(runtime_configuration);
}

Result<void> InitializeRuntimeAddonConfiguration(score::json::Any json)
Result<void> AddConfiguration(score::json::Any json)
{
return impl::Runtime::InitializeRuntimeAddonConfiguration(std::move(json));
return impl::Runtime::AddConfiguration(std::move(json));
}

} // namespace score::mw::com::runtime
4 changes: 2 additions & 2 deletions score/mw/com/runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ void InitializeRuntime(const RuntimeConfiguration& runtime_configuration);
* \attention This function will call std::terminate() in case that the configuration is incompatible to the previously
* loaded one or if no complete mw::com configuration has been loaded previously.
**/
Result<void> InitializeRuntimeAddonConfiguration(const RuntimeConfiguration& runtime_configuration);
Result<void> AddConfiguration(const RuntimeConfiguration& runtime_configuration);

/**
* \api
Expand All @@ -137,7 +137,7 @@ Result<void> InitializeRuntimeAddonConfiguration(const RuntimeConfiguration& run
* loaded one or if no complete mw::com configuration has been loaded previously.
* \param json The JSON object containing the add-on configuration.
**/
Result<void> InitializeRuntimeAddonConfiguration(score::json::Any json);
Result<void> AddConfiguration(score::json::Any json);

} // namespace score::mw::com::runtime

Expand Down
157 changes: 157 additions & 0 deletions score/mw/com/test/loading_add_on_configuration/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
# *******************************************************************************
# Copyright (c) 2026 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
#
# This program and the accompanying materials are made available under the
# terms of the Apache License Version 2.0 which is available at
# https://www.apache.org/licenses/LICENSE-2.0
#
# SPDX-License-Identifier: Apache-2.0
# *******************************************************************************

load("@rules_cc//cc:defs.bzl", "cc_binary")
load("@score_baselibs//score/language/safecpp:toolchain_features.bzl", "COMPILER_WARNING_FEATURES")
load("//score/mw/com/test:pkg_application.bzl", "pkg_application")

exports_files(
["config/logging.json"],
visibility = ["//score/mw/com/test:__subpackages__"],
)

cc_library(
name = "common_resources",
srcs = ["common_resources.cpp"],
hdrs = ["common_resources.h"],
features = COMPILER_WARNING_FEATURES,
deps = [
"//score/mw/com/test/common_test_resources:command_line_parser",
"//score/mw/com/test/common_test_resources:fail_test",
],
)

cc_library(
name = "test_constants",
srcs = ["test_constants.cpp"],
hdrs = ["test_constants.h"],
features = COMPILER_WARNING_FEATURES,
deps = [
"//score/mw/com",
"//score/mw/com/test/loading_add_on_configuration/types:addon_interface",
],
)

cc_library(
name = "consumer_impl",
srcs = ["consumer.cpp"],
hdrs = ["consumer.h"],
features = COMPILER_WARNING_FEATURES,
deps = [
":common_resources",
":test_constants",
"//score/mw/com",
"//score/mw/com/test/common_test_resources:fail_test",
"//score/mw/com/test/common_test_resources:process_synchronizer",
"//score/mw/com/test/common_test_resources:proxy_container",
"//score/mw/com/test/common_test_resources:proxy_event_receiver",
"//score/mw/com/test/common_test_resources:proxy_event_state_change_notifier",
"//score/mw/com/test/loading_add_on_configuration/types:addon_interface",
"//score/mw/com/test/loading_add_on_configuration/types:example_interface",
],
)

cc_library(
name = "provider_impl",
srcs = ["provider.cpp"],
hdrs = ["provider.h"],
features = COMPILER_WARNING_FEATURES,
deps = [
":common_resources",
":test_constants",
"//score/mw/com",
"//score/mw/com/test/common_test_resources:fail_test",
"//score/mw/com/test/common_test_resources:process_synchronizer",
"//score/mw/com/test/common_test_resources:skeleton_container",
"//score/mw/com/test/loading_add_on_configuration/types:addon_interface",
"//score/mw/com/test/loading_add_on_configuration/types:example_interface",
],
)

cc_binary(
name = "consumer",
srcs = ["main_consumer.cpp"],
data = [
"config/mw_com_add_on_config.json",
"config/mw_com_config.json",
"config/mw_com_invalid_add_on_config.json",
],
features = COMPILER_WARNING_FEATURES + [
"aborts_upon_exception",
],
visibility = ["//score/mw/com/test/loading_add_on_configuration:__pkg__"],
deps = [
":common_resources",
":consumer_impl",
"//score/mw/com",
"//score/mw/com/test/common_test_resources:fail_test",
"//score/mw/com/test/common_test_resources:process_synchronizer",
"//score/mw/com/test/common_test_resources:stop_token_sig_term_handler",
"@score_baselibs//score/mw/log",
],
)

cc_binary(
name = "provider",
srcs = ["main_provider.cpp"],
data = [
"config/mw_com_add_on_config.json",
"config/mw_com_config.json",
"config/mw_com_invalid_add_on_config.json",
],
features = COMPILER_WARNING_FEATURES + [
"aborts_upon_exception",
],
visibility = ["//score/mw/com/test/loading_add_on_configuration:__pkg__"],
deps = [
":common_resources",
":provider_impl",
"//score/mw/com",
"//score/mw/com/test/common_test_resources:fail_test",
"//score/mw/com/test/common_test_resources:process_synchronizer",
"//score/mw/com/test/common_test_resources:stop_token_sig_term_handler",
"@score_baselibs//score/mw/log",
],
)

pkg_application(
name = "consumer-pkg",
app_name = "consumer",
bin = [":consumer"],
etc = [
"config/logging.json",
"config/mw_com_config.json",
"config/mw_com_add_on_config.json",
"config/mw_com_invalid_add_on_config.json",
],
visibility = [
"//platform/aas/test/mw/com:__pkg__",
"//score/mw/com/test/loading_add_on_configuration:__subpackages__",
],
)

pkg_application(
name = "provider-pkg",
app_name = "provider",
bin = [":provider"],
etc = [
"config/logging.json",
"config/mw_com_config.json",
"config/mw_com_invalid_add_on_config.json",
"config/mw_com_add_on_config.json",
],
visibility = [
"//platform/aas/test/mw/com:__pkg__",
"//score/mw/com/test/loading_add_on_configuration:__subpackages__",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/********************************************************************************
* Copyright (c) 2026 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Apache License Version 2.0 which is available at
* https://www.apache.org/licenses/LICENSE-2.0
*
* SPDX-License-Identifier: Apache-2.0
********************************************************************************/
#include "score/mw/com/test/loading_add_on_configuration/common_resources.h"

#include "score/mw/com/test/common_test_resources/command_line_parser.h"

namespace score::mw::com::test
{

TestConfig ParseConfig(int argc, const char** argv)
{
constexpr auto kServiceInstanceManifestArg = "service-instance-manifest";

const std::vector<std::pair<std::string, std::string>> parameter_description_pairs{
{kServiceInstanceManifestArg, "Path to the service instance manifest"},
};

const auto args = ParseCommandLineArguments(argc, argv, parameter_description_pairs);

const auto manifest_result = GetValueIfProvided<std::string>(args, kServiceInstanceManifestArg);
if (!manifest_result.has_value())
{
FailTest("Missing or invalid --", kServiceInstanceManifestArg, " argument");
}

return TestConfig{manifest_result.value()};
}

} // namespace score::mw::com::test
Loading
Loading