// Copyright (C) 2016 The Android Open Source Project
//
// This software is licensed under the terms of the GNU General Public
// License version 2, as published by the Free Software Foundation, and
// may be copied, distributed, and modified under those terms.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

#include "android/console_auth.h"
#include "android/console_auth_internal.h"
#include "android/base/files/ScopedFd.h"
#include "android/base/misc/FileUtils.h"
#include "android/utils/eintr_wrapper.h"
#include "android/utils/tempfile.h"
#include "android/utils/path.h"

#include <fcntl.h>
#include <gtest/gtest.h>
#include <sys/types.h>
#include <sys/stat.h>

namespace android {

using base::ScopedFd;

namespace console_auth {

static std::string temp_auth_token_file;
std::string get_temp_auth_token_file() {
    return temp_auth_token_file;
}

TEST(ConsoleAuth, get_auth_token_from_exists) {
    std::string auth_token;

    const char* test_data[] = {
            "test pattern",
            "test pattern\r\n",
            "  test pattern",
            "  test pattern\r\n",
    };
    size_t TEST_DATA_COUNT = sizeof(test_data) / sizeof(test_data[0]);

    TempFile* tf = tempfile_create();
    tempfile_close(tf);

    for (size_t i = 0; i < TEST_DATA_COUNT; i++) {
        int fd = HANDLE_EINTR(
                open(tempfile_path(tf), O_CREAT | O_TRUNC | O_WRONLY, 0600));
        EXPECT_NE(-1, fd);
        EXPECT_TRUE(android::writeStringToFile(fd, test_data[i]));
        HANDLE_EINTR(close(fd));

        EXPECT_TRUE(tokenLoadOrCreate(tempfile_path(tf), &auth_token));
        EXPECT_STREQ("test pattern", auth_token.c_str());
        tempfile_close(tf);
    }
}

bool isbase64(char c) {
    return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') ||
           ('0' <= c && c <= '9') || c == '+' || c == '/' || c == '=';
}

TEST(ConsoleAuth, get_auth_token_from_create) {
    std::string auth_token;

    TempFile* tf = tempfile_create();
    tempfile_close(tf);

    const int kBase64Len = 16;
    EXPECT_TRUE(tokenLoadOrCreate(tempfile_path(tf), &auth_token));
    struct stat stat_info;
    EXPECT_EQ(0, stat(tempfile_path(tf), &stat_info));
    EXPECT_EQ(kBase64Len, stat_info.st_size);
    // all we know about this token is that it will be 16 bytes base64 encoded
    for (int i = 0; i < kBase64Len; i++) {
        EXPECT_TRUE(isbase64(auth_token[i]));
    }
    EXPECT_EQ(kBase64Len, auth_token.size());

    tempfile_close(tf);
}

TEST(ConsoleAuth, get_auth_token_from_fail) {
    std::string auth_token;
    EXPECT_FALSE(tokenLoadOrCreate("/absolutely/bogus/path", &auth_token));
}

std::string read_file(const std::string& path) {
    ScopedFd fd(HANDLE_EINTR(open(path.c_str(), O_RDONLY)));
    EXPECT_NE(-1, fd.get());
    std::string result;
    EXPECT_TRUE(android::readFileIntoString(fd.get(), &result));
    return result;
}

TEST(ConsoleAuth, android_console_auth_get_status) {
    TempFile* tf = tempfile_create();

    // override default auth token file path
    temp_auth_token_file.assign(tempfile_path(tf));
    g_get_auth_token_path = get_temp_auth_token_file;

    // test with an empty auth token file
    EXPECT_EQ(CONSOLE_AUTH_STATUS_DISABLED, android_console_auth_get_status());

    // test with no auth token file (it should be created)
    tempfile_close(tf);
    EXPECT_EQ(CONSOLE_AUTH_STATUS_REQUIRED, android_console_auth_get_status());

    temp_auth_token_file.assign("/very/bad/path");
    EXPECT_EQ(CONSOLE_AUTH_STATUS_ERROR, android_console_auth_get_status());

    char* dup = android_console_auth_token_path_dup();
    EXPECT_STREQ("/very/bad/path", dup);
    free(dup);
}

}  // namespace console_auth
}  // namespace android
