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