100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin/*
200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin * Copyright (C) 2012 The Android Open Source Project
300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin *
400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin * you may not use this file except in compliance with the License.
600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin * You may obtain a copy of the License at
700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin *
800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin *
1000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin * Unless required by applicable law or agreed to in writing, software
1100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
1200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin * See the License for the specific language governing permissions and
1400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin * limitations under the License.
1500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin */
1600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
1700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin#include <cstdlib>
1800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin#include <getopt.h>
1900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin#include <cstring>
2000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin#include <iostream>
2100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
2200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin#include "TestSettings.h"
2300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
2400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin#include "TestForkerEventListener.h"
2500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
2600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinnamespace android {
2700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinnamespace camera2 {
2800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinnamespace tests {
2900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
3000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinbool TestSettings::mForkingDisabled     = false;
3100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinint  TestSettings::mDeviceId            = 0;
3200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinchar* const* TestSettings::mArgv;
3300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
3400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin// --forking-disabled, false by default
3500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinbool TestSettings::ForkingDisabled() {
3600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    return mForkingDisabled;
3700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin}
3800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
3900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin// reverse of --forking-disabled (not a flag), true by default
4000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinbool TestSettings::ForkingEnabled() {
4100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    return !ForkingDisabled();
4200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin}
4300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
4400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin// --device-id, 0 by default
4500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinint TestSettings::DeviceId() {
4600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    return mDeviceId;
4700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin}
4800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
4900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin// returns false if usage should be printed and we should exit early
5000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinbool TestSettings::ParseArgs(int argc, char* const argv[])
5100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin{
5200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    {
5300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        char *env = getenv("CAMERA2_TEST_FORKING_DISABLED");
5400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        if (env) {
5500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            mForkingDisabled = atoi(env);
5600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        }
5700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
5800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        env = getenv("CAMERA2_TEST_DEVICE_ID");
5900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        if (env) {
6000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            mDeviceId = atoi(env);
6100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        }
6200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    }
6300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
6400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    bool printHelp = false;
6500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    bool unknownArgs = false;
6600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
6700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    opterr = 0; // do not print errors for unknown arguments
6800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    while (true) {
6900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        int c;
7000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        int option_index = 0;
7100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
7200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        static struct option long_options[] = {
7300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            /* name              has_arg          flag val */
7400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            {"forking-disabled", optional_argument, 0,  0  },
7500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            {"device-id",        required_argument, 0,  0  },
7600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            {"help",             no_argument,       0, 'h' },
7700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            {0,                  0,                 0,  0  }
7800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        };
7900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
8000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        // Note: '+' in optstring means do not mutate argv
8100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        c = getopt_long(argc, argv, "+h", long_options, &option_index);
8200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
8300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        if (c == -1) { // All arguments exhausted
8400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            break;
8500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        }
8600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        if (c == '?') { // Argument not in option lists
8700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            const char *arg = argv[optind-1];
8800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            // Anything beginning with gtest_ will get handled by gtest
8900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            if (strstr(arg, "--gtest_") != arg) {
9000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin                std::cerr << "Unknown argument: " << arg << std::endl;
9100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin                unknownArgs = true;
9200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            }
9300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            continue;
9400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        }
9500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
9600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        switch (c) {
9700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        case 0: // long option
9800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            switch (option_index) {
9900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            case 0: {
10000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin                const char *arg = optarg ?: "1";
10100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin                mForkingDisabled = atoi(arg);
10200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin                break;
10300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            }
10400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            case 1: {
10500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin                mDeviceId = atoi(optarg);
10600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin                break;
10700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            }
10800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            default:
10900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin                std::cerr << "Unknown long option: " << option_index << std::endl;
11000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin                break;
11100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            }
11200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            break; // case 0
11300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        case 'h': // help
11400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            printHelp = true;
11500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            break;
11600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        default: // case '?'
11700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin            std::cerr << "Unknown option: " << optarg << std::endl;
11800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        }
11900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    }
12000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
12100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    if (unknownArgs) {
12200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        std::cerr << std::endl;
12300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    }
12400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
12500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    mArgv = argv;
12600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
12700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    if (printHelp || unknownArgs) {
12800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin        return false;
12900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    }
13000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
13100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    std::cerr << "Forking Disabled: "
13200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << (mForkingDisabled ? "yes" : "no") << std::endl;
13300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
13400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    std::cerr << "Device ID: " << mDeviceId << std::endl;
13500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
13600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    return true;
13700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin}
13800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
13900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin// print usage/help list of commands (non-gtest)
14000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkinvoid TestSettings::PrintUsage() {
14100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    std::cerr << "Usage: " << mArgv[0] << " [OPTIONS]" << std::endl;
14200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    std::cerr << std::endl;
14300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
14400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    std::cerr << "Main modes of operation:"
14500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << std::endl;
14600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    std::cerr << "   --forking-disabled[=1]  don't fork process before "
14700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << std::endl
14800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << "                           running a new test."
14900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << std::endl
15000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << "                           (default enabled)"
15100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << std::endl;
15200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    std::cerr << "   --device-id=ID          specify a different camera ID"
15300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << std::endl
15400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << "                           (default 0)"
15500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << std::endl;
15600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
15700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    std::cerr << "   -h, --help              print this help listing"
15800b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin              << std::endl;
15900b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
16000b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
16100b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin    std::cerr << std::endl;
16200b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin}
16300b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
16400b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin}
16500b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin}
16600b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin}
16700b597f428ddb584a8251cd030cb8e3547ee869dIgor Murashkin
168