//
// Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// PrintSystemInfoTest.cpp:
//     prints the information gathered about the system so that it appears in the test logs

#include <gtest/gtest.h>

#include <iostream>

#include "common/platform.h"
#include "common/system_utils.h"
#include "gpu_info_util/SystemInfo.h"

using namespace angle;

namespace
{

#if defined(ANGLE_PLATFORM_WINDOWS) || defined(ANGLE_PLATFORM_LINUX) || \
    defined(ANGLE_PLATFORM_APPLE)
#    define SYSTEM_INFO_IMPLEMENTED
#endif

// Prints the information gathered about the system
TEST(PrintSystemInfoTest, Print)
{
#if defined(SYSTEM_INFO_IMPLEMENTED)
    SystemInfo info;

    ASSERT_TRUE(GetSystemInfo(&info));
    ASSERT_GT(info.gpus.size(), 0u);

    PrintSystemInfo(info);
#else
    std::cerr << "GetSystemInfo not implemented, skipping" << std::endl;
#endif
}

TEST(PrintSystemInfoTest, GetSystemInfoNoCrashOnInvalidDisplay)
{
#if defined(SYSTEM_INFO_IMPLEMENTED) && defined(ANGLE_USE_X11)
    const char kX11DisplayEnvVar[] = "DISPLAY";
    const char kInvalidDisplay[]   = "124:";
    std::string previous_display   = GetEnvironmentVar(kX11DisplayEnvVar);
    SetEnvironmentVar(kX11DisplayEnvVar, kInvalidDisplay);
    SystemInfo info;

    // This should not crash.
    GetSystemInfo(&info);

    if (previous_display.empty())
    {
        UnsetEnvironmentVar(kX11DisplayEnvVar);
    }
    else
    {
        SetEnvironmentVar(kX11DisplayEnvVar, previous_display.c_str());
    }
#elif defined(SYSTEM_INFO_IMPLEMENTED) && defined(ANGLE_USE_WAYLAND)
    const char kWaylandDisplayEnvVar[] = "WAYLAND_DISPLAY";
    const char kInvalidDisplay[]       = "wayland-123";
    std::string previous_display       = GetEnvironmentVar(kWaylandDisplayEnvVar);
    SetEnvironmentVar(kWaylandDisplayEnvVar, kInvalidDisplay);
    SystemInfo info;

    // This should not crash.
    GetSystemInfo(&info);

    if (previous_display.empty())
    {
        UnsetEnvironmentVar(kWaylandDisplayEnvVar);
    }
    else
    {
        SetEnvironmentVar(kWaylandDisplayEnvVar, previous_display.c_str());
    }
#elif defined(SYSTEM_INFO_IMPLEMENTED)
    std::cerr << "GetSystemInfo not implemented, skipping" << std::endl;
#else
    std::cerr << "GetSystemInfo X11 test not applicable, skipping" << std::endl;
#endif
}

}  // anonymous namespace
