Add a rudimentary unit test for BandwidthController.
Bug: 26685616
Bug: 27506285
Change-Id: I4457abd43697a0425f167b81c1432d743800abb8
diff --git a/server/BandwidthControllerTest.cpp b/server/BandwidthControllerTest.cpp
new file mode 100644
index 0000000..4a59883
--- /dev/null
+++ b/server/BandwidthControllerTest.cpp
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * BandwidthControllerTest.cpp - unit tests for BandwidthController.cpp
+ */
+
+#include <string>
+#include <vector>
+#include <stdio.h>
+
+#include <gtest/gtest.h>
+
+#include "BandwidthController.h"
+
+std::vector<std::string> gCmds = {};
+
+extern "C" int fake_android_fork_exec(int argc, char* argv[], int *status, bool, bool) {
+ std::string cmd = argv[0];
+ for (int i = 1; i < argc; i++) {
+ cmd += " ";
+ cmd += argv[i];
+ }
+ gCmds.push_back(cmd);
+ *status = 0;
+ return 0;
+}
+
+FILE *fake_popen(const char *, const char *) {
+ return NULL;
+};
+
+void expectIptablesCommands(std::vector<std::string> expectedCmds) {
+ EXPECT_EQ(expectedCmds.size() * 2, gCmds.size());
+ if (expectedCmds.size() * 2 != gCmds.size()) return;
+
+ for (size_t i = 0; i < expectedCmds.size(); i ++) {
+ EXPECT_EQ("/system/bin/iptables -w " + expectedCmds[i], gCmds[2 * i]);
+ EXPECT_EQ("/system/bin/ip6tables -w " + expectedCmds[i], gCmds[2 * i + 1]);
+ }
+
+ gCmds.clear();
+}
+
+class BandwidthControllerTest : public ::testing::Test {
+public:
+ BandwidthControllerTest() {
+ BandwidthController::execFunction = fake_android_fork_exec;
+ BandwidthController::popenFunction = fake_popen;
+ gCmds.clear();
+ }
+ BandwidthController mBw;
+};
+
+
+TEST_F(BandwidthControllerTest, TestEnableBandwidthControl) {
+ mBw.enableBandwidthControl(false);
+ std::vector<std::string> expected = {
+ "-F bw_INPUT",
+ "-F bw_OUTPUT",
+ "-F bw_FORWARD",
+ "-F bw_happy_box",
+ "-F bw_penalty_box",
+ "-F bw_costly_shared",
+ "-t raw -F bw_raw_PREROUTING",
+ "-t mangle -F bw_mangle_POSTROUTING",
+ "-A bw_INPUT -m owner --socket-exists",
+ "-A bw_OUTPUT -m owner --socket-exists",
+ "-t raw -A bw_raw_PREROUTING -m owner --socket-exists",
+ "-t mangle -A bw_mangle_POSTROUTING -m owner --socket-exists",
+ "-A bw_costly_shared --jump bw_penalty_box",
+ "-A bw_costly_shared --jump bw_happy_box",
+ "-A bw_costly_shared --jump RETURN",
+ "-A bw_happy_box -m owner --uid-owner 0-9999 --jump RETURN",
+ };
+ expectIptablesCommands(expected);
+}
+
+TEST_F(BandwidthControllerTest, TestEnableDataSaver) {
+ mBw.enableDataSaver(true);
+ std::vector<std::string> expected = {
+ "-R bw_costly_shared 3 --jump REJECT",
+ };
+ expectIptablesCommands(expected);
+
+ mBw.enableDataSaver(false);
+ expected = {
+ "-R bw_costly_shared 3 --jump RETURN",
+ };
+ expectIptablesCommands(expected);
+}