BinderTest: Add minimum tests for TetherController add/remove BPF rule methods

Currently, tether offload is controlled by tether BPF map rules.
Need to verify the basic rule access methods.

Test: build, atest
Change-Id: Ib38d9fbfeaaceb165dc41d45a5fbff4547125c78
diff --git a/tests/binder_test.cpp b/tests/binder_test.cpp
index a7b3646..4f6fc07 100644
--- a/tests/binder_test.cpp
+++ b/tests/binder_test.cpp
@@ -3371,3 +3371,51 @@
     EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID2).isOk());
     EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
 }
+
+TEST_F(BinderTest, TetherRuleDownstreamIpv6) {
+    SKIP_IF_BPF_NOT_SUPPORTED;
+
+    // TODO: Perhaps verify invalid interface index once the netd handle the error in methods.
+    constexpr uint32_t kIfaceInt = 101;
+    constexpr uint32_t kIfaceExt = 102;
+    constexpr uint32_t kIfaceNonExistent = 103;
+
+    const std::vector<uint8_t> kAddr6 = {0x20, 0x01, 0x0d, 0xb8, 0xca, 0xfe, 0x00, 0x00,
+                                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88};
+    const std::vector<uint8_t> kSrcMac = {0x00, 0x00, 0x00, 0x00, 0x00, 0x0a};
+    const std::vector<uint8_t> kDstMac = {0x00, 0x00, 0x00, 0x00, 0x00, 0x0b};
+
+    const std::vector<uint8_t> kInvalidAddr4 = {0xac, 0x0a, 0x0d, 0xb8};  // should be IPv6 address
+    const std::vector<uint8_t> kInvalidMac = {0xde, 0xad, 0xbe, 0xef};    // should be 6-byte length
+
+    // Invalid IP address, add rule
+    auto status = mNetd->tetherRuleAddDownstreamIpv6(kIfaceInt, kIfaceExt, kInvalidAddr4 /*bad*/,
+                                                     kSrcMac, kDstMac);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
+
+    // Invalid source L2 address, add rule
+    status = mNetd->tetherRuleAddDownstreamIpv6(kIfaceInt, kIfaceExt, kAddr6, kInvalidMac /*bad*/,
+                                                kDstMac);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
+
+    // Invalid destination L2 address, add rule
+    status = mNetd->tetherRuleAddDownstreamIpv6(kIfaceInt, kIfaceExt, kAddr6, kSrcMac,
+                                                kInvalidMac /*bad*/);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
+
+    // Invalid IP address, remove rule
+    status = mNetd->tetherRuleRemoveDownstreamIpv6(kIfaceExt, kInvalidAddr4 /*bad*/);
+    EXPECT_FALSE(status.isOk());
+    EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
+
+    // Remove non existent rule. Expect that silently return success if the rule did not exist.
+    EXPECT_TRUE(mNetd->tetherRuleRemoveDownstreamIpv6(kIfaceNonExistent, kAddr6).isOk());
+
+    // Add and remove rule normally.
+    EXPECT_TRUE(mNetd->tetherRuleAddDownstreamIpv6(kIfaceInt, kIfaceExt, kAddr6, kSrcMac, kDstMac)
+                        .isOk());
+    EXPECT_TRUE(mNetd->tetherRuleRemoveDownstreamIpv6(kIfaceExt, kAddr6).isOk());
+}