Strict-related commands porting

Test: built, flashed, booted
      system/netd/tests/runtests.sh passes

Change-Id: Ibff8b050915c65e44cd37bb835943b8582fc003a
diff --git a/tests/binder_test.cpp b/tests/binder_test.cpp
index e97d191..a5d8ee3 100644
--- a/tests/binder_test.cpp
+++ b/tests/binder_test.cpp
@@ -1033,4 +1033,71 @@
     }
 }
 
+}  // namespace
+
+namespace {
+
+constexpr char STRICT_OUTPUT[] = "st_OUTPUT";
+constexpr char STRICT_CLEAR_CAUGHT[] = "st_clear_caught";
+
+void expectStrictSetUidAccept(const int uid) {
+    std::string uidRule = StringPrintf("owner UID match %u", uid);
+    std::string perUidChain = StringPrintf("st_clear_caught_%u", uid);
+    for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
+        EXPECT_FALSE(iptablesRuleExists(binary, STRICT_OUTPUT, uidRule.c_str()));
+        EXPECT_FALSE(iptablesRuleExists(binary, STRICT_CLEAR_CAUGHT, uidRule.c_str()));
+        EXPECT_EQ(0, iptablesRuleLineLength(binary, perUidChain.c_str()));
+    }
+}
+
+void expectStrictSetUidLog(const int uid) {
+    static const char logRule[] = "st_penalty_log  all";
+    std::string uidRule = StringPrintf("owner UID match %u", uid);
+    std::string perUidChain = StringPrintf("st_clear_caught_%u", uid);
+    for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
+        EXPECT_TRUE(iptablesRuleExists(binary, STRICT_OUTPUT, uidRule.c_str()));
+        EXPECT_TRUE(iptablesRuleExists(binary, STRICT_CLEAR_CAUGHT, uidRule.c_str()));
+        EXPECT_TRUE(iptablesRuleExists(binary, perUidChain.c_str(), logRule));
+    }
+}
+
+void expectStrictSetUidReject(const int uid) {
+    static const char rejectRule[] = "st_penalty_reject  all";
+    std::string uidRule = StringPrintf("owner UID match %u", uid);
+    std::string perUidChain = StringPrintf("st_clear_caught_%u", uid);
+    for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
+        EXPECT_TRUE(iptablesRuleExists(binary, STRICT_OUTPUT, uidRule.c_str()));
+        EXPECT_TRUE(iptablesRuleExists(binary, STRICT_CLEAR_CAUGHT, uidRule.c_str()));
+        EXPECT_TRUE(iptablesRuleExists(binary, perUidChain.c_str(), rejectRule));
+    }
+}
+
+TEST_F(BinderTest, TestStrictSetUidCleartextPenalty) {
+    binder::Status status;
+    int32_t uid = randomUid();
+
+    // setUidCleartextPenalty Policy:Log with randomUid
+    status = mNetd->strictUidCleartextPenalty(uid, INetd::PENALTY_POLICY_LOG);
+    EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
+    expectStrictSetUidLog(uid);
+
+    // setUidCleartextPenalty Policy:Accept with randomUid
+    status = mNetd->strictUidCleartextPenalty(uid, INetd::PENALTY_POLICY_ACCEPT);
+    expectStrictSetUidAccept(uid);
+
+    // setUidCleartextPenalty Policy:Reject with randomUid
+    status = mNetd->strictUidCleartextPenalty(uid, INetd::PENALTY_POLICY_REJECT);
+    EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
+    expectStrictSetUidReject(uid);
+
+    // setUidCleartextPenalty Policy:Accept with randomUid
+    status = mNetd->strictUidCleartextPenalty(uid, INetd::PENALTY_POLICY_ACCEPT);
+    expectStrictSetUidAccept(uid);
+
+    // test wrong policy
+    int32_t wrongPolicy = -123;
+    status = mNetd->strictUidCleartextPenalty(uid, wrongPolicy);
+    EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
+}
+
 }  // namespace
\ No newline at end of file