diff options
author | joedow <joedow@chromium.org> | 2015-02-04 17:39:10 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-05 01:40:45 +0000 |
commit | 2079b57f0bd295d100e36850956af31c6d52316b (patch) | |
tree | 16d9b0e3f047dd7f84181f3e02ba2dcc67c63bf0 /remoting/test/app_remoting_test_driver.cc | |
parent | 370605a7ffb0392e48729591dc8f6fca79cdc987 (diff) | |
download | chromium_src-2079b57f0bd295d100e36850956af31c6d52316b.zip chromium_src-2079b57f0bd295d100e36850956af31c6d52316b.tar.gz chromium_src-2079b57f0bd295d100e36850956af31c6d52316b.tar.bz2 |
Initial checkin for the app remoting test driver tool. The external pieces of the test driver will consist of a common library which will build the dependencies and core helper classes and a minimal version of the tool which will include a minimal number of tests. An internal version of the tool will include the common library and pull in additional tests from src-internal.
The tool uses the GTest framework and this CL is to set up the foundation
so I can start adding functionality. I am not hooking it into the public gyp
files yet, that will come in a future change as more changes to the
remoting GYP files are expected.
BUG=
Review URL: https://codereview.chromium.org/900973002
Cr-Commit-Position: refs/heads/master@{#314712}
Diffstat (limited to 'remoting/test/app_remoting_test_driver.cc')
-rw-r--r-- | remoting/test/app_remoting_test_driver.cc | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/remoting/test/app_remoting_test_driver.cc b/remoting/test/app_remoting_test_driver.cc new file mode 100644 index 0000000..07bbde7 --- /dev/null +++ b/remoting/test/app_remoting_test_driver.cc @@ -0,0 +1,154 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/bind.h" +#include "base/command_line.h" +#include "base/logging.h" +#include "base/strings/stringprintf.h" +#include "base/test/launcher/unit_test_launcher.h" +#include "base/test/test_suite.h" +#include "base/test/test_switches.h" +#include "google_apis/google_api_keys.h" +#include "net/base/escape.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace switches { + const char kUserNameSwitchName[] = "username"; + const char kAuthCodeSwitchName[] = "authcode"; + const char kServiceEnvironmentSwitchName[] = "environment"; + const char kHelpSwitchName[] = "help"; + const char kSingleProcessTestsSwitchName[] = "single-process-tests"; +} + +namespace { + +// Requested permissions needed for App Remoting tests. The spaces in between +// scope fragments are necessary and will be escaped properly before use. +const char kAppRemotingAuthScopeValues[] = + "https://www.googleapis.com/auth/appremoting.runapplication" + " https://www.googleapis.com/auth/googletalk" + " https://www.googleapis.com/auth/userinfo.email" + " https://docs.google.com/feeds" + " https://www.googleapis.com/auth/drive"; + +std::string GetAuthorizationCodeUri() { + // Replace space characters with a '+' sign when formatting. + bool use_plus = true; + return base::StringPrintf( + "https://accounts.google.com/o/oauth2/auth" + "?scope=%s" + "&redirect_uri=https://chromoting-oauth.talkgadget.google.com/" + "talkgadget/oauth/chrome-remote-desktop/dev" + "&response_type=code" + "&client_id=%s" + "&access_type=offline" + "&approval_prompt=force", + net::EscapeUrlEncodedData(kAppRemotingAuthScopeValues, use_plus).c_str(), + net::EscapeUrlEncodedData(google_apis::GetOAuth2ClientID( + google_apis::CLIENT_REMOTING), use_plus).c_str()); +} + +void PrintUsage() { + printf("\n**************************************\n"); + printf("*** App Remoting Test Driver Usage ***\n"); + printf("**************************************\n"); + + printf("\nUsage:\n"); + printf(" ar_test_driver --username=<example@gmail.com> [options]\n"); + printf("\nRequired Parameters:\n"); + printf(" %s: Specifies which account to use when running tests\n", + switches::kUserNameSwitchName); + printf("\nOptional Parameters:\n"); + printf(" %s: Exchanged for a refresh and access token for authentication\n", + switches::kAuthCodeSwitchName); + printf(" %s: Displays additional usage information\n", + switches::kHelpSwitchName); + printf(" %s: Specifies the service api to use (dev|test) [default: dev]\n", + switches::kServiceEnvironmentSwitchName); +} + +void PrintAuthCodeInfo() { + printf("\n*******************************\n"); + printf("*** Auth Code Example Usage ***\n"); + printf("*******************************\n\n"); + + printf("If this is the first time you are running the tool,\n"); + printf("you will need to provide an authorization code.\n"); + printf("This code will be exchanged for a long term refresh token which\n"); + printf("will be stored locally and used to acquire a short lived access\n"); + printf("token to connect to the remoting service apis and establish a\n"); + printf("remote host connection.\n\n"); + + printf("Note: You may need to repeat this step if the stored refresh token"); + printf("\n has been revoked or expired.\n"); + printf(" Passing in the same auth code twice will result in an error\n"); + + printf("\nFollow these steps to produce an auth code:\n" + " - Open the Authorization URL link shown below in your browser\n" + " - Approve the requested permissions for the tool\n" + " - Copy the 'code' value in the redirected URL\n" + " - Run the tool and pass in copied auth code as a parameter\n"); + + printf("\nAuthorization URL:\n"); + printf("%s\n", GetAuthorizationCodeUri().c_str()); + + printf("\nRedirected URL Example:\n"); + printf("https://chromoting-oauth.talkgadget.google.com/talkgadget/oauth/" + "chrome-remote-desktop/dev?code=4/AKtf...\n"); + + printf("\nTool usage example with the newly created auth code:\n"); + printf("ar_test_driver --%s=example@gmail.com --%s=4/AKtf...\n\n", + switches::kUserNameSwitchName, + switches::kAuthCodeSwitchName); +} + +} // namespace + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + TestSuite test_suite(argc, argv); + + // The pointer returned here refers to a singleton, since we don't own the + // lifetime of the object, don't wrap in a scoped_ptr construct or release it. + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + DCHECK(command_line); + + // We do not want to retry failures as a failed test should signify an error + // to be investigated. + command_line->AppendSwitchASCII(switches::kTestLauncherRetryLimit, "0"); + + // We do not want to run the tests in parallel and we do not want to retry + // failures. The reason for running in a single process is that some tests + // may share the same remoting host and they cannot be run concurrently, also + // the test output gets spammed with test launcher messages which reduces the + // readability of the results. + command_line->AppendSwitch(switches::kSingleProcessTestsSwitchName); + + // If the user passed in the help flag, then show the help info for this tool + // and 'run' the tests which will print the gtest specific help and then exit. + // NOTE: We do this check after updating the switches as otherwise the gtest + // help is written in parallel with our text and can appear interleaved. + if (command_line->HasSwitch(switches::kHelpSwitchName)) { + PrintUsage(); + PrintAuthCodeInfo(); + return base::LaunchUnitTestsSerially( + argc, + argv, + base::Bind(&base::TestSuite::Run, base::Unretained(&test_suite))); + } + + // Verify we received the required input from the command line. + if (!command_line->HasSwitch(switches::kUserNameSwitchName)) { + LOG(ERROR) << "No user name passed in, can't authenticate without that!"; + PrintUsage(); + return -1; + } + + // Because many tests may access the same remoting host(s), we need to run + // the tests sequentially so they do not interfere with each other. + return base::LaunchUnitTestsSerially( + argc, + argv, + base::Bind(&base::TestSuite::Run, base::Unretained(&test_suite))); +} |