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