/ src / qt / test / test_main.cpp
test_main.cpp
  1  // Copyright (c) 2009-present The Bitcoin Core developers
  2  // Distributed under the MIT software license, see the accompanying
  3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  4  
  5  #include <bitcoin-build-config.h> // IWYU pragma: keep
  6  
  7  #include <interfaces/init.h>
  8  #include <interfaces/node.h>
  9  #include <qt/bitcoin.h>
 10  #include <qt/guiconstants.h>
 11  #include <qt/test/apptests.h>
 12  #include <qt/test/optiontests.h>
 13  #include <qt/test/rpcnestedtests.h>
 14  #include <qt/test/uritests.h>
 15  #include <test/util/setup_common.h>
 16  #include <util/chaintype.h>
 17  
 18  #ifdef ENABLE_WALLET
 19  #include <qt/test/addressbooktests.h>
 20  #include <qt/test/wallettests.h>
 21  #endif // ENABLE_WALLET
 22  
 23  #include <QApplication>
 24  #include <QDebug>
 25  #include <QObject>
 26  #include <QSettings>
 27  #include <QTest>
 28  
 29  #include <functional>
 30  
 31  const std::function<std::vector<const char*>()> G_TEST_COMMAND_LINE_ARGUMENTS{};
 32  
 33  const std::function<std::string()> G_TEST_GET_FULL_NAME{};
 34  
 35  // This is all you need to run all the tests
 36  int main(int argc, char* argv[])
 37  {
 38      // Initialize persistent globals with the testing setup state for sanity.
 39      // E.g. -datadir in gArgs is set to a temp directory dummy value (instead
 40      // of defaulting to the default datadir), or globalChainParams is set to
 41      // regtest params.
 42      //
 43      // All tests must use their own testing setup (if needed).
 44      fs::create_directories([] {
 45          BasicTestingSetup dummy{ChainType::REGTEST};
 46          return gArgs.GetDataDirNet() / "blocks";
 47      }());
 48  
 49      std::unique_ptr<interfaces::Init> init = interfaces::MakeGuiInit(argc, argv);
 50      gArgs.ForceSetArg("-listen", "0");
 51      gArgs.ForceSetArg("-listenonion", "0");
 52      gArgs.ForceSetArg("-discover", "0");
 53      gArgs.ForceSetArg("-dnsseed", "0");
 54      gArgs.ForceSetArg("-fixedseeds", "0");
 55      gArgs.ForceSetArg("-natpmp", "0");
 56  
 57      std::string error;
 58      if (!gArgs.ReadConfigFiles(error, true)) qWarning() << error.c_str();
 59  
 60      // Prefer the "minimal" platform for the test instead of the normal default
 61      // platform ("xcb", "windows", or "cocoa") so tests can't unintentionally
 62      // interfere with any background GUIs and don't require extra resources.
 63      #if defined(WIN32)
 64          if (getenv("QT_QPA_PLATFORM") == nullptr) _putenv_s("QT_QPA_PLATFORM", "minimal");
 65      #else
 66          setenv("QT_QPA_PLATFORM", "minimal", 0 /* overwrite */);
 67      #endif
 68  
 69  
 70      QCoreApplication::setOrganizationName(QAPP_ORG_NAME);
 71      QCoreApplication::setApplicationName(QAPP_APP_NAME_DEFAULT "-test");
 72  
 73      int num_test_failures{0};
 74  
 75      {
 76          BitcoinApplication app;
 77          app.createNode(*init);
 78  
 79          AppTests app_tests(app);
 80          num_test_failures += QTest::qExec(&app_tests);
 81  
 82          OptionTests options_tests(app.node());
 83          num_test_failures += QTest::qExec(&options_tests);
 84  
 85          URITests test1;
 86          num_test_failures += QTest::qExec(&test1);
 87  
 88          RPCNestedTests test3(app.node());
 89          num_test_failures += QTest::qExec(&test3);
 90  
 91  #ifdef ENABLE_WALLET
 92          WalletTests test5(app.node());
 93          num_test_failures += QTest::qExec(&test5);
 94  
 95          AddressBookTests test6(app.node());
 96          num_test_failures += QTest::qExec(&test6);
 97  #endif
 98  
 99          if (num_test_failures) {
100              qWarning("\nFailed tests: %d\n", num_test_failures);
101          } else {
102              qDebug("\nAll tests passed.\n");
103          }
104      }
105  
106      QSettings settings;
107      settings.clear();
108  
109      return num_test_failures;
110  }