From 9a66a6f590433b4f9b0ee80b6b6f0be6435c99cf Mon Sep 17 00:00:00 2001 From: Jacob Trimble Date: Fri, 25 Jan 2019 15:37:42 -0800 Subject: [PATCH] Add a cross-platform argument parser. (This is a merge of http://go/wvgerrit/70343) Instead of using the POSIX-specific getopt(), this uses a manual string comparison so it works on Windows. Test: Android Unit Tests Bug: 122953649 Change-Id: If009f8b3bfc8581d252da0f5ed55293c46d70bc6 --- .../cdm/core/test/config_test_env.h | 12 +- libwvdrmengine/cdm/core/test/test_base.cpp | 123 +++++++----------- 2 files changed, 55 insertions(+), 80 deletions(-) diff --git a/libwvdrmengine/cdm/core/test/config_test_env.h b/libwvdrmengine/cdm/core/test/config_test_env.h index dce0ec65..624206f9 100644 --- a/libwvdrmengine/cdm/core/test/config_test_env.h +++ b/libwvdrmengine/cdm/core/test/config_test_env.h @@ -86,22 +86,22 @@ class ConfigTestEnv { static const std::string& GetLicenseServerUrl( ServerConfigurationId server_configuration_id); - void set_key_id(KeyId& key_id) { key_id_.assign(key_id); } - void set_key_system(CdmKeySystem& key_system) { + void set_key_id(const KeyId& key_id) { key_id_.assign(key_id); } + void set_key_system(const CdmKeySystem& key_system) { key_system_.assign(key_system); } - void set_license_server(std::string& license_server) { + void set_license_server(const std::string& license_server) { license_server_.assign(license_server); } void set_license_service_certificate( - std::string& license_service_certificate) { + const std::string& license_service_certificate) { license_service_certificate_.assign(license_service_certificate); } - void set_provisioning_server(std::string& provisioning_server) { + void set_provisioning_server(const std::string& provisioning_server) { provisioning_server_.assign(provisioning_server); } void set_provisioning_service_certificate( - std::string& provisioning_service_certificate) { + const std::string& provisioning_service_certificate) { provisioning_service_certificate_.assign(provisioning_service_certificate); } diff --git a/libwvdrmengine/cdm/core/test/test_base.cpp b/libwvdrmengine/cdm/core/test/test_base.cpp index 353b2742..658a9f30 100644 --- a/libwvdrmengine/cdm/core/test/test_base.cpp +++ b/libwvdrmengine/cdm/core/test/test_base.cpp @@ -6,13 +6,14 @@ #include "test_base.h" -#include #include #include #include #include #include +#include +#include #include "cdm_engine.h" #include "crypto_session.h" @@ -35,22 +36,20 @@ void show_menu(char* prog_name) { << std::endl; std::cout << " e.g. adb shell '" << prog_name << " --server=\"url\"'" << std::endl; - std::cout << " or adb shell '" << prog_name << " -u\"url\"'" << std::endl - << std::endl; - std::cout << " -v/--verbose" << std::endl; + std::cout << " --verbose" << std::endl; std::cout << " increase logging verbosity (may be repeated)" << std::endl << std::endl; - std::cout << " -f/--no_filter" << std::endl; + std::cout << " --no_filter" << std::endl; std::cout << " Do not filter out inappropriate tests" << std::endl << std::endl; - std::cout << " -c/--cast" << std::endl; + std::cout << " --cast" << std::endl; std::cout << " Run tests appropriate for a Cast Receiver" << std::endl << std::endl; - std::cout << " -i/--license_server_id=" << std::endl; + std::cout << " --license_server_id=" << std::endl; std::cout << " specifies which default server settings to use: " << std::endl; std::cout << " gp for GooglePlay server" << std::endl; @@ -58,11 +57,11 @@ void show_menu(char* prog_name) { std::cout << " st for Content Protection Staging server" << std::endl << std::endl; - std::cout << " -k/--keyid=" << std::endl; + std::cout << " --keyid=" << std::endl; std::cout << " configure the key id or pssh, in hex format" << std::endl << std::endl; - std::cout << " -s/--service_certificate=" << std::endl; + std::cout << " --service_certificate=" << std::endl; std::cout << " configure the signed license service certificate" << std::endl; std::cout << " Specify the SignedDeviceCertificate (from " << "device_certificate.proto) " << std::endl; @@ -77,16 +76,16 @@ void show_menu(char* prog_name) { std::cout << " adb shell sh /system/bin/run_request_license_test.sh" << std::endl << std::endl; - std::cout << " -S/--provisioning_certificate=" << std::endl; + std::cout << " --provisioning_certificate=" << std::endl; std::cout << " configure the signed provisioning service certificate" << std::endl << " in hex" << std::endl << std::endl; - std::cout << " -u/--license_server_url=" << std::endl; + std::cout << " --license_server_url=" << std::endl; std::cout << " configure the license server url, please include http[s]" << " in the url" << std::endl << std::endl; - std::cout << " -p/--provisioning_server_url=" << std::endl; + std::cout << " --provisioning_server_url=" << std::endl; std::cout << " configure the provisioning server url, please include http[s]" << " in the url" << std::endl << std::endl; @@ -345,77 +344,53 @@ bool WvCdmTestBase::Initialize(int argc, char **argv) { bool force_load_test_keybox = false; // TODO(fredgc): obsolete. remove. bool filter_tests = true; bool show_usage = false; - - static const struct option long_options[] = { - {"license_server_id", required_argument, NULL, 'i'}, - {"keyid", required_argument, NULL, 'k'}, - {"service_certificate", required_argument, NULL, 's'}, - {"provisioning_certificate", required_argument, NULL, 'S'}, - {"license_server_url", required_argument, NULL, 'u'}, - {"provisioning_server_url", required_argument, NULL, 'p'}, - {"cast", no_argument, NULL, 'c'}, - {"no_filter", no_argument, NULL, 'f'}, - {"verbose", no_argument, NULL, 'v'}, - {NULL, 0, NULL, '\0'}}; - - int option_index = 0; - int opt = 0; int verbosity = 0; - while ((opt = getopt_long(argc, argv, "i:k:s:S:u:p:cfv", long_options, - &option_index)) != -1) { - switch (opt) { - case 'i': { - std::string license_id(optarg); - if (!license_id.compare("gp")) { + + // Skip the first element, which is the program name. + const std::vector args(argv + 1, argv + argc); + for (const std::string& arg : args) { + if (arg == "--verbose") { + ++verbosity; + } else if (arg == "--no_filter") { + filter_tests = false; + } else if (arg == "--cast") { + is_cast_receiver = true; + } else { + const auto index = arg.find('='); + if (index == std::string::npos) { + std::cerr << "Argument values need to be specified using --arg=foo" << std::endl; + show_usage = true; + break; + } + + const std::string arg_prefix = arg.substr(0, index); + const std::string arg_value = arg.substr(index + 1); + if (arg_prefix == "--license_server_id") { + if (arg_value == "gp") { default_config_ = ConfigTestEnv(kGooglePlayServer); - } else if (!license_id.compare("cp")) { + } else if (arg_value == "cp") { default_config_ = ConfigTestEnv(kContentProtectionUatServer); - } else if (!license_id.compare("st")) { + } else if (arg_value == "st") { default_config_ = ConfigTestEnv(kContentProtectionStagingServer); } else { - std::cout << "Invalid license server id" << optarg << std::endl; + std::cerr << "Invalid license server id: " << arg_value << std::endl; show_usage = true; + break; } - break; - } - case 'k': { - std::string key_id(optarg); - default_config_.set_key_id(key_id); - break; - } - case 's': { - std::string certificate(a2bs_hex(optarg)); + } else if (arg_prefix == "--keyid") { + default_config_.set_key_id(arg_value); + } else if (arg_prefix == "--service_certificate") { + const std::string certificate(a2bs_hex(arg_value)); default_config_.set_license_service_certificate(certificate); - break; - } - case 'S': { - std::string certificate(a2bs_hex(optarg)); + } else if (arg_prefix == "--provisioning_certificate") { + const std::string certificate(a2bs_hex(arg_value)); default_config_.set_provisioning_service_certificate(certificate); - break; - } - case 'u': { - std::string server(optarg); - default_config_.set_license_server(server); - break; - } - case 'p': { - std::string server(optarg); - default_config_.set_provisioning_server(server); - break; - } - case 'c': { - is_cast_receiver = true; - break; - } - case 'f': { - filter_tests = false; - break; - } - case 'v': { - ++verbosity; - break; - } - case '?': { + } else if (arg_prefix == "--license_server_url") { + default_config_.set_license_server(arg_value); + } else if (arg_prefix == "--provisioning_server_url") { + default_config_.set_provisioning_server(arg_value); + } else { + std::cerr << "Unknown argument " << arg_prefix << std::endl; show_usage = true; break; }