| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 1 | // Copyright 2023 The ChromiumOS Authors |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "patchpanel/clat_service.h" |
| 6 | |
| 7 | #include <optional> |
| 8 | #include <string> |
| 9 | #include <vector> |
| 10 | |
| Jie Jiang | e970cc2 | 2024-06-12 07:03:10 | [diff] [blame] | 11 | #include <chromeos/net-base/ip_address_utils.h> |
| 12 | #include <chromeos/net-base/ipv4_address.h> |
| 13 | #include <chromeos/net-base/ipv6_address.h> |
| 14 | #include <chromeos/net-base/mock_process_manager.h> |
| 15 | #include <chromeos/net-base/process_manager.h> |
| 16 | #include <chromeos/net-base/technology.h> |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 17 | #include <gmock/gmock.h> |
| 18 | #include <gtest/gtest.h> |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 19 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 20 | #include "patchpanel/datapath.h" |
| Chih-Yu Huang | 3ac5685 | 2024-07-16 09:19:28 | [diff] [blame] | 21 | #include "patchpanel/fake_process_runner.h" |
| naoyatezuka | c8ebb46 | 2023-09-21 10:52:33 | [diff] [blame] | 22 | #include "patchpanel/iptables.h" |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 23 | #include "patchpanel/mock_datapath.h" |
| Jie Jiang | 3fd49e7 | 2024-09-13 13:23:51 | [diff] [blame] | 24 | #include "patchpanel/mock_system.h" |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 25 | #include "patchpanel/shill_client.h" |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 26 | #include "patchpanel/system.h" |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 27 | |
| 28 | using testing::_; |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 29 | using testing::Eq; |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 30 | using testing::Exactly; |
| 31 | using testing::Invoke; |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 32 | using testing::IsEmpty; |
| Hugo Benichi | 55004b4 | 2025-01-27 15:34:06 | [diff] [blame] | 33 | using testing::Mock; |
| Jie Jiang | 4db8557 | 2024-09-13 14:04:43 | [diff] [blame] | 34 | using testing::NiceMock; |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 35 | using testing::Return; |
| 36 | using testing::StrEq; |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 37 | |
| 38 | namespace patchpanel { |
| 39 | namespace { |
| 40 | |
| 41 | MATCHER_P(ShillDeviceHasInterfaceName, expected_ifname, "") { |
| 42 | return arg.ifname == expected_ifname; |
| 43 | } |
| 44 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 45 | MATCHER_P(CIDRHasPrefix, expected_prefix_str, "") { |
| 46 | return net_base::IPv6CIDR::CreateFromCIDRString(expected_prefix_str) |
| 47 | ->InSameSubnetWith(arg.address()); |
| 48 | } |
| 49 | |
| 50 | MATCHER_P(AddressHasPrefix, expected_prefix_str, "") { |
| 51 | return net_base::IPv6CIDR::CreateFromCIDRString(expected_prefix_str) |
| 52 | ->InSameSubnetWith(arg); |
| 53 | } |
| 54 | |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 55 | class ClatServiceUnderTest : public ClatService { |
| 56 | public: |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 57 | ClatServiceUnderTest(Datapath* datapath, |
| Chih-Yu Huang | f4449c2 | 2023-12-13 06:31:16 | [diff] [blame] | 58 | net_base::ProcessManager* process_manager, |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 59 | System* system) |
| 60 | : ClatService(datapath, process_manager, system) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 61 | ON_CALL(*this, StartClat(_)) |
| 62 | .WillByDefault( |
| 63 | (Invoke(this, &ClatServiceUnderTest::SetClatRunningDeviceForTest))); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 64 | ON_CALL(*this, StopClat(true)) |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 65 | .WillByDefault( |
| 66 | Invoke(this, &ClatServiceUnderTest::ResetClatRunningDeviceForTest)); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 67 | Enable(); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 68 | } |
| 69 | |
| 70 | MOCK_METHOD(void, |
| 71 | StartClat, |
| 72 | (const ShillClient::Device& shill_device), |
| 73 | (override)); |
| 74 | |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 75 | MOCK_METHOD(void, StopClat, (bool clear_running_device), (override)); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 76 | }; |
| 77 | |
| 78 | constexpr char kIPv4CIDR[] = "10.10.0.2/16"; |
| 79 | constexpr char kIPv6CIDR[] = "2001:db8::1/64"; |
| 80 | |
| 81 | ShillClient::Device MakeFakeShillDevice(const std::string& ifname, |
| 82 | int ifindex) { |
| 83 | ShillClient::Device dev; |
| Chih-Yu Huang | 8194a03 | 2024-04-22 06:35:55 | [diff] [blame] | 84 | dev.technology = net_base::Technology::kEthernet; |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 85 | dev.ifindex = ifindex; |
| 86 | dev.ifname = ifname; |
| 87 | |
| 88 | return dev; |
| 89 | } |
| 90 | |
| 91 | ShillClient::Device MakeFakeIPv4OnlyShillDevice( |
| 92 | const std::string& ifname, |
| 93 | int ifindex = 1, |
| 94 | const char ipv4_cidr[] = kIPv4CIDR) { |
| 95 | ShillClient::Device dev = MakeFakeShillDevice(ifname, ifindex); |
| Taoyu Li | 110deb4 | 2024-08-21 08:51:28 | [diff] [blame] | 96 | dev.network_config.ipv4_address = |
| 97 | net_base::IPv4CIDR::CreateFromCIDRString(ipv4_cidr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 98 | |
| 99 | return dev; |
| 100 | } |
| 101 | |
| 102 | ShillClient::Device MakeFakeIPv6OnlyShillDevice( |
| 103 | const std::string& ifname, |
| 104 | int ifindex = 1, |
| Hugo Benichi | 55004b4 | 2025-01-27 15:34:06 | [diff] [blame] | 105 | const char ipv6_cidr[] = kIPv6CIDR, |
| 106 | std::optional<net_base::IPv6CIDR> pref64 = std::nullopt) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 107 | ShillClient::Device dev = MakeFakeShillDevice(ifname, ifindex); |
| Taoyu Li | 110deb4 | 2024-08-21 08:51:28 | [diff] [blame] | 108 | dev.network_config.ipv6_addresses = { |
| 109 | *net_base::IPv6CIDR::CreateFromCIDRString(ipv6_cidr)}; |
| Hugo Benichi | 55004b4 | 2025-01-27 15:34:06 | [diff] [blame] | 110 | dev.network_config.pref64 = pref64; |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 111 | return dev; |
| 112 | } |
| 113 | |
| 114 | ShillClient::Device MakeFakeDualStackShillDevice( |
| 115 | const std::string& ifname, |
| 116 | int ifindex = 1, |
| 117 | const char ipv4_cidr[] = kIPv4CIDR, |
| 118 | const char ipv6_cidr[] = kIPv6CIDR) { |
| 119 | ShillClient::Device dev = MakeFakeShillDevice(ifname, ifindex); |
| Taoyu Li | 110deb4 | 2024-08-21 08:51:28 | [diff] [blame] | 120 | dev.network_config.ipv4_address = |
| 121 | net_base::IPv4CIDR::CreateFromCIDRString(ipv4_cidr); |
| 122 | dev.network_config.ipv6_addresses = { |
| 123 | *net_base::IPv6CIDR::CreateFromCIDRString(ipv6_cidr)}; |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 124 | |
| 125 | return dev; |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 126 | } // namespace |
| 127 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 128 | class ClatServiceTest : public ::testing::Test { |
| 129 | protected: |
| Chih-Yu Huang | 3ac5685 | 2024-07-16 09:19:28 | [diff] [blame] | 130 | ClatServiceTest() |
| 131 | : datapath_(&process_runner_, &system_), |
| 132 | target_(&datapath_, &process_manager_, &system_) {} |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 133 | |
| Chih-Yu Huang | 3ac5685 | 2024-07-16 09:19:28 | [diff] [blame] | 134 | FakeProcessRunner process_runner_; |
| Jie Jiang | 4db8557 | 2024-09-13 14:04:43 | [diff] [blame] | 135 | NiceMock<MockSystem> system_; |
| 136 | NiceMock<MockDatapath> datapath_; |
| 137 | NiceMock<net_base::MockProcessManager> process_manager_; |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 138 | ClatServiceUnderTest target_; |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 139 | }; |
| 140 | |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 141 | // TODO(b/278970851): Merge tests for OnShillDefaultLogicalDeviceChanged into a |
| 142 | // single test with a testcase data array. |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 143 | TEST_F(ClatServiceTest, ChangeFromIPv4DeviceToIPv6OnlyDevice) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 144 | const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 1); |
| 145 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2); |
| 146 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 147 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("v6only"))); |
| 148 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, &v4only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 149 | } |
| 150 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 151 | TEST_F(ClatServiceTest, ChangeFromIPv6OnlyDeviceToIPv4Device) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 152 | const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 1); |
| 153 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2); |
| 154 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 155 | // Start CLAT on the new_device. |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 156 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 157 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 158 | EXPECT_CALL(target_, StopClat(true)); |
| 159 | target_.OnShillDefaultLogicalDeviceChanged(&v4only_dev, &v6only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 160 | } |
| 161 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 162 | TEST_F(ClatServiceTest, ChangeFromIPv6OnlyDeviceToAnother) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 163 | const auto new_v6only_dev = |
| 164 | MakeFakeIPv6OnlyShillDevice("new_v6only", 1, "1020:db8::1/64"); |
| 165 | const auto prev_v6only_dev = |
| 166 | MakeFakeIPv6OnlyShillDevice("prev_v6only", 1, "2001:db8::2/64"); |
| 167 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 168 | // Start CLAT on the new_device. |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 169 | target_.OnShillDefaultLogicalDeviceChanged(&prev_v6only_dev, nullptr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 170 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 171 | EXPECT_CALL(target_, StopClat(true)); |
| 172 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("new_v6only"))); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 173 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 174 | target_.OnShillDefaultLogicalDeviceChanged(&new_v6only_dev, &prev_v6only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 175 | } |
| 176 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 177 | TEST_F(ClatServiceTest, ChangeFromDualStackDeviceToIPv4OnlyDevice) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 178 | const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1); |
| 179 | const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 2); |
| 180 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 181 | target_.OnShillDefaultLogicalDeviceChanged(&dual_dev, nullptr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 182 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 183 | EXPECT_CALL(target_, StopClat(_)).Times(Exactly(0)); |
| 184 | EXPECT_CALL(target_, StartClat(_)).Times(Exactly(0)); |
| 185 | target_.OnShillDefaultLogicalDeviceChanged(&v4only_dev, &dual_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 186 | } |
| 187 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 188 | TEST_F(ClatServiceTest, ChangeFromIPv4OnlyDeviceToDualStackDevice) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 189 | const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1); |
| 190 | const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 2); |
| 191 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 192 | target_.OnShillDefaultLogicalDeviceChanged(&v4only_dev, nullptr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 193 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 194 | EXPECT_CALL(target_, StopClat(_)).Times(Exactly(0)); |
| 195 | EXPECT_CALL(target_, StartClat(_)).Times(Exactly(0)); |
| 196 | target_.OnShillDefaultLogicalDeviceChanged(&dual_dev, &v4only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 197 | } |
| 198 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 199 | TEST_F(ClatServiceTest, ChangeFromDualStackDeviceToIPv6OnlyDevice) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 200 | const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1); |
| 201 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2); |
| 202 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 203 | target_.OnShillDefaultLogicalDeviceChanged(&dual_dev, nullptr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 204 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 205 | EXPECT_CALL(target_, StopClat(_)).Times(Exactly(0)); |
| 206 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("v6only"))); |
| 207 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, &dual_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 208 | } |
| 209 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 210 | TEST_F(ClatServiceTest, ChangeFromIPv6OnlyDeviceToDualStackDevice) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 211 | const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1); |
| 212 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2); |
| 213 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 214 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 215 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 216 | EXPECT_CALL(target_, StopClat(true)); |
| 217 | EXPECT_CALL(target_, StartClat(_)).Times(Exactly(0)); |
| 218 | target_.OnShillDefaultLogicalDeviceChanged(&dual_dev, &v6only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 219 | } |
| 220 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 221 | TEST_F(ClatServiceTest, ChangeFromDualStackDeviceToAnother) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 222 | const auto new_v6only_dev = MakeFakeDualStackShillDevice( |
| 223 | "new_dual_dev", 1, "10.10.0.2/24", "1020:db8::1/64"); |
| 224 | |
| 225 | const auto prev_v6only_dev = MakeFakeDualStackShillDevice( |
| 226 | "prev_dual_dev", 2, "10.20.0.2/24", "2001:db8::1/64"); |
| 227 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 228 | target_.OnShillDefaultLogicalDeviceChanged(&prev_v6only_dev, nullptr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 229 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 230 | EXPECT_CALL(target_, StopClat(_)).Times(Exactly(0)); |
| 231 | EXPECT_CALL(target_, StartClat(_)).Times(Exactly(0)); |
| 232 | target_.OnShillDefaultLogicalDeviceChanged(&new_v6only_dev, &prev_v6only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 233 | } |
| 234 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 235 | TEST_F(ClatServiceTest, ChangeFromNonExstingDeviceToExistingDevice) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 236 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only"); |
| 237 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 238 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("v6only"))); |
| 239 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 240 | } |
| 241 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 242 | TEST_F(ClatServiceTest, ChangeFromExstingDeviceToNonExistingDevice) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 243 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only"); |
| 244 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 245 | // Start CLAT on the new_device. |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 246 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 247 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 248 | EXPECT_CALL(target_, StopClat(true)); |
| 249 | EXPECT_CALL(target_, StartClat(_)).Times(Exactly(0)); |
| 250 | target_.OnShillDefaultLogicalDeviceChanged(nullptr, &v6only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 251 | } |
| 252 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 253 | TEST_F(ClatServiceTest, |
| 254 | DefaultDeviceChangeWhileClatIsRunningOnDifferentDevice) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 255 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1); |
| 256 | const auto prev_v6only_dev = |
| 257 | MakeFakeIPv6OnlyShillDevice("new_v6only", 2, "1020:db8::1/64"); |
| 258 | const auto new_v6only_dev = |
| 259 | MakeFakeIPv6OnlyShillDevice("prev_v6only", 3, "1030:db8::1/64"); |
| 260 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 261 | // Start CLAT on device "v6only_dev1". |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 262 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 263 | |
| 264 | // Unexpectedly the default logical device changes from an device different |
| 265 | // from v6only_dev1 to another. |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 266 | EXPECT_CALL(target_, StopClat(true)); |
| 267 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("new_v6only"))); |
| 268 | target_.OnShillDefaultLogicalDeviceChanged(&prev_v6only_dev, |
| 269 | &prev_v6only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 270 | } |
| 271 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 272 | TEST_F(ClatServiceTest, NewDefaultDeviceIsTheSameWithClatDevice) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 273 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1); |
| 274 | const auto dual_dev = MakeFakeDualStackShillDevice("dual", 2); |
| 275 | |
| Hugo Benichi | 55004b4 | 2025-01-27 15:34:06 | [diff] [blame] | 276 | EXPECT_CALL(target_, StartClat); |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 277 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| Hugo Benichi | 55004b4 | 2025-01-27 15:34:06 | [diff] [blame] | 278 | Mock::VerifyAndClearExpectations(&target_); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 279 | |
| Hugo Benichi | 55004b4 | 2025-01-27 15:34:06 | [diff] [blame] | 280 | EXPECT_CALL(target_, StopClat).Times(Exactly(0)); |
| 281 | EXPECT_CALL(target_, StartClat).Times(Exactly(0)); |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 282 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, &dual_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 283 | } |
| 284 | |
| Hugo Benichi | 55004b4 | 2025-01-27 15:34:06 | [diff] [blame] | 285 | TEST_F(ClatServiceTest, DefaultDeviceChangeToDefaultNAT64Prefix) { |
| 286 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1); |
| 287 | auto v6only_dev2 = MakeFakeIPv6OnlyShillDevice( |
| 288 | "v6only", 1, kIPv6CIDR, |
| 289 | net_base::IPv6CIDR::CreateFromCIDRString("64:ff9b::/96")); |
| 290 | |
| 291 | EXPECT_CALL(target_, StartClat); |
| 292 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| 293 | Mock::VerifyAndClearExpectations(&target_); |
| 294 | |
| 295 | EXPECT_CALL(target_, StopClat).Times(0); |
| 296 | EXPECT_CALL(target_, StartClat).Times(0); |
| 297 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev2, &v6only_dev); |
| 298 | } |
| 299 | |
| 300 | TEST_F(ClatServiceTest, DefaultDeviceLosesDefaultNAT64Prefix) { |
| 301 | auto v6only_dev = MakeFakeIPv6OnlyShillDevice( |
| 302 | "v6only", 1, kIPv6CIDR, |
| 303 | net_base::IPv6CIDR::CreateFromCIDRString("64:ff9b::/96")); |
| 304 | const auto v6only_dev2 = MakeFakeIPv6OnlyShillDevice("v6only", 1); |
| 305 | |
| 306 | EXPECT_CALL(target_, StartClat); |
| 307 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| 308 | Mock::VerifyAndClearExpectations(&target_); |
| 309 | |
| 310 | EXPECT_CALL(target_, StopClat).Times(0); |
| 311 | EXPECT_CALL(target_, StartClat).Times(0); |
| 312 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev2, &v6only_dev); |
| 313 | } |
| 314 | |
| 315 | TEST_F(ClatServiceTest, DefaultDeviceChangeToNonDefaultNAT64Prefix) { |
| 316 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1); |
| 317 | auto v6only_dev2 = MakeFakeIPv6OnlyShillDevice( |
| 318 | "v6only", 1, kIPv6CIDR, |
| 319 | net_base::IPv6CIDR::CreateFromCIDRString("2001:db8::/32")); |
| 320 | |
| 321 | EXPECT_CALL(target_, StartClat); |
| 322 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| 323 | Mock::VerifyAndClearExpectations(&target_); |
| 324 | |
| 325 | EXPECT_CALL(target_, StopClat); |
| 326 | EXPECT_CALL(target_, StartClat); |
| 327 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev2, &v6only_dev); |
| 328 | } |
| 329 | |
| 330 | TEST_F(ClatServiceTest, DefaultDeviceLosesNonDefaultNAT64Prefix) { |
| 331 | auto v6only_dev = MakeFakeIPv6OnlyShillDevice( |
| 332 | "v6only", 1, kIPv6CIDR, |
| 333 | net_base::IPv6CIDR::CreateFromCIDRString("2001:db8::/32")); |
| 334 | const auto v6only_dev2 = MakeFakeIPv6OnlyShillDevice("v6only", 1); |
| 335 | |
| 336 | EXPECT_CALL(target_, StartClat); |
| 337 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| 338 | Mock::VerifyAndClearExpectations(&target_); |
| 339 | |
| 340 | EXPECT_CALL(target_, StopClat); |
| 341 | EXPECT_CALL(target_, StartClat); |
| 342 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev2, &v6only_dev); |
| 343 | } |
| 344 | |
| 345 | TEST_F(ClatServiceTest, DefaultDeviceNAT64PrefixChange) { |
| 346 | auto v6only_dev = MakeFakeIPv6OnlyShillDevice( |
| 347 | "v6only", 1, kIPv6CIDR, |
| 348 | net_base::IPv6CIDR::CreateFromCIDRString("2001:db8:1::/48")); |
| 349 | auto v6only_dev2 = MakeFakeIPv6OnlyShillDevice( |
| 350 | "v6only", 1, kIPv6CIDR, |
| 351 | net_base::IPv6CIDR::CreateFromCIDRString("2001:db8:2::/48")); |
| 352 | |
| 353 | EXPECT_CALL(target_, StartClat); |
| 354 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| 355 | Mock::VerifyAndClearExpectations(&target_); |
| 356 | |
| 357 | EXPECT_CALL(target_, StopClat); |
| 358 | EXPECT_CALL(target_, StartClat); |
| 359 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev2, &v6only_dev); |
| 360 | } |
| 361 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 362 | TEST_F(ClatServiceTest, |
| 363 | ChangeFromDualStackDeviceToIPv6OnlyDeviceWhileDisabled) { |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 364 | const auto dual_dev = MakeFakeDualStackShillDevice("dual", 1); |
| 365 | const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2); |
| 366 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 367 | target_.OnShillDefaultLogicalDeviceChanged(&dual_dev, nullptr); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 368 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 369 | EXPECT_CALL(target_, StopClat(false)); |
| 370 | target_.Disable(); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 371 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 372 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("v6only"))); |
| 373 | target_.OnShillDefaultLogicalDeviceChanged(&v6only_dev, &dual_dev); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 374 | |
| 375 | // The default logical device is IPv6-only, so CLAT starts immdiately after |
| 376 | // it's enabled. |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 377 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("v6only"))); |
| 378 | target_.Enable(); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 379 | } |
| 380 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 381 | TEST_F(ClatServiceTest, IPv6OnlyDeviceGetIPv4Address) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 382 | auto default_logical_device = MakeFakeIPv6OnlyShillDevice("v6only"); |
| 383 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 384 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("v6only"))); |
| 385 | target_.OnDefaultLogicalDeviceIPConfigChanged(default_logical_device); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 386 | |
| 387 | // The default logical device gets IPv4 address because of IPConfig changes. |
| Taoyu Li | 110deb4 | 2024-08-21 08:51:28 | [diff] [blame] | 388 | default_logical_device.network_config.ipv4_address = |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 389 | net_base::IPv4CIDR::CreateFromCIDRString(kIPv4CIDR); |
| 390 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 391 | EXPECT_CALL(target_, StopClat(true)); |
| 392 | target_.OnDefaultLogicalDeviceIPConfigChanged(default_logical_device); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 393 | } |
| 394 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 395 | TEST_F(ClatServiceTest, DeviceLoseIPv4Address) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 396 | auto default_logical_device = MakeFakeDualStackShillDevice("dual_stack", 1); |
| 397 | |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 398 | // The default logical device loses IPv4 address because of IPConfig changes. |
| Taoyu Li | 110deb4 | 2024-08-21 08:51:28 | [diff] [blame] | 399 | default_logical_device.network_config.ipv4_address.reset(); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 400 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 401 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("dual_stack"))); |
| 402 | target_.OnDefaultLogicalDeviceIPConfigChanged(default_logical_device); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 403 | } |
| 404 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 405 | TEST_F(ClatServiceTest, IPConfigChangeWithoutIPv6AddressChange) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 406 | auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only"); |
| Taoyu Li | 110deb4 | 2024-08-21 08:51:28 | [diff] [blame] | 407 | v6only_dev.network_config.dns_servers = { |
| 408 | *net_base::IPAddress::CreateFromString("8.8.8.8")}; |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 409 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 410 | target_.OnDefaultLogicalDeviceIPConfigChanged(v6only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 411 | |
| Taoyu Li | 110deb4 | 2024-08-21 08:51:28 | [diff] [blame] | 412 | v6only_dev.network_config.dns_servers = { |
| 413 | *net_base::IPAddress::CreateFromString("1.1.1.1")}; |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 414 | |
| 415 | // This change has nothing with CLAT. |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 416 | EXPECT_CALL(target_, StopClat(_)).Times(Exactly(0)); |
| 417 | EXPECT_CALL(target_, StartClat(_)).Times(Exactly(0)); |
| 418 | target_.OnDefaultLogicalDeviceIPConfigChanged(v6only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 419 | } |
| 420 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 421 | TEST_F(ClatServiceTest, IPv6AddressChangeInTheSamePrefix) { |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 422 | auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1, "2001:db8::1/64"); |
| 423 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 424 | target_.OnDefaultLogicalDeviceIPConfigChanged(v6only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 425 | |
| Taoyu Li | 110deb4 | 2024-08-21 08:51:28 | [diff] [blame] | 426 | v6only_dev.network_config.ipv6_addresses = { |
| 427 | *net_base::IPv6CIDR::CreateFromCIDRString("2001:db8::2/64")}; |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 428 | |
| 429 | // Even the new IPn6 address of the default logical device has the same prefix |
| 430 | // as the old one, CLAT needs to be reconfigured because the new address |
| 431 | // conflict with the IPv6 address used by CLAT. |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 432 | EXPECT_CALL(target_, StopClat(true)); |
| 433 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("v6only"))); |
| 434 | target_.OnDefaultLogicalDeviceIPConfigChanged(v6only_dev); |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 435 | } |
| 436 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 437 | TEST_F(ClatServiceTest, EnabledAfterGettingIPv4AddressWhileDisabled) { |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 438 | auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only"); |
| 439 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 440 | target_.OnDefaultLogicalDeviceIPConfigChanged(v6only_dev); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 441 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 442 | EXPECT_CALL(target_, StopClat(false)); |
| 443 | target_.Disable(); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 444 | |
| Taoyu Li | 110deb4 | 2024-08-21 08:51:28 | [diff] [blame] | 445 | v6only_dev.network_config.ipv4_address = |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 446 | net_base::IPv4CIDR::CreateFromCIDRString(kIPv4CIDR); |
| 447 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 448 | EXPECT_CALL(target_, StopClat(true)); |
| 449 | target_.OnDefaultLogicalDeviceIPConfigChanged(v6only_dev); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 450 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 451 | EXPECT_CALL(target_, StartClat(_)).Times(Exactly(0)); |
| 452 | target_.Enable(); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 453 | } |
| 454 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 455 | TEST_F(ClatServiceTest, EnabledAfterBecomingIPv6OnlyWhileDisabled) { |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 456 | auto dual_dev = MakeFakeDualStackShillDevice("dual"); |
| 457 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 458 | target_.OnDefaultLogicalDeviceIPConfigChanged(dual_dev); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 459 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 460 | EXPECT_CALL(target_, StopClat(false)); |
| 461 | target_.Disable(); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 462 | |
| Taoyu Li | 110deb4 | 2024-08-21 08:51:28 | [diff] [blame] | 463 | dual_dev.network_config.ipv4_address.reset(); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 464 | |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 465 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("dual"))); |
| 466 | target_.OnDefaultLogicalDeviceIPConfigChanged(dual_dev); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 467 | |
| 468 | // The default logical device is IPv6-only, so CLAT starts immdiately after |
| 469 | // it's enabled. |
| Chih-Yu Huang | a9c929c | 2024-07-22 04:48:20 | [diff] [blame] | 470 | EXPECT_CALL(target_, StartClat(ShillDeviceHasInterfaceName("dual"))); |
| 471 | target_.Enable(); |
| naoyatezuka | 6e778df | 2023-09-01 00:44:00 | [diff] [blame] | 472 | } |
| 473 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 474 | TEST_F(ClatServiceTest, VerifyStartAndStopClat) { |
| 475 | ClatService target(&datapath_, &process_manager_, &system_); |
| 476 | target.Enable(); |
| 477 | |
| 478 | auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 1); |
| 479 | auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2); |
| 480 | |
| 481 | target.OnShillDefaultLogicalDeviceChanged(&v4only_dev, nullptr); |
| 482 | |
| naoyatezuka | 71a3b77 | 2023-09-29 06:40:13 | [diff] [blame] | 483 | EXPECT_CALL(system_, WriteConfigFile).WillOnce(Return(true)); |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 484 | EXPECT_CALL( |
| 485 | datapath_, |
| 486 | AddTunTap(StrEq("tun_nat64"), Eq(std::nullopt), |
| 487 | net_base::IPv4CIDR::CreateFromCIDRString("192.0.0.1/29"), |
| 488 | IsEmpty(), DeviceMode::kTun)) |
| 489 | .WillOnce(Return("tun_nat64")); |
| naoyatezuka | c8ebb46 | 2023-09-21 10:52:33 | [diff] [blame] | 490 | EXPECT_CALL(datapath_, |
| 491 | ModifyClatAcceptRules(Iptables::Command::kA, StrEq("tun_nat64"))) |
| 492 | .WillOnce(Return(true)); |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 493 | EXPECT_CALL(datapath_, AddIPv6HostRoute(StrEq("tun_nat64"), |
| 494 | CIDRHasPrefix("2001:db8::/64"), |
| 495 | Eq(std::nullopt))) |
| 496 | .WillOnce(Return(true)); |
| 497 | EXPECT_CALL( |
| 498 | datapath_, |
| 499 | AddIPv6NeighborProxy(StrEq("v6only"), AddressHasPrefix("2001:db8::/64"))) |
| 500 | .WillOnce(Return(true)); |
| 501 | EXPECT_CALL(datapath_, AddIPv4RouteToTable(StrEq("tun_nat64"), |
| 502 | net_base::IPv4CIDR(), 249)) |
| 503 | .WillOnce(Return(true)); |
| 504 | // StartClat() is called. |
| 505 | target.OnShillDefaultLogicalDeviceChanged(&v6only_dev, &v4only_dev); |
| 506 | |
| 507 | EXPECT_CALL(datapath_, DeleteIPv4RouteFromTable(StrEq("tun_nat64"), |
| 508 | net_base::IPv4CIDR(), 249)); |
| 509 | EXPECT_CALL(datapath_, |
| 510 | RemoveIPv6NeighborProxy(StrEq("v6only"), |
| 511 | AddressHasPrefix("2001:db8::/64"))); |
| naoyatezuka | c8ebb46 | 2023-09-21 10:52:33 | [diff] [blame] | 512 | EXPECT_CALL(datapath_, |
| 513 | ModifyClatAcceptRules(Iptables::Command::kD, StrEq("tun_nat64"))); |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 514 | EXPECT_CALL(datapath_, RemoveIPv6HostRoute(CIDRHasPrefix("2001:db8::/64"))); |
| 515 | EXPECT_CALL(datapath_, RemoveTunTap(StrEq("tun_nat64"), DeviceMode::kTun)); |
| 516 | // StopClat() is called. |
| 517 | target.OnShillDefaultLogicalDeviceChanged(&v4only_dev, &v6only_dev); |
| 518 | } |
| 519 | |
| naoyatezuka | 71a3b77 | 2023-09-29 06:40:13 | [diff] [blame] | 520 | TEST_F(ClatServiceTest, CleanUpDatapathWhenDisabled) { |
| 521 | ClatService target(&datapath_, &process_manager_, &system_); |
| 522 | target.Enable(); |
| 523 | |
| 524 | auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2); |
| 525 | ON_CALL(system_, WriteConfigFile).WillByDefault(Return(true)); |
| 526 | ON_CALL(datapath_, AddTunTap).WillByDefault(Return("tun_nat64")); |
| 527 | ON_CALL(datapath_, ModifyClatAcceptRules).WillByDefault(Return(true)); |
| 528 | ON_CALL(datapath_, AddIPv6HostRoute).WillByDefault(Return(true)); |
| 529 | ON_CALL(datapath_, AddIPv6NeighborProxy).WillByDefault(Return(true)); |
| 530 | ON_CALL(datapath_, AddIPv4RouteToTable).WillByDefault(Return(true)); |
| 531 | // Start CLAT. |
| 532 | target.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr); |
| 533 | |
| 534 | EXPECT_CALL(datapath_, DeleteIPv4RouteFromTable(StrEq("tun_nat64"), |
| 535 | net_base::IPv4CIDR(), 249)); |
| 536 | EXPECT_CALL(datapath_, |
| 537 | RemoveIPv6NeighborProxy(StrEq("v6only"), |
| 538 | AddressHasPrefix("2001:db8::/64"))); |
| 539 | EXPECT_CALL(datapath_, |
| 540 | ModifyClatAcceptRules(Iptables::Command::kD, StrEq("tun_nat64"))); |
| 541 | EXPECT_CALL(datapath_, RemoveIPv6HostRoute(CIDRHasPrefix("2001:db8::/64"))); |
| 542 | EXPECT_CALL(datapath_, RemoveTunTap(StrEq("tun_nat64"), DeviceMode::kTun)); |
| 543 | target.Disable(); |
| 544 | } |
| 545 | |
| naoyatezuka | ca02c50 | 2023-09-05 06:53:43 | [diff] [blame] | 546 | } // namespace |
| naoyatezuka | 02db5c1 | 2023-08-23 01:46:11 | [diff] [blame] | 547 | } // namespace patchpanel |