Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_main.h"
     12 
     13 #include "gflags/gflags.h"
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 
     16 #include "webrtc/test/field_trial.h"
     17 #include "webrtc/test/testsupport/fileutils.h"
     18 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
     19 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_window_manager_interface.h"
     20 #include "webrtc/video_engine/test/auto_test/interface/vie_window_creator.h"
     21 
     22 DEFINE_bool(automated, false, "Run Video engine tests in noninteractive mode.");
     23 DEFINE_bool(auto_custom_call, false, "Run custom call directly.");
     24 DEFINE_string(force_fieldtrials, "",
     25     "Field trials control experimental feature code which can be forced. "
     26     "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/"
     27     " will assign the group Enable to field trial WebRTC-FooFeature.");
     28 
     29 static const std::string kStandardTest = "ViEStandardIntegrationTest";
     30 static const std::string kExtendedTest = "ViEExtendedIntegrationTest";
     31 static const std::string kApiTest = "ViEApiIntegrationTest";
     32 
     33 ViEAutoTestMain::ViEAutoTestMain() {
     34   index_to_test_method_map_[1] = "RunsBaseTestWithoutErrors";
     35   index_to_test_method_map_[2] = "RunsCaptureTestWithoutErrors";
     36   index_to_test_method_map_[3] = "RunsCodecTestWithoutErrors";
     37   index_to_test_method_map_[4] = "[unused]";
     38   index_to_test_method_map_[5] = "RunsImageProcessTestWithoutErrors";
     39   index_to_test_method_map_[6] = "RunsNetworkTestWithoutErrors";
     40   index_to_test_method_map_[7] = "RunsRenderTestWithoutErrors";
     41   index_to_test_method_map_[8] = "RunsRtpRtcpTestWithoutErrors";
     42 }
     43 
     44 int ViEAutoTestMain::RunTests(int argc, char** argv) {
     45   // Initialize logging.
     46   ViETest::Init();
     47   // Initialize WebRTC testing framework so paths to resources can be resolved.
     48   webrtc::test::SetExecutablePath(argv[0]);
     49   // Initialize the testing framework.
     50   testing::InitGoogleTest(&argc, argv);
     51   // AllowCommandLineParsing allows us to ignore flags passed on to us by
     52   // Chromium build bots without having to explicitly disable them.
     53   google::AllowCommandLineReparsing();
     54   // Parse remaining flags:
     55   google::ParseCommandLineFlags(&argc, &argv, true);
     56   // Initialize field trial
     57   webrtc::test::InitFieldTrialsFromString(FLAGS_force_fieldtrials);
     58 
     59   int result;
     60   if (FLAGS_automated) {
     61     // Run in automated mode.
     62 #if defined(WEBRTC_LINUX)
     63     // All window-related tests are disabled on Linux for now.
     64     // See https://code.google.com/p/chromium/issues/detail?id=318760
     65     return 0;
     66 #endif
     67     result = RUN_ALL_TESTS();
     68   } else if (FLAGS_auto_custom_call) {
     69     // Run automated custom call.
     70     result = RunSpecialTestCase(8);
     71   } else {
     72     // Run in interactive mode.
     73     result = RunInteractiveMode();
     74   }
     75 
     76   ViETest::Terminate();
     77   return result;
     78 }
     79 
     80 int ViEAutoTestMain::AskUserForTestCase() {
     81   int choice;
     82   std::string answer;
     83 
     84   do {
     85     ViETest::Log("\nSpecific tests:");
     86     ViETest::Log("\t 0. Go back to previous menu.");
     87 
     88     // Print all test method choices. Assumes that map sorts on its key.
     89     int last_valid_choice = 0;
     90     std::map<int, std::string>::const_iterator iterator;
     91     for (iterator = index_to_test_method_map_.begin();
     92         iterator != index_to_test_method_map_.end();
     93         ++iterator) {
     94       ViETest::Log("\t %d. %s", iterator->first, iterator->second.c_str());
     95       last_valid_choice = iterator->first;
     96     }
     97 
     98     ViETest::Log("Choose specific test:");
     99     choice = AskUserForNumber(0, last_valid_choice);
    100   } while (choice == kInvalidChoice);
    101 
    102   return choice;
    103 }
    104 
    105 int ViEAutoTestMain::AskUserForNumber(int min_allowed, int max_allowed) {
    106   int result;
    107   if (scanf("%d", &result) <= 0) {
    108     ViETest::Log("\nPlease enter a number instead, then hit enter.");
    109     getchar();
    110     return kInvalidChoice;
    111   }
    112   getchar();  // Consume enter key.
    113 
    114   if (result < min_allowed || result > max_allowed) {
    115     ViETest::Log("%d-%d are valid choices. Please try again.", min_allowed,
    116                  max_allowed);
    117     return kInvalidChoice;
    118   }
    119 
    120   return result;
    121 }
    122 
    123 int ViEAutoTestMain::RunTestMatching(const std::string test_case,
    124                                      const std::string test_method) {
    125   testing::FLAGS_gtest_filter = test_case + "." + test_method;
    126   return RUN_ALL_TESTS();
    127 }
    128 
    129 int ViEAutoTestMain::RunSpecificTestCaseIn(const std::string test_case_name)
    130 {
    131   // If user says 0, it means don't run anything.
    132   int specific_choice = AskUserForTestCase();
    133   if (specific_choice != 0){
    134     return RunTestMatching(test_case_name,
    135                            index_to_test_method_map_[specific_choice]);
    136   }
    137   return 0;
    138 }
    139 
    140 int ViEAutoTestMain::RunSpecialTestCase(int choice) {
    141   // 7-10 don't run in GTest and need to initialize by themselves.
    142   assert(choice >= 7 && choice <= 10);
    143 
    144   // Create the windows
    145   ViEWindowCreator windowCreator;
    146   ViEAutoTestWindowManagerInterface* windowManager =
    147       windowCreator.CreateTwoWindows();
    148 
    149   // Create the test cases
    150   ViEAutoTest vieAutoTest(windowManager->GetWindow1(),
    151                           windowManager->GetWindow2());
    152 
    153   int errors = 0;
    154   switch (choice) {
    155     case 7: errors = vieAutoTest.ViELoopbackCall();  break;
    156     case 8: errors = vieAutoTest.ViECustomCall();    break;
    157     case 9: errors = vieAutoTest.ViESimulcastCall(); break;
    158     case 10: errors = vieAutoTest.ViERecordCall();   break;
    159   }
    160 
    161   windowCreator.TerminateWindows();
    162   return errors;
    163 }
    164 
    165 int ViEAutoTestMain::RunInteractiveMode() {
    166   ViETest::Log(" ============================== ");
    167   ViETest::Log("    WebRTC ViE 3.x Autotest     ");
    168   ViETest::Log(" ============================== \n");
    169 
    170   int choice = 0;
    171   int errors = 0;
    172   do {
    173     ViETest::Log("Test types: ");
    174     ViETest::Log("\t 0. Quit");
    175     ViETest::Log("\t 1. All standard tests (delivery test)");
    176     ViETest::Log("\t 2. All API tests");
    177     ViETest::Log("\t 3. All extended test");
    178     ViETest::Log("\t 4. Specific standard test");
    179     ViETest::Log("\t 5. Specific API test");
    180     ViETest::Log("\t 6. Specific extended test");
    181     ViETest::Log("\t 7. Simple loopback call");
    182     ViETest::Log("\t 8. Custom configure a call");
    183     ViETest::Log("\t 9. Simulcast in loopback");
    184     ViETest::Log("\t 10. Record");
    185     ViETest::Log("Select type of test:");
    186 
    187     choice = AskUserForNumber(0, 10);
    188     if (choice == kInvalidChoice) {
    189       continue;
    190     }
    191     switch (choice) {
    192       case 0:                                                 break;
    193       case 1:  errors = RunTestMatching(kStandardTest, "*");  break;
    194       case 2:  errors = RunTestMatching(kApiTest,      "*");  break;
    195       case 3:  errors = RunTestMatching(kExtendedTest, "*");  break;
    196       case 4:  errors = RunSpecificTestCaseIn(kStandardTest); break;
    197       case 5:  errors = RunSpecificTestCaseIn(kApiTest);      break;
    198       case 6:  errors = RunSpecificTestCaseIn(kExtendedTest); break;
    199       default: errors = RunSpecialTestCase(choice);           break;
    200     }
    201   } while (choice != 0);
    202 
    203   if (errors) {
    204     ViETest::Log("Test done with errors, see ViEAutotestLog.txt for test "
    205         "result.\n");
    206     return 1;
    207   } else {
    208     ViETest::Log("Test done without errors, see ViEAutotestLog.txt for "
    209         "test result.\n");
    210     return 0;
    211   }
    212 }
    213