/**
 * Copyright © 2020 IBM Corporation
 *
 * 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.
 */
#include "temporary_file.hpp"
#include "test_utils.hpp"

#include <filesystem>
#include <string>
#include <utility>

#include <gtest/gtest.h>

using namespace phosphor::power::regulators;
using namespace phosphor::power::regulators::test_utils;
namespace fs = std::filesystem;

TEST(TemporaryFileTests, DefaultConstructor)
{
    TemporaryFile file{};

    fs::path path = file.getPath();
    EXPECT_FALSE(path.empty());
    EXPECT_TRUE(fs::exists(path));
    EXPECT_TRUE(fs::is_regular_file(path));

    fs::path parentDir = path.parent_path();
    EXPECT_EQ(parentDir, "/tmp");

    std::string fileName = path.filename();
    std::string namePrefix = "phosphor-regulators-";
    EXPECT_EQ(fileName.compare(0, namePrefix.size(), namePrefix), 0);
}

TEST(TemporaryFileTests, MoveConstructor)
{
    // Create first TemporaryFile object and verify temporary file exists
    TemporaryFile file1{};
    EXPECT_FALSE(file1.getPath().empty());
    EXPECT_TRUE(fs::exists(file1.getPath()));

    // Save path to temporary file
    fs::path path = file1.getPath();

    // Create second TemporaryFile object by moving first object
    TemporaryFile file2{std::move(file1)};

    // Verify first object now has an empty path
    EXPECT_TRUE(file1.getPath().empty());

    // Verify second object now owns same temporary file and file exists
    EXPECT_EQ(file2.getPath(), path);
    EXPECT_TRUE(fs::exists(file2.getPath()));
}

TEST(TemporaryFileTests, MoveAssignmentOperator)
{
    // Test where works: TemporaryFile object is moved
    {
        // Create first TemporaryFile object and verify temporary file exists
        TemporaryFile file1{};
        EXPECT_FALSE(file1.getPath().empty());
        EXPECT_TRUE(fs::exists(file1.getPath()));

        // Save path to first temporary file
        fs::path path1 = file1.getPath();

        // Create second TemporaryFile object and verify temporary file exists
        TemporaryFile file2{};
        EXPECT_FALSE(file2.getPath().empty());
        EXPECT_TRUE(fs::exists(file2.getPath()));

        // Save path to second temporary file
        fs::path path2 = file2.getPath();

        // Verify temporary files are different
        EXPECT_NE(path1, path2);

        // Move first object into the second
        file2 = std::move(file1);

        // Verify first object now has an empty path
        EXPECT_TRUE(file1.getPath().empty());

        // Verify second object now owns first temporary file and file exists
        EXPECT_EQ(file2.getPath(), path1);
        EXPECT_TRUE(fs::exists(path1));

        // Verify second temporary file was deleted
        EXPECT_FALSE(fs::exists(path2));
    }

    // Test where does nothing: TemporaryFile object is moved into itself
    {
        // Create TemporaryFile object and verify temporary file exists
        TemporaryFile file{};
        EXPECT_FALSE(file.getPath().empty());
        EXPECT_TRUE(fs::exists(file.getPath()));

        // Save path to temporary file
        fs::path path = file.getPath();

        // Try to move object into itself; should do nothing
        file = std::move(file);

        // Verify object still owns same temporary file and file exists
        EXPECT_EQ(file.getPath(), path);
        EXPECT_TRUE(fs::exists(path));
    }

    // Test where fails: Cannot delete temporary file
    {
        // Create first TemporaryFile object and verify temporary file exists
        TemporaryFile file1{};
        EXPECT_FALSE(file1.getPath().empty());
        EXPECT_TRUE(fs::exists(file1.getPath()));

        // Save path to first temporary file
        fs::path path1 = file1.getPath();

        // Create second TemporaryFile object and verify temporary file exists
        TemporaryFile file2{};
        EXPECT_FALSE(file2.getPath().empty());
        EXPECT_TRUE(fs::exists(file2.getPath()));

        // Save path to second temporary file
        fs::path path2 = file2.getPath();

        // Verify temporary files are different
        EXPECT_NE(path1, path2);

        // Make second temporary file unremoveable
        makeFileUnRemovable(path2);

        try
        {
            // Try to move first object into the second; should throw exception
            file2 = std::move(file1);
            ADD_FAILURE() << "Should not have reached this line.";
        }
        catch (const std::exception& e)
        {
            // This is expected.  Exception message will vary.
        }

        // Verify first object has not changed and first temporary file exists
        EXPECT_EQ(file1.getPath(), path1);
        EXPECT_TRUE(fs::exists(path1));

        // Verify second object has not changed and second temporary file exists
        EXPECT_EQ(file2.getPath(), path2);
        EXPECT_TRUE(fs::exists(path2));

        // Make second temporary file removeable so destructor can delete it
        makeFileRemovable(path2);
    }
}

TEST(TemporaryFileTests, Destructor)
{
    // Test where works: Temporary file is deleted
    {
        fs::path path{};
        {
            TemporaryFile file{};
            path = file.getPath();
            EXPECT_TRUE(fs::exists(path));
        }
        EXPECT_FALSE(fs::exists(path));
    }

    // Test where works: Temporary file was already deleted
    {
        fs::path path{};
        {
            TemporaryFile file{};
            path = file.getPath();
            EXPECT_TRUE(fs::exists(path));
            file.remove();
            EXPECT_FALSE(fs::exists(path));
        }
        EXPECT_FALSE(fs::exists(path));
    }

    // Test where fails: Cannot delete temporary file: No exception thrown
    {
        fs::path path{};
        try
        {
            TemporaryFile file{};
            path = file.getPath();
            EXPECT_TRUE(fs::exists(path));
            makeFileUnRemovable(path);
        }
        catch (...)
        {
            ADD_FAILURE() << "Should not have caught exception.";
        }

        // Temporary file should still exist
        EXPECT_TRUE(fs::exists(path));

        // Make file removable and delete it
        makeFileRemovable(path);
        fs::remove(path);
    }
}

TEST(TemporaryFileTests, Remove)
{
    // Test where works
    {
        // Create TemporaryFile object and verify temporary file exists
        TemporaryFile file{};
        EXPECT_FALSE(file.getPath().empty());
        EXPECT_TRUE(fs::exists(file.getPath()));

        // Save path to temporary file
        fs::path path = file.getPath();

        // Delete temporary file
        file.remove();

        // Verify path is cleared and file does not exist
        EXPECT_TRUE(file.getPath().empty());
        EXPECT_FALSE(fs::exists(path));

        // Delete temporary file again; should do nothing
        file.remove();
        EXPECT_TRUE(file.getPath().empty());
        EXPECT_FALSE(fs::exists(path));
    }

    // Test where fails
    {
        // Create TemporaryFile object and verify temporary file exists
        TemporaryFile file{};
        EXPECT_FALSE(file.getPath().empty());
        EXPECT_TRUE(fs::exists(file.getPath()));

        // Make file unremovable
        makeFileUnRemovable(file.getPath());

        try
        {
            // Try to delete temporary file; should fail with exception
            file.remove();
            ADD_FAILURE() << "Should not have reached this line.";
        }
        catch (const std::exception& e)
        {
            // This is expected.  Exception message will vary.
        }

        // Make file removable again so it will be deleted by the destructor
        makeFileRemovable(file.getPath());
    }
}

TEST(TemporaryFileTests, GetPath)
{
    TemporaryFile file{};
    EXPECT_FALSE(file.getPath().empty());
    EXPECT_EQ(file.getPath().parent_path(), "/tmp");
    EXPECT_TRUE(fs::exists(file.getPath()));
}
