blob: 1617258547138740478b165d73ebada2f0999eb4 [file] [log] [blame]
/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_main.h"
#include "gflags/gflags.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "webrtc/test/field_trial.h"
#include "webrtc/test/testsupport/fileutils.h"
#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_window_manager_interface.h"
#include "webrtc/video_engine/test/auto_test/interface/vie_window_creator.h"
DEFINE_bool(automated, false, "Run Video engine tests in noninteractive mode.");
DEFINE_bool(auto_custom_call, false, "Run custom call directly.");
DEFINE_string(force_fieldtrials, "",
"Field trials control experimental feature code which can be forced. "
"E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/"
" will assign the group Enable to field trial WebRTC-FooFeature.");
static const std::string kStandardTest = "ViEStandardIntegrationTest";
static const std::string kExtendedTest = "ViEExtendedIntegrationTest";
static const std::string kApiTest = "ViEApiIntegrationTest";
ViEAutoTestMain::ViEAutoTestMain() {
index_to_test_method_map_[1] = "RunsBaseTestWithoutErrors";
index_to_test_method_map_[2] = "RunsCaptureTestWithoutErrors";
index_to_test_method_map_[3] = "RunsCodecTestWithoutErrors";
index_to_test_method_map_[4] = "[unused]";
index_to_test_method_map_[5] = "RunsImageProcessTestWithoutErrors";
index_to_test_method_map_[6] = "RunsNetworkTestWithoutErrors";
index_to_test_method_map_[7] = "RunsRenderTestWithoutErrors";
index_to_test_method_map_[8] = "RunsRtpRtcpTestWithoutErrors";
}
int ViEAutoTestMain::RunTests(int argc, char** argv) {
// Initialize logging.
ViETest::Init();
// Initialize WebRTC testing framework so paths to resources can be resolved.
webrtc::test::SetExecutablePath(argv[0]);
// Initialize the testing framework.
testing::InitGoogleTest(&argc, argv);
// AllowCommandLineParsing allows us to ignore flags passed on to us by
// Chromium build bots without having to explicitly disable them.
google::AllowCommandLineReparsing();
// Parse remaining flags:
google::ParseCommandLineFlags(&argc, &argv, true);
// Initialize field trial
webrtc::test::InitFieldTrialsFromString(FLAGS_force_fieldtrials);
int result;
if (FLAGS_automated) {
// Run in automated mode.
#if defined(WEBRTC_LINUX)
// All window-related tests are disabled on Linux for now.
// See https://code.google.com/p/chromium/issues/detail?id=318760
return 0;
#endif
result = RUN_ALL_TESTS();
} else if (FLAGS_auto_custom_call) {
// Run automated custom call.
result = RunSpecialTestCase(8);
} else {
// Run in interactive mode.
result = RunInteractiveMode();
}
ViETest::Terminate();
return result;
}
int ViEAutoTestMain::AskUserForTestCase() {
int choice;
std::string answer;
do {
ViETest::Log("\nSpecific tests:");
ViETest::Log("\t 0. Go back to previous menu.");
// Print all test method choices. Assumes that map sorts on its key.
int last_valid_choice = 0;
std::map<int, std::string>::const_iterator iterator;
for (iterator = index_to_test_method_map_.begin();
iterator != index_to_test_method_map_.end();
++iterator) {
ViETest::Log("\t %d. %s", iterator->first, iterator->second.c_str());
last_valid_choice = iterator->first;
}
ViETest::Log("Choose specific test:");
choice = AskUserForNumber(0, last_valid_choice);
} while (choice == kInvalidChoice);
return choice;
}
int ViEAutoTestMain::AskUserForNumber(int min_allowed, int max_allowed) {
int result;
if (scanf("%d", &result) <= 0) {
ViETest::Log("\nPlease enter a number instead, then hit enter.");
getc(stdin);
return kInvalidChoice;
}
getc(stdin); // Consume enter key.
if (result < min_allowed || result > max_allowed) {
ViETest::Log("%d-%d are valid choices. Please try again.", min_allowed,
max_allowed);
return kInvalidChoice;
}
return result;
}
int ViEAutoTestMain::RunTestMatching(const std::string test_case,
const std::string test_method) {
testing::FLAGS_gtest_filter = test_case + "." + test_method;
return RUN_ALL_TESTS();
}
int ViEAutoTestMain::RunSpecificTestCaseIn(const std::string test_case_name)
{
// If user says 0, it means don't run anything.
int specific_choice = AskUserForTestCase();
if (specific_choice != 0){
return RunTestMatching(test_case_name,
index_to_test_method_map_[specific_choice]);
}
return 0;
}
int ViEAutoTestMain::RunSpecialTestCase(int choice) {
// 7-10 don't run in GTest and need to initialize by themselves.
assert(choice >= 7 && choice <= 10);
// Create the windows
ViEWindowCreator windowCreator;
ViEAutoTestWindowManagerInterface* windowManager =
windowCreator.CreateTwoWindows();
// Create the test cases
ViEAutoTest vieAutoTest(windowManager->GetWindow1(),
windowManager->GetWindow2());
int errors = 0;
switch (choice) {
case 7: errors = vieAutoTest.ViELoopbackCall(); break;
case 8: errors = vieAutoTest.ViECustomCall(); break;
case 9: errors = vieAutoTest.ViESimulcastCall(); break;
case 10: errors = vieAutoTest.ViERecordCall(); break;
}
windowCreator.TerminateWindows();
return errors;
}
int ViEAutoTestMain::RunInteractiveMode() {
ViETest::Log(" ============================== ");
ViETest::Log(" WebRTC ViE 3.x Autotest ");
ViETest::Log(" ============================== \n");
int choice = 0;
int errors = 0;
do {
ViETest::Log("Test types: ");
ViETest::Log("\t 0. Quit");
ViETest::Log("\t 1. All standard tests (delivery test)");
ViETest::Log("\t 2. All API tests");
ViETest::Log("\t 3. All extended test");
ViETest::Log("\t 4. Specific standard test");
ViETest::Log("\t 5. Specific API test");
ViETest::Log("\t 6. Specific extended test");
ViETest::Log("\t 7. Simple loopback call");
ViETest::Log("\t 8. Custom configure a call");
ViETest::Log("\t 9. Simulcast in loopback");
ViETest::Log("\t 10. Record");
ViETest::Log("Select type of test:");
choice = AskUserForNumber(0, 10);
if (choice == kInvalidChoice) {
continue;
}
switch (choice) {
case 0: break;
case 1: errors = RunTestMatching(kStandardTest, "*"); break;
case 2: errors = RunTestMatching(kApiTest, "*"); break;
case 3: errors = RunTestMatching(kExtendedTest, "*"); break;
case 4: errors = RunSpecificTestCaseIn(kStandardTest); break;
case 5: errors = RunSpecificTestCaseIn(kApiTest); break;
case 6: errors = RunSpecificTestCaseIn(kExtendedTest); break;
default: errors = RunSpecialTestCase(choice); break;
}
} while (choice != 0);
if (errors) {
ViETest::Log("Test done with errors, see ViEAutotestLog.txt for test "
"result.\n");
return 1;
} else {
ViETest::Log("Test done without errors, see ViEAutotestLog.txt for "
"test result.\n");
return 0;
}
}