| /** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "core/flow/AdaptiveConfiguration.h" |
| #include "unit/Catch.h" |
| #include "unit/ConfigurationTestController.h" |
| #include "unit/TestBase.h" |
| #include "unit/TestUtils.h" |
| |
| using namespace std::literals::chrono_literals; |
| |
| TEST_CASE("Required property without Properties Entry (adaptive yaml)") { |
| const ConfigurationTestController controller; |
| core::flow::AdaptiveConfiguration config{controller.getContext()}; |
| const auto config_yaml = R"( |
| MiNiFi Config Version: 3 |
| Flow Controller: |
| name: MiNiFi Flow |
| Processors: |
| - name: My processor |
| id: 00000000-0000-0000-0000-000000000001 |
| class: PropertyTester |
| Connections: [ ] |
| Remote Process Groups: [ ] |
| )"; |
| REQUIRE_THROWS(config.getRootFromPayload(config_yaml)); |
| REQUIRE(minifi::test::utils::verifyLogLinePresenceInPollTime(100ms, |
| "[error] Error while processing configuration file: Unable to parse configuration file for component named 'My processor' because required " |
| "property 'RequiredPropertyWithoutDefaultValue' is not set")); |
| } |
| |
| TEST_CASE("Required property without Properties Entry (adaptive json)") { |
| const ConfigurationTestController controller; |
| core::flow::AdaptiveConfiguration config{controller.getContext()}; |
| const auto config_json = R"( |
| { |
| "Flow Controller": {"name": "root"}, |
| "Processors": [ |
| { |
| "id": "00000000-0000-0000-0000-000000000001", |
| "class": "PropertyTester", |
| "name": "My processor" |
| } |
| ], |
| "Connections": [] |
| } |
| )"; |
| REQUIRE_THROWS(config.getRootFromPayload(config_json)); |
| REQUIRE(minifi::test::utils::verifyLogLinePresenceInPollTime(100ms, |
| "[error] Error while processing configuration file: Unable to parse configuration file for component named 'My processor' because required " |
| "property 'RequiredPropertyWithoutDefaultValue' is not set")); |
| } |
| |
| TEST_CASE("Explicitly unsetting required property (adaptive yaml)") { |
| const ConfigurationTestController controller; |
| core::flow::AdaptiveConfiguration config{controller.getContext()}; |
| const auto config_yaml = R"( |
| MiNiFi Config Version: 3 |
| Flow Controller: |
| name: MiNiFi Flow |
| Processors: |
| - name: My processor |
| id: 00000000-0000-0000-0000-000000000001 |
| class: PropertyTester |
| Properties: |
| RequiredPropertyWithDefaultValue: ~ |
| Connections: [ ] |
| Remote Process Groups: [ ] |
| )"; |
| REQUIRE_THROWS(config.getRootFromPayload(config_yaml)); |
| REQUIRE(minifi::test::utils::verifyLogLinePresenceInPollTime(100ms, |
| "[error] Error while processing configuration file: Unable to parse configuration file for component named 'My processor' because Can't " |
| "explicitly unset required property")); |
| } |
| |
| TEST_CASE("Explicitly unsetting required property (adaptive json)") { |
| const ConfigurationTestController controller; |
| core::flow::AdaptiveConfiguration config{controller.getContext()}; |
| const auto config_json = R"( |
| { |
| "Flow Controller": {"name": "root"}, |
| "Processors": [ |
| { |
| "id": "00000000-0000-0000-0000-000000000001", |
| "class": "PropertyTester", |
| "name": "My processor", |
| "Properties": { |
| "RequiredPropertyWithDefaultValue": null, |
| } |
| } |
| ], |
| "Connections": [] |
| })"; |
| REQUIRE_THROWS(config.getRootFromPayload(config_json)); |
| REQUIRE(minifi::test::utils::verifyLogLinePresenceInPollTime(100ms, |
| "[error] Error while processing configuration file: Unable to parse configuration file for component named 'My processor' because Can't " |
| "explicitly unset required property")); |
| } |
| |
| TEST_CASE("Omitting optional property (adaptive yaml)") { |
| const ConfigurationTestController controller; |
| core::flow::AdaptiveConfiguration config{controller.getContext()}; |
| const auto config_yaml = R"( |
| MiNiFi Config Version: 3 |
| Flow Controller: |
| name: MiNiFi Flow |
| Processors: |
| - name: My processor |
| id: 00000000-0000-0000-0000-000000000001 |
| class: PropertyTester |
| Properties: |
| RequiredPropertyWithoutDefaultValue: 'bar' |
| Connections: [ ] |
| Remote Process Groups: [ ] |
| )"; |
| const auto root = config.getRootFromPayload(config_yaml); |
| REQUIRE(root); |
| const auto my_proc = root->findProcessorByName("My processor"); |
| REQUIRE(my_proc); |
| const auto opt_val = my_proc->getProperty("OptionalPropertyWithDefaultValue"); |
| CHECK(opt_val == "default_val"); |
| } |
| |
| TEST_CASE("Omitting optional property (adaptive json)") { |
| const ConfigurationTestController controller; |
| core::flow::AdaptiveConfiguration config{controller.getContext()}; |
| const auto config_json = R"( |
| { |
| "Flow Controller": {"name": "root"}, |
| "Processors": [ |
| { |
| "id": "00000000-0000-0000-0000-000000000001", |
| "class": "PropertyTester", |
| "name": "My processor", |
| "Properties": { |
| "RequiredPropertyWithoutDefaultValue": "foo" |
| } |
| } |
| ], |
| "Connections": [] |
| })"; |
| const auto root = config.getRootFromPayload(config_json); |
| REQUIRE(root); |
| const auto my_proc = root->findProcessorByName("My processor"); |
| REQUIRE(my_proc); |
| const auto opt_val = my_proc->getProperty("OptionalPropertyWithDefaultValue"); |
| CHECK(opt_val == "default_val"); |
| } |
| |
| TEST_CASE("Explicitly unsetting optional property (adaptive yaml)") { |
| const ConfigurationTestController controller; |
| core::flow::AdaptiveConfiguration config{controller.getContext()}; |
| const auto config_yaml = R"( |
| MiNiFi Config Version: 3 |
| Flow Controller: |
| name: MiNiFi Flow |
| Processors: |
| - name: My processor |
| id: 00000000-0000-0000-0000-000000000001 |
| class: PropertyTester |
| Properties: |
| OptionalPropertyWithDefaultValue: ~ |
| RequiredPropertyWithoutDefaultValue: 'foo' |
| Connections: [ ] |
| Remote Process Groups: [ ] |
| )"; |
| const auto root = config.getRootFromPayload(config_yaml); |
| REQUIRE(root); |
| const auto my_proc = root->findProcessorByName("My processor"); |
| REQUIRE(my_proc); |
| const auto opt_val = my_proc->getProperty("OptionalPropertyWithDefaultValue"); |
| CHECK(!opt_val); |
| CHECK(!my_proc->getProperty("OptionalPropertyWithoutDefaultValue")); |
| CHECK(my_proc->getProperty("RequiredPropertyWithDefaultValue") == "default_val"); |
| CHECK(my_proc->getProperty("RequiredPropertyWithoutDefaultValue") == "foo"); |
| } |
| |
| TEST_CASE("Explicitly unsetting optional property (adaptive json)") { |
| const ConfigurationTestController controller; |
| core::flow::AdaptiveConfiguration config{controller.getContext()}; |
| const auto config_json = R"( |
| { |
| "Flow Controller": {"name": "root"}, |
| "Processors": [ |
| { |
| "id": "00000000-0000-0000-0000-000000000001", |
| "class": "PropertyTester", |
| "name": "My processor", |
| "Properties": { |
| "OptionalPropertyWithDefaultValue": null, |
| "RequiredPropertyWithoutDefaultValue": "foo" |
| } |
| } |
| ], |
| "Connections": [] |
| })"; |
| const auto root = config.getRootFromPayload(config_json); |
| REQUIRE(root); |
| const auto my_proc = root->findProcessorByName("My processor"); |
| REQUIRE(my_proc); |
| const auto opt_val = my_proc->getProperty("OptionalPropertyWithDefaultValue"); |
| CHECK(!opt_val); |
| CHECK(!my_proc->getProperty("OptionalPropertyWithoutDefaultValue")); |
| CHECK(my_proc->getProperty("RequiredPropertyWithDefaultValue") == "default_val"); |
| CHECK(my_proc->getProperty("RequiredPropertyWithoutDefaultValue") == "foo"); |
| } |