1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <cstdlib> 18 #include <getopt.h> 19 #include <cstring> 20 #include <iostream> 21 22 #include "TestSettings.h" 23 24 #include "TestForkerEventListener.h" 25 26 namespace android { 27 namespace camera2 { 28 namespace tests { 29 30 bool TestSettings::mForkingDisabled = false; 31 int TestSettings::mDeviceId = 0; 32 char* const* TestSettings::mArgv; 33 34 // --forking-disabled, false by default 35 bool TestSettings::ForkingDisabled() { 36 return mForkingDisabled; 37 } 38 39 // reverse of --forking-disabled (not a flag), true by default 40 bool TestSettings::ForkingEnabled() { 41 return !ForkingDisabled(); 42 } 43 44 // --device-id, 0 by default 45 int TestSettings::DeviceId() { 46 return mDeviceId; 47 } 48 49 // returns false if usage should be printed and we should exit early 50 bool TestSettings::ParseArgs(int argc, char* const argv[]) 51 { 52 { 53 char *env = getenv("CAMERA2_TEST_FORKING_DISABLED"); 54 if (env) { 55 mForkingDisabled = atoi(env); 56 } 57 58 env = getenv("CAMERA2_TEST_DEVICE_ID"); 59 if (env) { 60 mDeviceId = atoi(env); 61 } 62 } 63 64 bool printHelp = false; 65 bool unknownArgs = false; 66 67 opterr = 0; // do not print errors for unknown arguments 68 while (true) { 69 int c; 70 int option_index = 0; 71 72 static struct option long_options[] = { 73 /* name has_arg flag val */ 74 {"forking-disabled", optional_argument, 0, 0 }, 75 {"device-id", required_argument, 0, 0 }, 76 {"help", no_argument, 0, 'h' }, 77 {0, 0, 0, 0 } 78 }; 79 80 // Note: '+' in optstring means do not mutate argv 81 c = getopt_long(argc, argv, "+h", long_options, &option_index); 82 83 if (c == -1) { // All arguments exhausted 84 break; 85 } 86 if (c == '?') { // Argument not in option lists 87 const char *arg = argv[optind-1]; 88 // Anything beginning with gtest_ will get handled by gtest 89 if (strstr(arg, "--gtest_") != arg) { 90 std::cerr << "Unknown argument: " << arg << std::endl; 91 unknownArgs = true; 92 } 93 continue; 94 } 95 96 switch (c) { 97 case 0: // long option 98 switch (option_index) { 99 case 0: { 100 const char *arg = optarg ?: "1"; 101 mForkingDisabled = atoi(arg); 102 break; 103 } 104 case 1: { 105 mDeviceId = atoi(optarg); 106 break; 107 } 108 default: 109 std::cerr << "Unknown long option: " << option_index << std::endl; 110 break; 111 } 112 break; // case 0 113 case 'h': // help 114 printHelp = true; 115 break; 116 default: // case '?' 117 std::cerr << "Unknown option: " << optarg << std::endl; 118 } 119 } 120 121 if (unknownArgs) { 122 std::cerr << std::endl; 123 } 124 125 mArgv = argv; 126 127 if (printHelp || unknownArgs) { 128 return false; 129 } 130 131 std::cerr << "Forking Disabled: " 132 << (mForkingDisabled ? "yes" : "no") << std::endl; 133 134 std::cerr << "Device ID: " << mDeviceId << std::endl; 135 136 return true; 137 } 138 139 // print usage/help list of commands (non-gtest) 140 void TestSettings::PrintUsage() { 141 std::cerr << "Usage: " << mArgv[0] << " [OPTIONS]" << std::endl; 142 std::cerr << std::endl; 143 144 std::cerr << "Main modes of operation:" 145 << std::endl; 146 std::cerr << " --forking-disabled[=1] don't fork process before " 147 << std::endl 148 << " running a new test." 149 << std::endl 150 << " (default enabled)" 151 << std::endl; 152 std::cerr << " --device-id=ID specify a different camera ID" 153 << std::endl 154 << " (default 0)" 155 << std::endl; 156 157 std::cerr << " -h, --help print this help listing" 158 << std::endl; 159 160 161 std::cerr << std::endl; 162 } 163 164 } 165 } 166 } 167 168