/*
 * Copyright 2017 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.
 *
 * IdletimerControllerTest.cpp - unit tests for IdletimerController.cpp
 */

#include <gtest/gtest.h>

#include <android-base/strings.h>
#include <android-base/stringprintf.h>

#include "IdletimerController.h"
#include "IptablesBaseTest.h"

using android::base::Join;
using android::base::StringPrintf;

class IdletimerControllerTest : public IptablesBaseTest {
protected:
    IdletimerControllerTest() {
        IdletimerController::execIptablesRestore = fakeExecIptablesRestore;
    }
    IdletimerController mIt;
};

TEST_F(IdletimerControllerTest, TestSetupIptablesHooks) {
    mIt.setupIptablesHooks();
    expectIptablesRestoreCommands(ExpectedIptablesCommands{});
}

TEST_F(IdletimerControllerTest, TestEnableDisable) {
    std::vector<std::string> expected = {
        "*raw\n"
        ":idletimer_raw_PREROUTING -\n"
        "COMMIT\n"
        "*mangle\n"
        ":idletimer_mangle_POSTROUTING -\n"
        "COMMIT\n",
    };

    mIt.enableIdletimerControl();
    expectIptablesRestoreCommands(expected);

    mIt.enableIdletimerControl();
    expectIptablesRestoreCommands(expected);

    mIt.disableIdletimerControl();
    expectIptablesRestoreCommands(expected);

    mIt.disableIdletimerControl();
    expectIptablesRestoreCommands(expected);
}

const std::vector<std::string> makeAddRemoveCommands(bool add) {
    const char *op = add ? "-A" : "-D";
    std::vector<std::string> cmds = {
        "*raw",
        StringPrintf("%s idletimer_raw_PREROUTING -i wlan0 -j IDLETIMER"
                     " --timeout 12345 --label hello --send_nl_msg 1", op),
        "COMMIT",
        "*mangle",
        StringPrintf("%s idletimer_mangle_POSTROUTING -o wlan0 -j IDLETIMER"
                     " --timeout 12345 --label hello --send_nl_msg 1", op),
        "COMMIT\n",
    };
    return { Join(cmds, '\n') };
}

TEST_F(IdletimerControllerTest, TestAddRemove) {
    auto expected = makeAddRemoveCommands(true);
    mIt.addInterfaceIdletimer("wlan0", 12345, "hello");
    expectIptablesRestoreCommands(expected);

    mIt.addInterfaceIdletimer("wlan0", 12345, "hello");
    expectIptablesRestoreCommands(expected);

    expected = makeAddRemoveCommands(false);
    mIt.removeInterfaceIdletimer("wlan0", 12345, "hello");
    expectIptablesRestoreCommands(expected);

    mIt.removeInterfaceIdletimer("wlan0", 12345, "hello");
    expectIptablesRestoreCommands(expected);
}
