/*
 * Copyright (C) 2020 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.
 */

#include <cstdlib>
#include <iostream>
#include <string>

#include "virt_test.h"

static constexpr const char LOG_TAG[] = "host: ";

int main(int argc, const char *argv[]) {
    std::string test_name;

    if (argc != 2) {
        std::cerr << LOG_TAG << "Usage: " << argv[0] << " <test-name>" << std::endl;
        return EXIT_FAILURE;
    }
    test_name = std::string(argv[1]);

#define VIRT_TEST(FN)                                                       \
    if (test_name == #FN) {                                                 \
        std::cerr << LOG_TAG << "Invoking " << #FN << "..." << std::endl;   \
        return FN();                                                        \
    }
#include "virt_test_list.h"
#undef VIRT_TEST

    std::cerr << LOG_TAG << "Unknown test function: " << test_name << std::endl;
    return EXIT_FAILURE;
}
