//
// Copyright 2019 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.

// system_utils_unittest_helper.cpp: Helper to the SystemUtils.RunApp unittest

#include "test_utils_unittest_helper.h"
#include "common/unsafe_buffers.h"

#include "../src/tests/test_utils/runner/TestSuite.h"
#include "common/system_utils.h"

#include <string.h>

// This variable is also defined in angle_unittest_main.
bool gVerbose = false;

int main(int argc, char **argv)
{
    bool runTestSuite = false;

    for (int argIndex = 1; argIndex < argc; ++argIndex)
    {
        if (ANGLE_UNSAFE_TODO(strcmp(argv[argIndex], kRunTestSuite)) == 0)
        {
            runTestSuite = true;
        }
    }

    if (runTestSuite)
    {
        angle::TestSuite testSuite(&argc, argv);
        return testSuite.run();
    }

    if (argc != 3 || ANGLE_UNSAFE_TODO(strcmp(argv[1], kRunAppTestArg1)) != 0 ||
        ANGLE_UNSAFE_TODO(strcmp(argv[2], kRunAppTestArg2)) != 0)
    {
        ANGLE_UNSAFE_TODO(fprintf(stderr, "Expected command line:\n%s %s %s\n", argv[0],
                                  kRunAppTestArg1, kRunAppTestArg2));
        return EXIT_FAILURE;
    }

    std::string env = angle::GetEnvironmentVar(kRunAppTestEnvVarName);
    if (env == "")
    {
        ANGLE_UNSAFE_TODO(printf("%s", kRunAppTestStdout));
        fflush(stdout);
        ANGLE_UNSAFE_TODO(fprintf(stderr, "%s", kRunAppTestStderr));
    }
    else
    {
        fprintf(stderr, "%s", env.c_str());
    }

    return EXIT_SUCCESS;
}
