]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#3446] added unittests
authorRazvan Becheriu <razvan@isc.org>
Thu, 11 Jul 2024 17:17:26 +0000 (20:17 +0300)
committerRazvan Becheriu <razvan@isc.org>
Tue, 16 Jul 2024 12:43:21 +0000 (12:43 +0000)
src/bin/dhcp4/dhcp4_srv.cc
src/bin/dhcp6/dhcp6_srv.cc
src/hooks/dhcp/high_availability/libloadtests/close_unittests.cc
src/hooks/dhcp/high_availability/tests/ha_impl_unittest.cc
src/hooks/dhcp/high_availability/tests/ha_test.cc
src/lib/dhcpsrv/network_state.cc
src/lib/dhcpsrv/network_state.h
src/lib/dhcpsrv/tests/network_state_unittest.cc

index 3b3c9de81eac9594b315bbf8e8d47acdd5398689..41492ce155708199021f5c408e9db171767b279d 100644 (file)
@@ -624,7 +624,7 @@ Dhcpv4Srv::Dhcpv4Srv(uint16_t server_port, uint16_t client_port,
     : io_service_(new IOService()), server_port_(server_port),
       client_port_(client_port), shutdown_(true),
       alloc_engine_(), use_bcast_(use_bcast),
-      network_state_(new NetworkState(NetworkState::DHCPv4)),
+      network_state_(new NetworkState()),
       cb_control_(new CBControlDHCPv4()),
       test_send_responses_to_source_(false) {
 
index aca7ac1f16c0fed573e8416e0e3c7b5bba23c281..381536ed21c5b2566607fec7e545e46263df8a69 100644 (file)
@@ -218,7 +218,7 @@ Dhcpv6Srv::Dhcpv6Srv(uint16_t server_port, uint16_t client_port)
     : io_service_(new IOService()), server_port_(server_port),
       client_port_(client_port), serverid_(), shutdown_(true),
       alloc_engine_(), name_change_reqs_(),
-      network_state_(new NetworkState(NetworkState::DHCPv6)),
+      network_state_(new NetworkState()),
       cb_control_(new CBControlDHCPv6()) {
     LOG_DEBUG(dhcp6_logger, DBG_DHCP6_START, DHCP6_OPEN_SOCKET)
         .arg(server_port);
index b1b148cc808f539d0c3a1cab2ca7cdab2fa759be..422e063696797ea75752e2494d02a9c0064c2de4 100644 (file)
@@ -355,7 +355,7 @@ TEST_F(CloseHATest, close4) {
 
     // Prepare objects.
     IOServicePtr io_service(new IOService());
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     Pkt4Ptr query(new Pkt4(DHCPREQUEST, 12345));
     HWAddrPtr hwaddr(new HWAddr(std::vector<uint8_t>(6, 1), HTYPE_ETHER));
     query->setHWAddr(hwaddr);
@@ -501,7 +501,7 @@ TEST_F(CloseHATest, close4Backup) {
 
     // Prepare objects.
     IOServicePtr io_service(new IOService());
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
 
     // Check that the state is computed on dhcp4_srv_configured.
     // It is first reset by the constructor and then adjusted by running the
@@ -592,7 +592,7 @@ TEST_F(CloseHATest, close6) {
 
     // Prepare objects.
     IOServicePtr io_service(new IOService());
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     Pkt6Ptr query(new Pkt6(DHCPV6_REQUEST, 12345));
     DuidPtr duid(new DUID(std::vector<uint8_t>(8, 2)));
     OptionPtr opt_duid(new Option(Option::V6, D6O_CLIENTID, duid->getDuid()));
@@ -738,7 +738,7 @@ TEST_F(CloseHATest, close6Backup) {
 
     // Prepare objects.
     IOServicePtr io_service(new IOService());
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
 
     // Check that the state is computed on dhcp6_srv_configured.
     // It is first reset by the constructor and then adjusted by running the
index 1508b5cc72067c28373379b9e3538629a12cc82f..ee272ba8d98d2a155269814ab9b332c2f78c900b 100644 (file)
@@ -121,7 +121,7 @@ public:
         ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
         // Starting the service is required prior to running any callouts.
-        NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+        NetworkStatePtr network_state(new NetworkState());
         ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                                 HAServerType::DHCPv4));
 
@@ -159,7 +159,7 @@ TEST_F(HAImplTest, startServices) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidJsonConfiguration()));
 
     // Network state is also required.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
 
     // Start the service for DHCPv4 server.
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
@@ -179,7 +179,7 @@ TEST_F(HAImplTest, startServices6) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidJsonConfiguration()));
 
     // Network state is also required.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
 
     // Start the service for DHCPv4 server.
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
@@ -203,7 +203,7 @@ TEST_F(HAImplTest, buffer4Receive) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -317,7 +317,7 @@ TEST_F(HAImplTest, subnet4Select) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -375,7 +375,7 @@ TEST_F(HAImplTest, subnet4SelectSharedNetwork) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -436,7 +436,7 @@ TEST_F(HAImplTest, subnet4SelectSingleRelationship) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -478,7 +478,7 @@ TEST_F(HAImplTest, subnet4SelectDropNoServerName) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -524,7 +524,7 @@ TEST_F(HAImplTest, subnet4SelectDropInvalidServerNameType) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -574,7 +574,7 @@ TEST_F(HAImplTest, subnet4SelectDropNotInScope) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -627,7 +627,7 @@ TEST_F(HAImplTest, subnet4SelectNoSubnet) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -674,7 +674,7 @@ TEST_F(HAImplTest, buffer6Receive) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -765,7 +765,7 @@ TEST_F(HAImplTest, subnet6Select) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -820,7 +820,7 @@ TEST_F(HAImplTest, subnet6SelectSharedNetwork) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -881,7 +881,7 @@ TEST_F(HAImplTest, subnet6SelectSingleRelationship) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -923,7 +923,7 @@ TEST_F(HAImplTest, subnet6SelectDropNoServerName) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -969,7 +969,7 @@ TEST_F(HAImplTest, subnet6SelectDropInvalidServerNameType) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -1019,7 +1019,7 @@ TEST_F(HAImplTest, subnet6SelectDropNotInScope) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -1072,7 +1072,7 @@ TEST_F(HAImplTest, subnet6SelectNoSubnet) {
     ASSERT_NO_THROW(test_ha_impl_->configure(ha_config));
 
     // Starting the service is required before any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -1115,7 +1115,7 @@ TEST_F(HAImplTest, leases4Committed) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -1202,7 +1202,7 @@ TEST_F(HAImplTest, leases4CommittedMultipleRelationships) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidHubJsonConfiguration()));
 
     // Starting the service is required before running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -1259,7 +1259,7 @@ TEST_F(HAImplTest, leases4CommittedMultipleRelationshipsNoServerName) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidHubJsonConfiguration()));
 
     // Starting the service is required before running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -1312,7 +1312,7 @@ TEST_F(HAImplTest, leases4CommittedMultipleRelationshipsInvalidServerName) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidHubJsonConfiguration()));
 
     // Starting the service is required before running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -1367,7 +1367,7 @@ TEST_F(HAImplTest, leases6Committed) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -1453,7 +1453,7 @@ TEST_F(HAImplTest, leases6CommittedMultipleRelationships) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidHubJsonConfiguration()));
 
     // Starting the service is required before running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -1509,7 +1509,7 @@ TEST_F(HAImplTest, leases6CommittedMultipleRelationshipsNoServerName) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidHubJsonConfiguration()));
 
     // Starting the service is required before running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -1561,7 +1561,7 @@ TEST_F(HAImplTest, leases6CommittedMultipleRelationshipsInvalidServerName) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidHubJsonConfiguration()));
 
     // Starting the service is required before running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv6));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv6));
 
@@ -1693,7 +1693,7 @@ TEST_F(HAImplTest, continueHandler) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -1723,7 +1723,7 @@ TEST_F(HAImplTest, continueHandlerWithNoServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -1748,7 +1748,7 @@ TEST_F(HAImplTest, continueHandlerWithWrongServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -1778,7 +1778,7 @@ TEST_F(HAImplTest, statusGet) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -1841,7 +1841,7 @@ TEST_F(HAImplTest, statusGetBackupServer) {
     test_ha_impl_->config_->get()->setThisServerName("server3");
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -1891,7 +1891,7 @@ TEST_F(HAImplTest, statusGetPassiveBackup) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidPassiveBackupJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -1941,7 +1941,7 @@ TEST_F(HAImplTest, statusGetHubAndSpoke) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidHubJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
@@ -2027,7 +2027,7 @@ TEST_F(HAImplTest, maintenanceNotify) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2060,7 +2060,7 @@ TEST_F(HAImplTest, maintenanceNotifyNoServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2092,7 +2092,7 @@ TEST_F(HAImplTest, maintenanceNotifyBadServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2125,7 +2125,7 @@ TEST_F(HAImplTest, haReset) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2157,7 +2157,7 @@ TEST_F(HAImplTest, haResetNoServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2186,7 +2186,7 @@ TEST_F(HAImplTest, haResetBadServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2218,7 +2218,7 @@ TEST_F(HAImplTest, haHeartbeat) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2250,7 +2250,7 @@ TEST_F(HAImplTest, haHeartbeatNoServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2279,7 +2279,7 @@ TEST_F(HAImplTest, haHeartbeatBadServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2312,7 +2312,7 @@ TEST_F(HAImplTest, haSyncCompleteNotifyOriginId) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2357,7 +2357,7 @@ TEST_F(HAImplTest, haSyncCompleteNotifyOrigin) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2401,7 +2401,7 @@ TEST_F(HAImplTest, haSyncCompleteNotifyNoServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2431,7 +2431,7 @@ TEST_F(HAImplTest, haSyncCompleteNotifyBadServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2463,7 +2463,7 @@ TEST_F(HAImplTest, haScopes) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2496,7 +2496,7 @@ TEST_F(HAImplTest, haScopesNoServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2528,7 +2528,7 @@ TEST_F(HAImplTest, haScopesBadServerName) {
     ASSERT_NO_THROW(ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(ha_impl_->startServices(network_state,
                                             HAServerType::DHCPv4));
 
@@ -2562,7 +2562,7 @@ TEST_F(HAImplTest, lease4ServerDecline) {
     ASSERT_NO_THROW(test_ha_impl_->configure(createValidJsonConfiguration()));
 
     // Starting the service is required prior to running any callouts.
-    NetworkStatePtr network_state(new NetworkState(NetworkState::DHCPv4));
+    NetworkStatePtr network_state(new NetworkState());
     ASSERT_NO_THROW(test_ha_impl_->startServices(network_state,
                                                  HAServerType::DHCPv4));
 
index bf07480c65068436bf04b20e2a8e6e3b458710b8..350df09a7116fc180e9a16376e7fb233cf2b85ac 100644 (file)
@@ -52,7 +52,7 @@ namespace test {
 
 HATest::HATest()
     : io_service_(new IOService()),
-      network_state_(new NetworkState(NetworkState::DHCPv4)) {
+      network_state_(new NetworkState()) {
 }
 
 HATest::~HATest() {
index 61aba7df00ca15cd6afb758b6fc651da8d8dfe36..4bf7c098db3680cbe6c21c48adc63e4ba879543a 100644 (file)
@@ -27,11 +27,9 @@ class NetworkStateImpl : public boost::enable_shared_from_this<NetworkStateImpl>
 public:
 
     /// @brief Constructor.
-    NetworkStateImpl(const NetworkState::ServerType& server_type)
-        : server_type_(server_type), globally_disabled_(false),
-          disabled_subnets_(), disabled_networks_(),
-          timer_mgr_(TimerMgr::instance()), disabled_by_origin_(),
-          disabled_by_db_connection_(0) {
+    NetworkStateImpl() : globally_disabled_(false), disabled_subnets_(),
+          disabled_networks_(), timer_mgr_(TimerMgr::instance()),
+          disabled_by_origin_(), disabled_by_db_connection_(0) {
     }
 
     /// @brief Destructor.
@@ -178,22 +176,23 @@ public:
     /// @brief The network state as Element.
     ///
     /// @return The network state as Element.
-    ConstElementPtr toElement() {
+    ConstElementPtr toElement() const {
         ElementPtr result = Element::createMap();
         result->set("globally-disabled", Element::create(globally_disabled_));
         result->set("disabled-by-db-connection", Element::create(disabled_by_db_connection_ != 0));
         bool disabled_by_user = false;
         ElementPtr local_origin = Element::createList();
         ElementPtr remote_origin = Element::createList();
-        for (auto const& origin : disabled_by_origin_) {
+        std::set<uint32_t> ordered(disabled_by_origin_.begin(), disabled_by_origin_.end());
+        for (auto const& origin : ordered) {
             if (origin == NetworkState::USER_COMMAND) {
                 disabled_by_user = true;
             }
             if (origin >= NetworkState::HA_LOCAL_COMMAND && origin < NetworkState::HA_REMOTE_COMMAND) {
-                local_origin->add(Element::create(origin - NetworkState::HA_LOCAL_COMMAND));
+                local_origin->add(Element::create(origin));
             }
             if (origin >= NetworkState::HA_REMOTE_COMMAND && origin < NetworkState::DB_CONNECTION) {
-                remote_origin->add(Element::create(origin - NetworkState::HA_REMOTE_COMMAND));
+                remote_origin->add(Element::create(origin));
             }
         }
         result->set("disabled-by-user", Element::create(disabled_by_user));
@@ -203,9 +202,6 @@ public:
         return (result);
     }
 
-    /// @brief Server type.
-    NetworkState::ServerType server_type_;
-
     /// @brief A flag indicating if DHCP service is globally disabled.
     bool globally_disabled_;
 
@@ -222,15 +218,15 @@ public:
     TimerMgrPtr timer_mgr_;
 
     /// @brief A set of requests to disable the service by origin.
-    std::unordered_set<unsigned int> disabled_by_origin_;
+    std::unordered_set<uint32_t> disabled_by_origin_;
 
     /// @brief Flag which indicates the state has been disabled by a DB
     /// connection loss.
     uint32_t disabled_by_db_connection_;
 };
 
-NetworkState::NetworkState(const NetworkState::ServerType& server_type)
-    : impl_(new NetworkStateImpl(server_type)), mutex_(new std::mutex()) {
+NetworkState::NetworkState()
+    : impl_(new NetworkStateImpl()), mutex_(new std::mutex()) {
 }
 
 void
@@ -305,7 +301,7 @@ NetworkState::selectiveEnable(const NetworkState::Networks&) {
     isc_throw(NotImplemented, "selectiveEnableService is not implemented");
 }
 
-ConstElementPtr NetworkState::toElement() {
+ConstElementPtr NetworkState::toElement() const {
     MultiThreadingLock lock(*mutex_);
     return (impl_->toElement());
 }
index ab20f67caeca8871a6e0797184f5a9a2ad6a3fdf..b48697b91ea9c314eace6c686e2f37e3a94c49ae 100644 (file)
@@ -71,12 +71,6 @@ class NetworkStateImpl;
 class NetworkState {
 public:
 
-    /// @brief DHCP server type.
-    enum ServerType {
-        DHCPv4,
-        DHCPv6
-    };
-
     /// @brief Origin of the network state transition.
     ///
     /// The enumeration indicates the originator of the state transition of the
@@ -113,7 +107,7 @@ public:
     typedef std::set<std::string> Networks;
 
     /// @brief Constructor.
-    NetworkState(const ServerType& server_type);
+    NetworkState();
 
     /// @brief Disable the DHCP service state for respective transition origin.
     ///
@@ -211,7 +205,7 @@ public:
     /// @brief The network state as Element.
     ///
     /// @return The network state as Element.
-    isc::data::ConstElementPtr toElement();
+    isc::data::ConstElementPtr toElement() const;
 
     //@}
 
index 4f7b539e49674075d0d51109c63ee518929f08ff..3b67daf853d26a4d46c3e514d7bd38a3ccc49c17 100644 (file)
@@ -46,49 +46,37 @@ public:
     /// @brief This test verifies the default is enable state.
     void defaultTest();
 
-    /// @brief This test verifies that it is possible to disable and then enable DHCPv4
+    /// @brief This test verifies that it is possible to disable and then enable
     /// service using 'user command' origin.
-    void disableEnableService4UsingUserCommandOriginTest();
+    void disableEnableServiceUsingUserCommandOriginTest();
 
-    /// @brief This test verifies that it is possible to disable and then enable DHCPv4
-    /// service using 'HA command' origin.
-    void disableEnableService4UsingHACommandOriginTest();
+    /// @brief This test verifies that it is possible to disable and then enable
+    /// service using 'HA local command' origin.
+    void disableEnableServiceUsingHALocalCommandOriginTest();
 
-    /// @brief This test verifies that it is possible to disable and then enable DHCPv4
-    /// service using 'DB connection' origin.
-    void disableEnableService4UsingDBConnectionOriginTest();
-
-    /// @brief This test verifies that it is possible to disable and then enable DHCPv4
-    /// service using a combination of origins.
-    /// 1. Disable using 'user command' origin 2 times (expect disabled state).
-    /// 2. Disable using 'HA command' origin 2 times (expect disabled state).
-    /// 3. Disable using 'DB connection' origin 2 times (expect disabled state).
-    /// 4. Enable using 'user command' origin 1 time (expect disabled state).
-    /// 5. Enable using 'HA command' origin 1 time (expect disabled state).
-    /// 6. Enable using 'DB connection' origin 2 times (expect enabled state).
-    void disableEnableService4UsingMultipleOriginsTest();
+    /// @brief This test verifies that it is possible to disable and then enable
+    /// service using 'HA remote command' origin.
+    void disableEnableServiceUsingHARemoteCommandOriginTest();
 
-    /// @brief This test verifies that it is possible to disable and then enable DHCPv6
-    /// service using 'user command' origin.
-    void disableEnableService6UsingUserCommandOriginTest();
-
-    /// @brief This test verifies that it is possible to disable and then enable DHCPv6
-    /// service using 'HA command' origin.
-    void disableEnableService6UsingHACommandOriginTest();
-
-    /// @brief This test verifies that it is possible to disable and then enable DHCPv6
+    /// @brief This test verifies that it is possible to disable and then enable
     /// service using 'DB connection' origin.
-    void disableEnableService6UsingDBConnectionOriginTest();
+    void disableEnableServiceUsingDBConnectionOriginTest();
 
-    /// @brief This test verifies that it is possible to disable and then enable DHCPv6
+    /// @brief This test verifies that it is possible to disable and then enable
     /// service using a combination of origins.
-    /// 1. Disable using 'user command' origin 2 times (expect disabled state).
-    /// 2. Disable using 'HA command' origin 2 times (expect disabled state).
-    /// 3. Disable using 'DB connection' origin 2 times (expect disabled state).
-    /// 4. Enable using 'user command' origin 1 time (expect disabled state).
-    /// 5. Enable using 'HA command' origin 1 time (expect disabled state).
-    /// 6. Enable using 'DB connection' origin 2 times (expect enabled state).
-    void disableEnableService6UsingMultipleOriginsTest();
+    // 1. Disable using 'user command' origin 2 times (expect disabled state).
+    // 2. Disable using 'HA local command' origin 2 times (expect disabled state).
+    // 3. Disable using 'HA local command' origin 1 time different id (expect disabled state).
+    // 4. Disable using 'HA remote command' origin 2 times (expect disabled state).
+    // 5. Disable using 'HA remote command' origin 1 time different id (expect disabled state).
+    // 6. Disable using 'DB connection' origin 2 times (expect disabled state).
+    // 7. Enable using 'user command' origin 1 time (expect disabled state).
+    // 8. Enable using 'HA local command' origin 1 time (expect disabled state).
+    // 9. Enable using 'HA local command' origin 1 time different id (expect disabled state).
+    // 10. Enable using 'HA remote command' origin 1 time (expect disabled state).
+    // 11. Enable using 'HA remote command' origin 1 time different id (expect disabled state).
+    // 12. Enable using 'DB connection' origin 2 times (expect enabled state).
+    void disableEnableServiceUsingMultipleOriginsTest();
 
     /// @brief This test verifies that reset works, so that internal state is reset after
     /// all managers are recreated.
@@ -104,15 +92,63 @@ public:
 
     /// @brief This test verifies that reset works, so that internal state is reset after
     /// all managers are recreated.
-    /// 1. Disable using 'user command' origin 1 time (expect disabled state).
-    /// 2. Disable using 'HA command' origin 3 times (expect disabled state).
-    /// 3. Disable using 'DB connection' origin 1 time (expect disabled state).
-    /// 4. Reset using 'HA command' origin (expect disabled state).
-    /// 5. Enable using 'user command' origin 1 time (expect disabled state).
-    /// 6. Enable using 'DB connection' origin 1 time (expect enabled state).
-    /// 7. Disable using 'HA command' origin 3 times (expect disabled state).
-    /// 8. Reset using 'HA command' origin (expect enabled state).
-    void resetUsingHACommandOriginTest();
+    // 1. Disable using 'user command' origin 1 time (expect disabled state).
+    // 2. Disable using 'HA local command' origin 3 times with same id (expect disabled state).
+    // 3. Disable using 'DB connection' origin 1 time (expect disabled state).
+    // 4. Disable using 'HA remote command' origin 1 time (expect disabled state).
+    // 5. Enable using 'HA local command' origin (expect disabled state).
+    // 6. Enable using 'user command' origin 1 time (expect disabled state).
+    // 7. Enable using 'HA remote command' origin 1 time (expect disabled state).
+    // 8. Enable using 'DB connection' origin 1 time (expect enabled state).
+    // 9. Disable using 'user command' origin 1 time (expect disabled state).
+    // 10. Disable using 'HA local command' origin 3 times with different ids (expect disabled state).
+    // 11. Disable using 'DB connection' origin 1 time (expect disabled state).
+    // 12. Disable using 'HA remote command' origin 1 time (expect disabled state).
+    // 13. Enable using 'user command' origin 1 time (expect disabled state).
+    // 14. Enable using 'HA remote command' origin 1 time (expect disabled state).
+    // 15. Enable using 'DB connection' origin 1 time (expect disabled state).
+    // 16. Enable using 'HA local command' origin 3 times with different ids (expect enabled state).
+    // 17. Disable using 'user command' origin 1 time (expect disabled state).
+    // 18. Disable using 'HA local command' origin 3 times with different ids (expect disabled state).
+    // 19. Disable using 'DB connection' origin 1 time (expect disabled state).
+    // 20. Disable using 'HA remote command' origin 1 time (expect disabled state).
+    // 21. Enable using 'user command' origin 1 time (expect disabled state).
+    // 22. Enable using 'HA remote command' origin 1 time (expect disabled state).
+    // 23. Enable using 'DB connection' origin 1 time (expect disabled state).
+    // 24. Reset using 'HA local command' origin (expect enabled state).
+    // 25. Disable using 'HA local command' origin 3 times (expect disabled state).
+    // 26. Enable using 'HA local command' origin (expect enabled state).
+    void resetUsingHALocalCommandOriginTest();
+
+    /// @brief This test verifies that reset works, so that internal state is reset after
+    /// all managers are recreated.
+    // 1. Disable using 'user command' origin 1 time (expect disabled state).
+    // 2. Disable using 'HA remote command' origin 3 times with same id (expect disabled state).
+    // 3. Disable using 'DB connection' origin 1 time (expect disabled state).
+    // 4. Disable using 'HA local command' origin 1 time (expect disabled state).
+    // 5. Enable using 'HA remote command' origin (expect disabled state).
+    // 6. Enable using 'user command' origin 1 time (expect disabled state).
+    // 7. Enable using 'HA local command' origin 1 time (expect disabled state).
+    // 8. Enable using 'DB connection' origin 1 time (expect enabled state).
+    // 9. Disable using 'user command' origin 1 time (expect disabled state).
+    // 10. Disable using 'HA remote command' origin 3 times with different ids (expect disabled state).
+    // 11. Disable using 'DB connection' origin 1 time (expect disabled state).
+    // 12. Disable using 'HA local command' origin 1 time (expect disabled state).
+    // 13. Enable using 'user command' origin 1 time (expect disabled state).
+    // 14. Enable using 'HA local command' origin 1 time (expect disabled state).
+    // 15. Enable using 'DB connection' origin 1 time (expect disabled state).
+    // 16. Enable using 'HA remote command' origin 3 times with different ids (expect enabled state).
+    // 17. Disable using 'user command' origin 1 time (expect disabled state).
+    // 18. Disable using 'HA remote command' origin 3 times with different ids (expect disabled state).
+    // 19. Disable using 'DB connection' origin 1 time (expect disabled state).
+    // 20. Disable using 'HA local command' origin 1 time (expect disabled state).
+    // 21. Enable using 'user command' origin 1 time (expect disabled state).
+    // 22. Enable using 'HA local command' origin 1 time (expect disabled state).
+    // 23. Enable using 'DB connection' origin 1 time (expect disabled state).
+    // 24. Reset using 'HA remote command' origin (expect enabled state).
+    // 25. Disable using 'HA remote command' origin 3 times (expect disabled state).
+    // 26. Enable using 'HA remote command' origin (expect enabled state).
+    void resetUsingHARemoteCommandOriginTest();
 
     /// @brief This test verifies that reset works, so that internal state is reset after
     /// all managers are recreated.
@@ -150,6 +186,50 @@ public:
         io_service_->poll();
     }
 
+    /// @brief Check network state.
+    ///
+    /// @brief state The network state to check.
+    /// @brief user Flag which indicates if user command disabled the state.
+    /// @brief db_connection Flag which indicates if db connection disabled the
+    /// state.
+    /// @brief local The list of local IDs which disabled the state.
+    /// @brief remote The list of remote IDs which disabled the state.
+    /// @brief global Flag which indicates if the state is disabled.
+    void checkNetworkState(const NetworkState& state,
+                           bool user,
+                           bool db_connection,
+                           std::vector<uint32_t> local,
+                           std::vector<uint32_t> remote,
+                           bool global) {
+        std::string expected = "{ \"disabled-by-db-connection\": ";
+        expected += db_connection ? "true" : "false";
+        expected += ", \"disabled-by-local-command\": [ ";
+        bool not_first = false;
+        for (auto const value : local) {
+            if (not_first) {
+                expected += ", ";
+            }
+            expected += std::to_string(value);
+            not_first = true;
+        }
+        expected += " ], \"disabled-by-remote-command\": [ ";
+        not_first = false;
+        for (auto const value : remote) {
+            if (not_first) {
+                expected += ", ";
+            }
+            expected += std::to_string(value);
+            not_first = true;
+        }
+        expected += " ], \"disabled-by-user\": ";
+        expected += user ? "true" : "false";
+        expected += ", \"globally-disabled\": ";
+        expected += global ? "true" : "false";
+        expected += " }";
+        EXPECT_EQ(expected, state.toElement()->str());
+        EXPECT_EQ(!global, state.isServiceEnabled());
+    }
+
     /// @brief IO service used during the tests.
     IOServicePtr io_service_;
 };
@@ -157,233 +237,188 @@ public:
 // This test verifies the default is enable state.
 void
 NetworkStateTest::defaultTest() {
-    std::string expected("{ \"disabled-by-db-connection\": false, "
-                           "\"disabled-by-local-command\": [  ], "
-                           "\"disabled-by-remote-command\": [  ], "
-                           "\"disabled-by-user\": false, "
-                           "\"globally-disabled\": false }");
-    NetworkState state4(NetworkState::DHCPv4);
-    EXPECT_TRUE(state4.isServiceEnabled());
-    EXPECT_EQ(expected, state4.toElement()->str());
-    NetworkState state6(NetworkState::DHCPv6);
-    EXPECT_TRUE(state6.isServiceEnabled());
-    EXPECT_EQ(expected, state6.toElement()->str());
-}
-
-// This test verifies that it is possible to disable and then enable DHCPv4
+    NetworkState state;
+
+    checkNetworkState(state, false, false, {}, {}, false);
+}
+
+// This test verifies that it is possible to disable and then enable
 // service using 'user command' origin.
 void
-NetworkStateTest::disableEnableService4UsingUserCommandOriginTest() {
-    NetworkState state(NetworkState::DHCPv4);
+NetworkStateTest::disableEnableServiceUsingUserCommandOriginTest() {
+    NetworkState state;
 
     // Test that enable/disable using 'user command' origin works
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
 
     // Test that using 'user command' origin does not use internal counter
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
     state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
 }
 
-// This test verifies that it is possible to disable and then enable DHCPv4
-// service using 'HA command' origin.
+// This test verifies that it is possible to disable and then enable
+// service using 'HA local command' origin.
 void
-NetworkStateTest::disableEnableService4UsingHACommandOriginTest() {
-    NetworkState state(NetworkState::DHCPv4);
+NetworkStateTest::disableEnableServiceUsingHALocalCommandOriginTest() {
+    NetworkState state;
 
-    // Test that enable/disable using 'HA command' origin works
+    // Test that enable/disable using 'HA local command' origin works
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, { 1000 }, {}, true);
     state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
 
-    // Test that using 'HA command' origin does not use internal counter
+    // Test that using 'HA local command' origin does not use internal counter
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, { 1000 }, {}, true);
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, { 1000 }, {}, true);
     state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
     state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
-}
-
-// This test verifies that it is possible to disable and then enable DHCPv4
-// service using 'DB connection' origin.
-void
-NetworkStateTest::disableEnableService4UsingDBConnectionOriginTest() {
-    NetworkState state(NetworkState::DHCPv4);
-
-    // Test that enable/disable using 'DB connection' origin works
-    state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_TRUE(state.isServiceEnabled());
-
-    // Test that using 'DB connection' origin uses internal counter
-    state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_TRUE(state.isServiceEnabled());
-    state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_TRUE(state.isServiceEnabled());
-}
-
-// This test verifies that it is possible to disable and then enable DHCPv4
-// service using a combination of origins.
-// 1. Disable using 'user command' origin 2 times (expect disabled state).
-// 2. Disable using 'HA command' origin 2 times (expect disabled state).
-// 3. Disable using 'DB connection' origin 2 times (expect disabled state).
-// 4. Enable using 'user command' origin 1 time (expect disabled state).
-// 5. Enable using 'HA command' origin 1 time (expect disabled state).
-// 6. Enable using 'DB connection' origin 2 times (expect enabled state).
-void
-NetworkStateTest::disableEnableService4UsingMultipleOriginsTest() {
-    NetworkState state(NetworkState::DHCPv4);
+    checkNetworkState(state, false, false, {}, {}, false);
 
-    // Test that a combination properly affects the state
-    state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    // Test that using 'HA local command' origin does consider id
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, { 1000 }, {}, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND + 1);
+    checkNetworkState(state, false, false, { 1000, 1001 }, {}, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND + 2);
+    checkNetworkState(state, false, false, { 1000, 1001, 1002 }, {}, true);
     state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, { 1001, 1002 }, {}, true);
+    state.enableService(NetworkState::HA_LOCAL_COMMAND + 1);
+    checkNetworkState(state, false, false, { 1002 }, {}, true);
+    state.enableService(NetworkState::HA_LOCAL_COMMAND + 2);
+    checkNetworkState(state, false, false, {}, {}, false);
 }
 
-// This test verifies that it is possible to disable and then enable DHCPv6
-// service using 'user command' origin.
+// This test verifies that it is possible to disable and then enable
+// service using 'HA remote command' origin.
 void
-NetworkStateTest::disableEnableService6UsingUserCommandOriginTest() {
-    NetworkState state(NetworkState::DHCPv6);
-
-    // Test that enable/disable using 'user command' origin works
-    state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
-
-    // Test that using 'user command' origin does not use internal counter
-    state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
-    state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
-}
-
-// This test verifies that it is possible to disable and then enable DHCPv6
-// service using 'HA command' origin.
-void
-NetworkStateTest::disableEnableService6UsingHACommandOriginTest() {
-    NetworkState state(NetworkState::DHCPv6);
-
-    // Test that enable/disable using 'HA command' origin works
-    state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
-
-    // Test that using 'HA command' origin does not use internal counter
-    state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
-    state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
-    state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
-}
-
-// This test verifies that it is possible to disable and then enable DHCPv6
+NetworkStateTest::disableEnableServiceUsingHARemoteCommandOriginTest() {
+    NetworkState state;
+
+    // Test that enable/disable using 'HA remote command' origin works
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, { 2000 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, {}, false);
+
+    // Test that using 'HA remote command' origin does not use internal counter
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, { 2000 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, { 2000 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, {}, false);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, {}, false);
+
+    // Test that using 'HA remote command' origin does consider id
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, { 2000 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND + 1);
+    checkNetworkState(state, false, false, {}, { 2000, 2001 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND + 2);
+    checkNetworkState(state, false, false, {}, { 2000, 2001, 2002 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, { 2001, 2002 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND + 1);
+    checkNetworkState(state, false, false, {}, { 2002 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND + 2);
+    checkNetworkState(state, false, false, {}, {}, false);
+}
+
+// This test verifies that it is possible to disable and then enable
 // service using 'DB connection' origin.
 void
-NetworkStateTest::disableEnableService6UsingDBConnectionOriginTest() {
-    NetworkState state(NetworkState::DHCPv6);
+NetworkStateTest::disableEnableServiceUsingDBConnectionOriginTest() {
+    NetworkState state;
 
     // Test that enable/disable using 'DB connection' origin works
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, {}, true);
     state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
 
     // Test that using 'DB connection' origin uses internal counter
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, {}, true);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, {}, true);
     state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, {}, true);
     state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, {}, true);
     state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
 }
 
-// This test verifies that it is possible to disable and then enable DHCPv6
+// This test verifies that it is possible to disable and then enable
 // service using a combination of origins.
 // 1. Disable using 'user command' origin 2 times (expect disabled state).
-// 2. Disable using 'HA command' origin 2 times (expect disabled state).
-// 3. Disable using 'DB connection' origin 2 times (expect disabled state).
-// 4. Enable using 'user command' origin 1 time (expect disabled state).
-// 5. Enable using 'HA command' origin 1 time (expect disabled state).
-// 6. Enable using 'DB connection' origin 2 times (expect enabled state).
+// 2. Disable using 'HA local command' origin 2 times (expect disabled state).
+// 3. Disable using 'HA local command' origin 1 time different id (expect disabled state).
+// 4. Disable using 'HA remote command' origin 2 times (expect disabled state).
+// 5. Disable using 'HA remote command' origin 1 time different id (expect disabled state).
+// 6. Disable using 'DB connection' origin 2 times (expect disabled state).
+// 7. Enable using 'user command' origin 1 time (expect disabled state).
+// 8. Enable using 'HA local command' origin 1 time (expect disabled state).
+// 9. Enable using 'HA local command' origin 1 time different id (expect disabled state).
+// 10. Enable using 'HA remote command' origin 1 time (expect disabled state).
+// 11. Enable using 'HA remote command' origin 1 time different id (expect disabled state).
+// 12. Enable using 'DB connection' origin 2 times (expect enabled state).
 void
-NetworkStateTest::disableEnableService6UsingMultipleOriginsTest() {
-    NetworkState state(NetworkState::DHCPv6);
+NetworkStateTest::disableEnableServiceUsingMultipleOriginsTest() {
+    NetworkState state;
 
     // Test that a combination properly affects the state
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, { 1000 }, {}, true);
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, { 1000 }, {}, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND + 1);
+    checkNetworkState(state, true, false, { 1000, 1001 }, {}, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, false, { 1000, 1001 }, { 2000 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, false, { 1000, 1001 }, { 2000 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND + 1);
+    checkNetworkState(state, true, false, { 1000, 1001 }, { 2000, 2001 }, true);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, true, { 1000, 1001 }, { 2000, 2001 }, true);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, true, { 1000, 1001 }, { 2000, 2001 }, true);
     state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, { 1000, 1001 }, { 2000, 2001 }, true);
     state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, { 1001 }, { 2000, 2001 }, true);
+    state.enableService(NetworkState::HA_LOCAL_COMMAND + 1);
+    checkNetworkState(state, false, true, {}, { 2000, 2001 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, true, {}, { 2001 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND + 1);
+    checkNetworkState(state, false, true, {}, {}, true);
     state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, {}, true);
     state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
 }
 
 // This test verifies that reset works, so that internal state is reset after
@@ -395,81 +430,268 @@ NetworkStateTest::disableEnableService6UsingMultipleOriginsTest() {
 // 5. Enable using 'HA command' origin 1 time (expect disabled state).
 // 6. Enable using 'DB connection' origin 1 time (expect enabled state).
 // 7. Disable using 'user command' origin 3 times (expect disabled state).
-// 8. Reset using 'user command' origin (expect enabled state).
+// 8. Enable using 'user command' origin (expect enabled state).
 void
 NetworkStateTest::resetUsingUserCommandOriginTest() {
-    NetworkState state(NetworkState::DHCPv4);
+    NetworkState state;
 
     // Test User COMMAND + HA COMMAND + DB CONNECTION origins
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, { 1000 }, {}, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, false, { 1000 }, { 2000 }, true);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, true, { 1000 }, { 2000 }, true);
     state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, { 1000 }, { 2000 }, true);
     state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, { 2000 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, true, {}, {}, true);
     state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
 
     // Test User COMMAND origin only
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
 }
 
 // This test verifies that reset works, so that internal state is reset after
 // all managers are recreated.
 // 1. Disable using 'user command' origin 1 time (expect disabled state).
-// 2. Disable using 'HA command' origin 3 times (expect disabled state).
+// 2. Disable using 'HA local command' origin 3 times with same id (expect disabled state).
 // 3. Disable using 'DB connection' origin 1 time (expect disabled state).
-// 4. Enable using 'HA command' origin (expect disabled state).
-// 5. Enable using 'user command' origin 1 time (expect disabled state).
-// 6. Enable using 'DB connection' origin 1 time (expect enabled state).
-// 7. Disable using 'HA command' origin 3 times (expect disabled state).
-// 8. Enable using 'HA command' origin (expect enabled state).
+// 4. Disable using 'HA remote command' origin 1 time (expect disabled state).
+// 5. Enable using 'HA local command' origin (expect disabled state).
+// 6. Enable using 'user command' origin 1 time (expect disabled state).
+// 7. Enable using 'HA remote command' origin 1 time (expect disabled state).
+// 8. Enable using 'DB connection' origin 1 time (expect enabled state).
+// 9. Disable using 'user command' origin 1 time (expect disabled state).
+// 10. Disable using 'HA local command' origin 3 times with different ids (expect disabled state).
+// 11. Disable using 'DB connection' origin 1 time (expect disabled state).
+// 12. Disable using 'HA remote command' origin 1 time (expect disabled state).
+// 13. Enable using 'user command' origin 1 time (expect disabled state).
+// 14. Enable using 'HA remote command' origin 1 time (expect disabled state).
+// 15. Enable using 'DB connection' origin 1 time (expect disabled state).
+// 16. Enable using 'HA local command' origin 3 times with different ids (expect enabled state).
+// 17. Disable using 'user command' origin 1 time (expect disabled state).
+// 18. Disable using 'HA local command' origin 3 times with different ids (expect disabled state).
+// 19. Disable using 'DB connection' origin 1 time (expect disabled state).
+// 20. Disable using 'HA remote command' origin 1 time (expect disabled state).
+// 21. Enable using 'user command' origin 1 time (expect disabled state).
+// 22. Enable using 'HA remote command' origin 1 time (expect disabled state).
+// 23. Enable using 'DB connection' origin 1 time (expect disabled state).
+// 24. Reset using 'HA local command' origin (expect enabled state).
+// 25. Disable using 'HA local command' origin 3 times (expect disabled state).
+// 26. Enable using 'HA local command' origin (expect enabled state).
 void
-NetworkStateTest::resetUsingHACommandOriginTest() {
-    NetworkState state(NetworkState::DHCPv4);
+NetworkStateTest::resetUsingHALocalCommandOriginTest() {
+    NetworkState state;
 
-    // Test HA COMMAND + User COMMAND + DB CONNECTION origins
+    // Test HA LOCAL COMMAND + User COMMAND + DB CONNECTION origins
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, { 1000 }, {}, true);
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, { 1000 }, {}, true);
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, { 1000 }, {}, true);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, true, { 1000 }, {}, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, true, { 1000 }, { 2000 }, true);
     state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, true, {}, { 2000 }, true);
     state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, { 2000 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, true, {}, {}, true);
     state.enableService(NetworkState::DB_CONNECTION);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
 
-    // Test HA COMMAND origin only
+    // Test HA LOCAL COMMAND + User COMMAND + DB CONNECTION origins
+    state.disableService(NetworkState::USER_COMMAND);
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, { 1000 }, {}, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND + 1);
+    checkNetworkState(state, true, false, { 1000, 1001 }, {}, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND + 2);
+    checkNetworkState(state, true, false, { 1000, 1001, 1002 }, {}, true);
+    state.disableService(NetworkState::DB_CONNECTION);
+    checkNetworkState(state, true, true, { 1000, 1001, 1002 }, {}, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, true, { 1000, 1001, 1002 }, { 2000 }, true);
+    state.enableService(NetworkState::USER_COMMAND);
+    checkNetworkState(state, false, true, { 1000, 1001, 1002 }, { 2000 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, true, { 1000, 1001, 1002 }, {}, true);
+    state.enableService(NetworkState::DB_CONNECTION);
+    checkNetworkState(state, false, false, { 1000, 1001, 1002 }, {}, true);
+    state.enableService(NetworkState::HA_LOCAL_COMMAND);
+    checkNetworkState(state, false, false, { 1001, 1002 }, {}, true);
+    state.enableService(NetworkState::HA_LOCAL_COMMAND + 1);
+    checkNetworkState(state, false, false, { 1002 }, {}, true);
+    state.enableService(NetworkState::HA_LOCAL_COMMAND + 2);
+    checkNetworkState(state, false, false, {}, {}, false);
+
+    // Test HA LOCAL COMMAND + User COMMAND + DB CONNECTION origins
+    state.disableService(NetworkState::USER_COMMAND);
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, { 1000 }, {}, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND + 1);
+    checkNetworkState(state, true, false, { 1000, 1001 }, {}, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND + 2);
+    checkNetworkState(state, true, false, { 1000, 1001, 1002 }, {}, true);
+    state.disableService(NetworkState::DB_CONNECTION);
+    checkNetworkState(state, true, true, { 1000, 1001, 1002 }, {}, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, true, { 1000, 1001, 1002 }, { 2000 }, true);
+    state.enableService(NetworkState::USER_COMMAND);
+    checkNetworkState(state, false, true, { 1000, 1001, 1002 }, { 2000 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, true, { 1000, 1001, 1002 }, {}, true);
+    state.enableService(NetworkState::DB_CONNECTION);
+    checkNetworkState(state, false, false, { 1000, 1001, 1002 }, {}, true);
+    state.resetForLocalCommands();
+    checkNetworkState(state, false, false, {}, {}, false);
+
+    // Test HA LOCAL COMMAND origin only
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, { 1000 }, {}, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND);
+    checkNetworkState(state, false, false, { 1000 }, {}, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND);
+    checkNetworkState(state, false, false, { 1000 }, {}, true);
     state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
+}
+
+// This test verifies that reset works, so that internal state is reset after
+// all managers are recreated.
+// 1. Disable using 'user command' origin 1 time (expect disabled state).
+// 2. Disable using 'HA remote command' origin 3 times with same id (expect disabled state).
+// 3. Disable using 'DB connection' origin 1 time (expect disabled state).
+// 4. Disable using 'HA local command' origin 1 time (expect disabled state).
+// 5. Enable using 'HA remote command' origin (expect disabled state).
+// 6. Enable using 'user command' origin 1 time (expect disabled state).
+// 7. Enable using 'HA local command' origin 1 time (expect disabled state).
+// 8. Enable using 'DB connection' origin 1 time (expect enabled state).
+// 9. Disable using 'user command' origin 1 time (expect disabled state).
+// 10. Disable using 'HA remote command' origin 3 times with different ids (expect disabled state).
+// 11. Disable using 'DB connection' origin 1 time (expect disabled state).
+// 12. Disable using 'HA local command' origin 1 time (expect disabled state).
+// 13. Enable using 'user command' origin 1 time (expect disabled state).
+// 14. Enable using 'HA local command' origin 1 time (expect disabled state).
+// 15. Enable using 'DB connection' origin 1 time (expect disabled state).
+// 16. Enable using 'HA remote command' origin 3 times with different ids (expect enabled state).
+// 17. Disable using 'user command' origin 1 time (expect disabled state).
+// 18. Disable using 'HA remote command' origin 3 times with different ids (expect disabled state).
+// 19. Disable using 'DB connection' origin 1 time (expect disabled state).
+// 20. Disable using 'HA local command' origin 1 time (expect disabled state).
+// 21. Enable using 'user command' origin 1 time (expect disabled state).
+// 22. Enable using 'HA local command' origin 1 time (expect disabled state).
+// 23. Enable using 'DB connection' origin 1 time (expect disabled state).
+// 24. Reset using 'HA remote command' origin (expect enabled state).
+// 25. Disable using 'HA remote command' origin 3 times (expect disabled state).
+// 26. Enable using 'HA remote command' origin (expect enabled state).
+void
+NetworkStateTest::resetUsingHARemoteCommandOriginTest() {
+    NetworkState state;
+
+    // Test HA REMOTE COMMAND + User COMMAND + DB CONNECTION origins
+    state.disableService(NetworkState::USER_COMMAND);
+    checkNetworkState(state, true, false, {}, {}, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, false, {}, { 2000 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, false, {}, { 2000 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, false, {}, { 2000 }, true);
+    state.disableService(NetworkState::DB_CONNECTION);
+    checkNetworkState(state, true, true, {}, { 2000 }, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND);
+    checkNetworkState(state, true, true, { 1000 }, { 2000 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, true, { 1000 }, {}, true);
+    state.enableService(NetworkState::USER_COMMAND);
+    checkNetworkState(state, false, true, { 1000 }, {}, true);
+    state.enableService(NetworkState::HA_LOCAL_COMMAND);
+    checkNetworkState(state, false, true, {}, {}, true);
+    state.enableService(NetworkState::DB_CONNECTION);
+    checkNetworkState(state, false, false, {}, {}, false);
+
+    // Test HA REMOTE COMMAND + User COMMAND + DB CONNECTION origins
+    state.disableService(NetworkState::USER_COMMAND);
+    checkNetworkState(state, true, false, {}, {}, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, false, {}, { 2000 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND + 1);
+    checkNetworkState(state, true, false, {}, { 2000, 2001 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND + 2);
+    checkNetworkState(state, true, false, {}, { 2000, 2001, 2002 }, true);
+    state.disableService(NetworkState::DB_CONNECTION);
+    checkNetworkState(state, true, true, {}, { 2000, 2001, 2002 }, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND);
+    checkNetworkState(state, true, true, { 1000 }, { 2000, 2001, 2002 }, true);
+    state.enableService(NetworkState::USER_COMMAND);
+    checkNetworkState(state, false, true, { 1000 }, { 2000, 2001, 2002 }, true);
+    state.enableService(NetworkState::HA_LOCAL_COMMAND);
+    checkNetworkState(state, false, true, {}, { 2000, 2001, 2002 }, true);
+    state.enableService(NetworkState::DB_CONNECTION);
+    checkNetworkState(state, false, false, {}, { 2000, 2001, 2002 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, { 2001, 2002 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND + 1);
+    checkNetworkState(state, false, false, {}, { 2002}, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND + 2);
+    checkNetworkState(state, false, false, {}, {}, false);
+
+    // Test HA REMOTE COMMAND + User COMMAND + DB CONNECTION origins
+    state.disableService(NetworkState::USER_COMMAND);
+    checkNetworkState(state, true, false, {}, {}, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, false, {}, { 2000 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND + 1);
+    checkNetworkState(state, true, false, {}, { 2000, 2001 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND + 2);
+    checkNetworkState(state, true, false, {}, { 2000, 2001, 2002 }, true);
+    state.disableService(NetworkState::DB_CONNECTION);
+    checkNetworkState(state, true, true, {}, { 2000, 2001, 2002 }, true);
+    state.disableService(NetworkState::HA_LOCAL_COMMAND);
+    checkNetworkState(state, true, true, { 1000 }, { 2000, 2001, 2002 }, true);
+    state.enableService(NetworkState::USER_COMMAND);
+    checkNetworkState(state, false, true, { 1000 }, { 2000, 2001, 2002 }, true);
+    state.enableService(NetworkState::HA_LOCAL_COMMAND);
+    checkNetworkState(state, false, true, {}, { 2000, 2001, 2002 }, true);
+    state.enableService(NetworkState::DB_CONNECTION);
+    checkNetworkState(state, false, false, {}, { 2000, 2001, 2002 }, true);
+    state.resetForRemoteCommands();
+    checkNetworkState(state, false, false, {}, {}, false);
+
+    // Test HA RELOTE COMMAND origin only
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, { 2000 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, { 2000 }, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, { 2000 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, {}, false);
 }
 
 // This test verifies that reset works, so that internal state is  reset after
@@ -484,42 +706,46 @@ NetworkStateTest::resetUsingHACommandOriginTest() {
 // 8. Reset using 'DB connection' origin (expect enabled state).
 void
 NetworkStateTest::resetUsingDBConnectionOriginTest() {
-    NetworkState state(NetworkState::DHCPv4);
+    NetworkState state;
 
     // Test DB CONNECTION + User COMMAND + HA COMMAND origins
     state.disableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, {}, {}, true);
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, { 1000 }, {}, true);
+    state.disableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, true, false, { 1000 }, { 2000 }, true);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, true, { 1000 }, { 2000 }, true);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, true, { 1000 }, { 2000 }, true);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, true, { 1000 }, { 2000 }, true);
     state.resetForDbConnection();
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, true, false, { 1000 }, { 2000 }, true);
     state.enableService(NetworkState::USER_COMMAND);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, { 1000 }, { 2000 }, true);
     state.enableService(NetworkState::HA_LOCAL_COMMAND);
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, { 2000 }, true);
+    state.enableService(NetworkState::HA_REMOTE_COMMAND);
+    checkNetworkState(state, false, false, {}, {}, false);
 
     // Test DB CONNECTION origin only
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, {}, true);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, {}, true);
     state.disableService(NetworkState::DB_CONNECTION);
-    EXPECT_FALSE(state.isServiceEnabled());
+    checkNetworkState(state, false, true, {}, {}, true);
     state.resetForDbConnection();
-    EXPECT_TRUE(state.isServiceEnabled());
+    checkNetworkState(state, false, false, {}, {}, false);
 }
 
 // This test verifies that it is possible to setup delayed execution of enableAll
 // function.
 void
 NetworkStateTest::delayedEnableServiceTest() {
-    NetworkState state(NetworkState::DHCPv4);
+    NetworkState state;
     // Disable the service and then schedule enabling it in 1 second.
     state.disableService(NetworkState::USER_COMMAND);
     state.delayedEnableService(1, NetworkState::USER_COMMAND);
@@ -545,7 +771,7 @@ NetworkStateTest::delayedEnableServiceTest() {
 // scheduled for automatically enabling it.
 void
 NetworkStateTest::earlyEnableServiceTest() {
-    NetworkState state(NetworkState::DHCPv4);
+    NetworkState state;
     // Disable the service.
     state.disableService(NetworkState::USER_COMMAND);
     EXPECT_FALSE(state.isServiceEnabled());
@@ -562,7 +788,7 @@ NetworkStateTest::earlyEnableServiceTest() {
 // and that it results in only one timer being scheduled.
 void
 NetworkStateTest::multipleDelayedEnableServiceTest() {
-    NetworkState state(NetworkState::DHCPv4);
+    NetworkState state;
     // Disable the service and then schedule enabling it in 5 second.
     state.disableService(NetworkState::USER_COMMAND);
     // Schedule the first timer for 5 seconds.
@@ -584,7 +810,7 @@ NetworkStateTest::multipleDelayedEnableServiceTest() {
 // from different origins and that it results in each timer being scheduled.
 void
 NetworkStateTest::multipleDifferentOriginsDelayedEnableServiceTest() {
-    NetworkState state(NetworkState::DHCPv4);
+    NetworkState state;
     // Disable the service and then schedule enabling it in 5 second.
     state.disableService(NetworkState::HA_LOCAL_COMMAND);
     // Disable the service and then schedule enabling it in 2 second.
@@ -621,76 +847,49 @@ TEST_F(NetworkStateTest, defaultTestMultiThreading) {
     defaultTest();
 }
 
-TEST_F(NetworkStateTest, disableEnableService4UsingUserCommandOriginTest) {
-    disableEnableService4UsingUserCommandOriginTest();
+TEST_F(NetworkStateTest, disableEnableServiceUsingUserCommandOriginTest) {
+    disableEnableServiceUsingUserCommandOriginTest();
 }
 
-TEST_F(NetworkStateTest, disableEnableService4UsingUserCommandOriginTestMultilThreading) {
+TEST_F(NetworkStateTest, disableEnableServiceUsingUserCommandOriginTestMultilThreading) {
     MultiThreadingMgr::instance().setMode(true);
-    disableEnableService4UsingUserCommandOriginTest();
+    disableEnableServiceUsingUserCommandOriginTest();
 }
 
-TEST_F(NetworkStateTest, disableEnableService4UsingHACommandOriginTest) {
-    disableEnableService4UsingHACommandOriginTest();
+TEST_F(NetworkStateTest, disableEnableServiceUsingHALocalCommandOriginTest) {
+    disableEnableServiceUsingHALocalCommandOriginTest();
 }
 
-TEST_F(NetworkStateTest, disableEnableService4UsingHACommandOriginTestMultiThreading) {
+TEST_F(NetworkStateTest, disableEnableServiceUsingHALocalCommandOriginTestMultiThreading) {
     MultiThreadingMgr::instance().setMode(true);
-    disableEnableService4UsingHACommandOriginTest();
+    disableEnableServiceUsingHALocalCommandOriginTest();
 }
 
-TEST_F(NetworkStateTest, disableEnableService4UsingDBConnectionOriginTest) {
-    disableEnableService4UsingDBConnectionOriginTest();
+TEST_F(NetworkStateTest, disableEnableServiceUsingHARemoteCommandOriginTest) {
+    disableEnableServiceUsingHARemoteCommandOriginTest();
 }
 
-TEST_F(NetworkStateTest, disableEnableService4UsingDBConnectionOriginTestMultiThreading) {
+TEST_F(NetworkStateTest, disableEnableServiceUsingHARemoteCommandOriginTestMultiThreading) {
     MultiThreadingMgr::instance().setMode(true);
-    disableEnableService4UsingDBConnectionOriginTest();
+    disableEnableServiceUsingHARemoteCommandOriginTest();
 }
 
-TEST_F(NetworkStateTest, disableEnableService4UsingMultipleOriginsTest) {
-    disableEnableService4UsingMultipleOriginsTest();
+TEST_F(NetworkStateTest, disableEnableServiceUsingDBConnectionOriginTest) {
+    disableEnableServiceUsingDBConnectionOriginTest();
 }
 
-TEST_F(NetworkStateTest, disableEnableService4UsingMultipleOriginsTestMultiThreading) {
+TEST_F(NetworkStateTest, disableEnableServiceUsingDBConnectionOriginTestMultiThreading) {
     MultiThreadingMgr::instance().setMode(true);
-    disableEnableService4UsingMultipleOriginsTest();
+    disableEnableServiceUsingDBConnectionOriginTest();
 }
 
-TEST_F(NetworkStateTest, disableEnableService6UsingUserCommandOriginTest) {
-    disableEnableService6UsingUserCommandOriginTest();
+TEST_F(NetworkStateTest, disableEnableServiceUsingMultipleOriginsTest) {
+    disableEnableServiceUsingMultipleOriginsTest();
 }
 
-TEST_F(NetworkStateTest, disableEnableService6UsingUserCommandOriginTestMultiThreading) {
+TEST_F(NetworkStateTest, disableEnableServiceUsingMultipleOriginsTestMultiThreading) {
     MultiThreadingMgr::instance().setMode(true);
-    disableEnableService6UsingUserCommandOriginTest();
-}
-
-TEST_F(NetworkStateTest, disableEnableService6UsingHACommandOriginTest) {
-    disableEnableService6UsingHACommandOriginTest();
-}
-
-TEST_F(NetworkStateTest, disableEnableService6UsingHACommandOriginTestMultiThreading) {
-    MultiThreadingMgr::instance().setMode(true);
-    disableEnableService6UsingHACommandOriginTest();
-}
-
-TEST_F(NetworkStateTest, disableEnableService6UsingDBConnectionOriginTest) {
-    disableEnableService6UsingDBConnectionOriginTest();
-}
-
-TEST_F(NetworkStateTest, disableEnableService6UsingDBConnectionOriginTestMultiThreading) {
-    MultiThreadingMgr::instance().setMode(true);
-    disableEnableService6UsingDBConnectionOriginTest();
-}
-
-TEST_F(NetworkStateTest, disableEnableService6UsingMultipleOriginsTest) {
-    disableEnableService6UsingMultipleOriginsTest();
-}
-
-TEST_F(NetworkStateTest, disableEnableService6UsingMultipleOriginsTestMultiThreading) {
-    MultiThreadingMgr::instance().setMode(true);
-    disableEnableService6UsingMultipleOriginsTest();
+    disableEnableServiceUsingMultipleOriginsTest();
 }
 
 TEST_F(NetworkStateTest, resetUsingUserCommandOriginTest) {
@@ -711,13 +910,22 @@ TEST_F(NetworkStateTest, resetUsingDBConnectionOriginTestMultiThreading) {
     resetUsingDBConnectionOriginTest();
 }
 
-TEST_F(NetworkStateTest, resetUsingHACommandOriginTest) {
-    resetUsingHACommandOriginTest();
+TEST_F(NetworkStateTest, resetUsingHALocalCommandOriginTest) {
+    resetUsingHALocalCommandOriginTest();
+}
+
+TEST_F(NetworkStateTest, resetUsingHALocalCommandOriginTestMultiThreading) {
+    MultiThreadingMgr::instance().setMode(true);
+    resetUsingHALocalCommandOriginTest();
+}
+
+TEST_F(NetworkStateTest, resetUsingHARemoteCommandOriginTest) {
+    resetUsingHARemoteCommandOriginTest();
 }
 
-TEST_F(NetworkStateTest, resetUsingHACommandOriginTestMultiThreading) {
+TEST_F(NetworkStateTest, resetUsingHARemoteCommandOriginTestMultiThreading) {
     MultiThreadingMgr::instance().setMode(true);
-    resetUsingHACommandOriginTest();
+    resetUsingHARemoteCommandOriginTest();
 }
 
 TEST_F(NetworkStateTest, delayedEnableServiceTest) {