186a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti/* 286a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * Copyright 2016 The Android Open Source Project 386a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * 486a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * Licensed under the Apache License, Version 2.0 (the "License"); 586a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * you may not use this file except in compliance with the License. 686a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * You may obtain a copy of the License at 786a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * 886a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * http://www.apache.org/licenses/LICENSE-2.0 986a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * 1086a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * Unless required by applicable law or agreed to in writing, software 1186a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * distributed under the License is distributed on an "AS IS" BASIS, 1286a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1386a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * See the License for the specific language governing permissions and 1486a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * limitations under the License. 1586a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * 1686a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti * BandwidthControllerTest.cpp - unit tests for BandwidthController.cpp 1786a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti */ 1886a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti 1986a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti#include <string> 2086a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti#include <vector> 2186a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti 2286a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti#include <gtest/gtest.h> 2386a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti 2413debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti#include <android-base/strings.h> 2513debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti 2686a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti#include "BandwidthController.h" 270f15055ba127da5c8bff3617f04ac6df0b4ee2f4Lorenzo Colitti#include "IptablesBaseTest.h" 2886a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti 2986a4798264c9421cb02bc69836a323d918f73779Lorenzo ColittiFILE *fake_popen(const char *, const char *) { 3086a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti return NULL; 3186a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti}; 3286a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti 330f15055ba127da5c8bff3617f04ac6df0b4ee2f4Lorenzo Colitticlass BandwidthControllerTest : public IptablesBaseTest { 3486a4798264c9421cb02bc69836a323d918f73779Lorenzo Colittipublic: 3586a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti BandwidthControllerTest() { 3686a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti BandwidthController::execFunction = fake_android_fork_exec; 3786a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti BandwidthController::popenFunction = fake_popen; 3813debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti BandwidthController::iptablesRestoreFunction = fakeExecIptablesRestore; 3986a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti } 4086a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti BandwidthController mBw; 4186a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti}; 4286a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti 43a0dc8a54c3d1a805294c5608dbeb78292014d2a5Lorenzo ColittiTEST_F(BandwidthControllerTest, TestSetupIptablesHooks) { 44a0dc8a54c3d1a805294c5608dbeb78292014d2a5Lorenzo Colitti mBw.setupIptablesHooks(); 45a0dc8a54c3d1a805294c5608dbeb78292014d2a5Lorenzo Colitti std::vector<std::string> expected = { 4613debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*filter\n" 4713debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_INPUT -\n" 4813debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_OUTPUT -\n" 4913debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_FORWARD -\n" 5013debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_happy_box -\n" 5113debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_penalty_box -\n" 5213debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_data_saver -\n" 5313debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_costly_shared -\n" 5413debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n" 5513debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*raw\n" 5613debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_raw_PREROUTING -\n" 5713debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n" 5813debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*mangle\n" 5913debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_mangle_POSTROUTING -\n" 6013debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n\x04" 61a0dc8a54c3d1a805294c5608dbeb78292014d2a5Lorenzo Colitti }; 6213debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti expectIptablesRestoreCommands(expected); 63a0dc8a54c3d1a805294c5608dbeb78292014d2a5Lorenzo Colitti} 64a0dc8a54c3d1a805294c5608dbeb78292014d2a5Lorenzo Colitti 6586a4798264c9421cb02bc69836a323d918f73779Lorenzo ColittiTEST_F(BandwidthControllerTest, TestEnableBandwidthControl) { 6686a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti mBw.enableBandwidthControl(false); 6713debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti std::string expectedFlush = 6813debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*filter\n" 6913debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_INPUT -\n" 7013debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_OUTPUT -\n" 7113debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_FORWARD -\n" 7213debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_happy_box -\n" 7313debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_penalty_box -\n" 7413debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_data_saver -\n" 7513debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_costly_shared -\n" 7613debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n" 7713debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*raw\n" 7813debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_raw_PREROUTING -\n" 7913debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n" 8013debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*mangle\n" 8113debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_mangle_POSTROUTING -\n" 8213debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n\x04"; 8313debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti std::string expectedAccounting = 8413debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*filter\n" 8513debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "-A bw_INPUT -m owner --socket-exists\n" 8613debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "-A bw_OUTPUT -m owner --socket-exists\n" 8713debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "-A bw_costly_shared --jump bw_penalty_box\n" 8813debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "-A bw_penalty_box --jump bw_happy_box\n" 8913debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "-A bw_happy_box --jump bw_data_saver\n" 9013debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "-A bw_data_saver -j RETURN\n" 9113debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "-I bw_happy_box -m owner --uid-owner 0-9999 --jump RETURN\n" 9213debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n" 9313debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*raw\n" 9413debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "-A bw_raw_PREROUTING -m owner --socket-exists\n" 9513debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n" 9613debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*mangle\n" 9713debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "-A bw_mangle_POSTROUTING -m owner --socket-exists\n" 9813debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n\x04"; 9913debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti 10013debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti expectIptablesRestoreCommands({ expectedFlush, expectedAccounting }); 10186a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti} 10286a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti 103a0dc8a54c3d1a805294c5608dbeb78292014d2a5Lorenzo ColittiTEST_F(BandwidthControllerTest, TestDisableBandwidthControl) { 104a0dc8a54c3d1a805294c5608dbeb78292014d2a5Lorenzo Colitti mBw.disableBandwidthControl(); 10513debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti const std::string expected = 10613debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*filter\n" 10713debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_INPUT -\n" 10813debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_OUTPUT -\n" 10913debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_FORWARD -\n" 11013debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_happy_box -\n" 11113debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_penalty_box -\n" 11213debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_data_saver -\n" 11313debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_costly_shared -\n" 11413debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n" 11513debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*raw\n" 11613debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_raw_PREROUTING -\n" 11713debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n" 11813debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "*mangle\n" 11913debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti ":bw_mangle_POSTROUTING -\n" 12013debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti "COMMIT\n\x04"; 12113debb8996ca9cd3ce5d7f2817fe19e5df148f08Lorenzo Colitti expectIptablesRestoreCommands({ expected }); 122a0dc8a54c3d1a805294c5608dbeb78292014d2a5Lorenzo Colitti} 123a0dc8a54c3d1a805294c5608dbeb78292014d2a5Lorenzo Colitti 12486a4798264c9421cb02bc69836a323d918f73779Lorenzo ColittiTEST_F(BandwidthControllerTest, TestEnableDataSaver) { 12586a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti mBw.enableDataSaver(true); 12686a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti std::vector<std::string> expected = { 127464eabecf1174154b8f61845610c3f4f0ca294b3Lorenzo Colitti "-R bw_data_saver 1 --jump REJECT", 12886a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti }; 12986a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti expectIptablesCommands(expected); 13086a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti 13186a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti mBw.enableDataSaver(false); 13286a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti expected = { 133464eabecf1174154b8f61845610c3f4f0ca294b3Lorenzo Colitti "-R bw_data_saver 1 --jump RETURN", 13486a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti }; 13586a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti expectIptablesCommands(expected); 13686a4798264c9421cb02bc69836a323d918f73779Lorenzo Colitti} 137