diff --git a/server/IptablesRestoreControllerTest.cpp b/server/IptablesRestoreControllerTest.cpp
index c302b52..813028d 100644
--- a/server/IptablesRestoreControllerTest.cpp
+++ b/server/IptablesRestoreControllerTest.cpp
@@ -23,10 +23,12 @@
 #define LOG_TAG "IptablesRestoreControllerTest"
 #include <cutils/log.h>
 #include <android-base/stringprintf.h>
+#include <android-base/strings.h>
 
 #include "IptablesRestoreController.h"
 #include "NetdConstants.h"
 
+using android::base::Join;
 using android::base::StringPrintf;
 
 class IptablesRestoreControllerTest : public ::testing::Test {
@@ -63,13 +65,18 @@
 };
 
 TEST_F(IptablesRestoreControllerTest, TestBasicCommand) {
-  EXPECT_EQ(0, con.execute(IptablesTarget::V4V6, "#Test\n"));
+  std::string output;
+
+  EXPECT_EQ(0, con.execute(IptablesTarget::V4V6, "#Test\n", nullptr));
 
   pid_t pid4 = getIpRestorePid(IptablesRestoreController::IPTABLES_PROCESS);
   pid_t pid6 = getIpRestorePid(IptablesRestoreController::IP6TABLES_PROCESS);
 
-  EXPECT_EQ(0, con.execute(IptablesTarget::V6, "#Test\n"));
-  EXPECT_EQ(0, con.execute(IptablesTarget::V4, "#Test\n"));
+  EXPECT_EQ(0, con.execute(IptablesTarget::V6, "#Test\n", nullptr));
+  EXPECT_EQ(0, con.execute(IptablesTarget::V4, "#Test\n", nullptr));
+
+  EXPECT_EQ(0, con.execute(IptablesTarget::V4V6, "#Test\n", &output));
+  EXPECT_EQ("#Test\n#Test\n", output);  // One for IPv4 and one for IPv6.
 
   // Check the PIDs are the same as they were before. If they're not, the child processes were
   // restarted, which causes a 30-60ms delay.
@@ -78,18 +85,22 @@
 }
 
 TEST_F(IptablesRestoreControllerTest, TestRestartOnMalformedCommand) {
+  std::string buffer;
   for (int i = 0; i < 50; i++) {
       IptablesTarget target = (IptablesTarget) (i % 3);
-      ASSERT_EQ(-1, con.execute(target, "malformed command\n")) <<
+      std::string *output = (i % 2) ? &buffer : nullptr;
+      ASSERT_EQ(-1, con.execute(target, "malformed command\n", output)) <<
           "Malformed command did not fail at iteration " << i;
-      ASSERT_EQ(0, con.execute(target, "#Test\n")) <<
+      ASSERT_EQ(0, con.execute(target, "#Test\n", output)) <<
           "No-op command did not succeed at iteration " << i;
   }
 }
 
 TEST_F(IptablesRestoreControllerTest, TestRestartOnProcessDeath) {
+  std::string output;
+
   // Run a command to ensure that the processes are running.
-  EXPECT_EQ(0, con.execute(IptablesTarget::V4V6, "#Test\n"));
+  EXPECT_EQ(0, con.execute(IptablesTarget::V4V6, "#Test\n", &output));
 
   pid_t pid4 = getIpRestorePid(IptablesRestoreController::IPTABLES_PROCESS);
   pid_t pid6 = getIpRestorePid(IptablesRestoreController::IP6TABLES_PROCESS);
@@ -103,7 +114,7 @@
   TEMP_FAILURE_RETRY(usleep(100 * 1000));
 
   // Ensure that running a new command properly restarts the processes.
-  EXPECT_EQ(0, con.execute(IptablesTarget::V4V6, "#Test\n"));
+  EXPECT_EQ(0, con.execute(IptablesTarget::V4V6, "#Test\n", nullptr));
   EXPECT_NE(pid4, getIpRestorePid(IptablesRestoreController::IPTABLES_PROCESS));
   EXPECT_NE(pid6, getIpRestorePid(IptablesRestoreController::IP6TABLES_PROCESS));
 
@@ -111,3 +122,43 @@
   expectNoIptablesRestoreProcess(pid4);
   expectNoIptablesRestoreProcess(pid6);
 }
+
+TEST_F(IptablesRestoreControllerTest, TestOutput) {
+  const char *chainName = StringPrintf("netd_unit_test_%u", arc4random_uniform(10000)).c_str();
+
+  // Create a chain to list.
+  std::vector<std::string> createCommands = {
+      "*filter",
+      StringPrintf(":%s -", chainName),
+      StringPrintf("-A %s -j RETURN", chainName),
+      "COMMIT",
+      ""
+  };
+  EXPECT_EQ(0, con.execute(V4V6, Join(createCommands, "\n"), nullptr));
+
+  // Expected contents of the chain.
+  std::vector<std::string> expectedLines = {
+      StringPrintf("Chain %s (0 references)", chainName),
+      "target     prot opt source               destination         ",
+      "RETURN     all  --  0.0.0.0/0            0.0.0.0/0           ",
+      StringPrintf("Chain %s (0 references)", chainName),
+      "target     prot opt source               destination         ",
+      "RETURN     all      ::/0                 ::/0                ",
+      ""
+  };
+  std::string expected = Join(expectedLines, "\n");
+
+  // List and delete the chain.
+  std::vector<std::string> listCommands = {
+      "*filter",
+      StringPrintf("-n -L %s", chainName),  // List chain.
+      StringPrintf(":%s -", chainName),     // Flush chain (otherwise we can't delete it).
+      StringPrintf("-X %s", chainName),     // Delete chain.
+      "COMMIT",
+      ""
+  };
+
+  std::string output;
+  EXPECT_EQ(0, con.execute(V4V6, Join(listCommands, "\n"), &output));
+  EXPECT_EQ(expected, output);
+}
