xref: /llvm-project/libc/test/UnitTest/LibcTestMain.cpp (revision 0889809c706fd926b786bc2f8852646a17d7e21c)
1af1315c2SSiva Chandra Reddy //===-- Main function for implementation of base class for libc unittests -===//
2af1315c2SSiva Chandra Reddy //
3af1315c2SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4af1315c2SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5af1315c2SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6af1315c2SSiva Chandra Reddy //
7af1315c2SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8af1315c2SSiva Chandra Reddy 
9af1315c2SSiva Chandra Reddy #include "LibcTest.h"
106f576d95SNick Desaulniers (paternity leave) #include "src/__support/CPP/string_view.h"
11af1315c2SSiva Chandra Reddy 
126f576d95SNick Desaulniers (paternity leave) using LIBC_NAMESPACE::cpp::string_view;
136f576d95SNick Desaulniers (paternity leave) using LIBC_NAMESPACE::testing::TestOptions;
146f576d95SNick Desaulniers (paternity leave) 
156f576d95SNick Desaulniers (paternity leave) namespace {
166f576d95SNick Desaulniers (paternity leave) 
176f576d95SNick Desaulniers (paternity leave) // A poor-man's getopt_long.
186f576d95SNick Desaulniers (paternity leave) // Run unit tests with --gtest_color=no to disable printing colors, or
196f576d95SNick Desaulniers (paternity leave) // --gtest_print_time to print timings in milliseconds only (as GTest does, so
206f576d95SNick Desaulniers (paternity leave) // external tools such as Android's atest may expect that format to parse the
216f576d95SNick Desaulniers (paternity leave) // output). Other command line flags starting with --gtest_ are ignored.
226f576d95SNick Desaulniers (paternity leave) // Otherwise, the last command line arg is used as a test filter, if command
236f576d95SNick Desaulniers (paternity leave) // line args are specified.
246f576d95SNick Desaulniers (paternity leave) TestOptions parseOptions(int argc, char **argv) {
256f576d95SNick Desaulniers (paternity leave)   TestOptions Options;
266f576d95SNick Desaulniers (paternity leave) 
276f576d95SNick Desaulniers (paternity leave)   for (int i = 1; i < argc; ++i) {
286f576d95SNick Desaulniers (paternity leave)     string_view arg{argv[i]};
296f576d95SNick Desaulniers (paternity leave) 
306f576d95SNick Desaulniers (paternity leave)     if (arg == "--gtest_color=no")
316f576d95SNick Desaulniers (paternity leave)       Options.PrintColor = false;
326f576d95SNick Desaulniers (paternity leave)     else if (arg == "--gtest_print_time")
336f576d95SNick Desaulniers (paternity leave)       Options.TimeInMs = true;
346f576d95SNick Desaulniers (paternity leave)     // Ignore other unsupported gtest specific flags.
356f576d95SNick Desaulniers (paternity leave)     else if (arg.starts_with("--gtest_"))
366f576d95SNick Desaulniers (paternity leave)       continue;
376f576d95SNick Desaulniers (paternity leave)     else
386f576d95SNick Desaulniers (paternity leave)       Options.TestFilter = argv[i];
39af1315c2SSiva Chandra Reddy   }
40af1315c2SSiva Chandra Reddy 
416f576d95SNick Desaulniers (paternity leave)   return Options;
426f576d95SNick Desaulniers (paternity leave) }
436f576d95SNick Desaulniers (paternity leave) 
446f576d95SNick Desaulniers (paternity leave) } // anonymous namespace
456f576d95SNick Desaulniers (paternity leave) 
46*0889809cSJoseph Huber // The C++ standard forbids declaring the main function with a linkage specifier
47*0889809cSJoseph Huber // outisde of 'freestanding' mode, only define the linkage for hermetic tests.
48*0889809cSJoseph Huber #if __STDC_HOSTED__
49*0889809cSJoseph Huber #define TEST_MAIN int main
50*0889809cSJoseph Huber #else
51*0889809cSJoseph Huber #define TEST_MAIN extern "C" int main
52*0889809cSJoseph Huber #endif
53*0889809cSJoseph Huber 
54*0889809cSJoseph Huber TEST_MAIN(int argc, char **argv, char **envp) {
55b6bc9d72SGuillaume Chatelet   LIBC_NAMESPACE::testing::argc = argc;
56b6bc9d72SGuillaume Chatelet   LIBC_NAMESPACE::testing::argv = argv;
57b6bc9d72SGuillaume Chatelet   LIBC_NAMESPACE::testing::envp = envp;
581e8960c7SSiva Chandra Reddy 
596f576d95SNick Desaulniers (paternity leave)   return LIBC_NAMESPACE::testing::Test::runTests(parseOptions(argc, argv));
60af1315c2SSiva Chandra Reddy }
61