| 1 | /*++ |
| 2 | |
| 3 | Copyright (c) Microsoft. All rights reserved. |
| 4 | |
| 5 | Module Name: |
| 6 | |
| 7 | unittests.c |
| 8 | |
| 9 | Abstract: |
| 10 | |
| 11 | This file contains the entrypoint for the unittest executable. |
| 12 | |
| 13 | --*/ |
| 14 | |
| 15 | #include "unittests.h" |
| 16 | #include <stdio.h> |
| 17 | #include <string.h> |
| 18 | |
| 19 | static const LXT_TEST LxtTests[] = { |
| 20 | {"auxv", false, AuxvTestEntry}, |
| 21 | {"binfmt", false, BinFmtTestEntry}, |
| 22 | {"brk", false, BrkTestEntry}, |
| 23 | {"cgroup", false, CgroupTestEntry}, |
| 24 | {"dev_pt", false, DevPtTestEntry}, |
| 25 | {"dev_pt_2", false, DevPtTwoTestEntry}, |
| 26 | {"drvfs", false, DrvfsTestEntry}, |
| 27 | {"dup", false, DupTestEntry}, |
| 28 | {"epoll", false, EpollTestEntry}, |
| 29 | {"eventfd", false, EventfdTestEntry}, |
| 30 | {"execve", true, .Handler = {.TestHandlerEnvp = ExecveTestEntry}}, |
| 31 | {"flock", false, FlockTestEntry}, |
| 32 | {"fork", false, ForkTestEntry}, |
| 33 | {"fscommon", false, FsCommonTestEntry}, |
| 34 | {"fstab", false, FstabTestEntry}, |
| 35 | {"get_set_id", false, GetSetIdTestEntry}, |
| 36 | {"get_addr_info", false, GetAddrInfoTestEntry}, |
| 37 | {"get_time", false, GetTimeTestEntry}, |
| 38 | {"inotify", false, InotifyTestEntry}, |
| 39 | {"interop", false, InteropTestEntry}, |
| 40 | {"ioprio", false, IoprioTestEntry}, |
| 41 | {"keymgmt", false, KeymgmtTestEntry}, |
| 42 | {"madvise", false, MadviseTestEntry}, |
| 43 | {"mprotect", false, MprotectTestEntry}, |
| 44 | {"mremap", false, MremapTestEntry}, |
| 45 | {"namespace", false, NamespaceTestEntry}, |
| 46 | {"netlink", false, NetlinkTestEntry}, |
| 47 | {"overlayfs", false, OverlayFsTestEntry}, |
| 48 | {"pipe", false, PipeTestEntry}, |
| 49 | {"poll", false, PollTestEntry}, |
| 50 | {"random", false, RandomTestEntry}, |
| 51 | {"resourcelimits", false, ResourceLimitsTestEntry}, |
| 52 | {"sched", false, SchedTestEntry}, |
| 53 | #if !defined(__aarch64__) |
| 54 | {"select", false, SelectTestEntry}, |
| 55 | #endif |
| 56 | {"sem", false, SemTestEntry}, |
| 57 | {"shm", false, ShmTestEntry}, |
| 58 | {"socket", false, SocketTestEntry}, |
| 59 | {"socket_nonblock", false, SocketNonblockTestEntry}, |
| 60 | {"splice", false, SpliceTestEntry}, |
| 61 | {"sysfs", false, SysfsTestEntry}, |
| 62 | {"sysinfo", false, SysInfoTestEntry}, |
| 63 | {"timer", false, TimerTestEntry}, |
| 64 | {"timerfd", false, TimerFdTestEntry}, |
| 65 | {"tty", false, TtyTestEntry}, |
| 66 | {"ttys", false, TtysTestEntry}, |
| 67 | {"user", false, UserTestEntry}, |
| 68 | {"utimensat", false, UtimensatTestEntry}, |
| 69 | {"vfsaccess", false, VfsAccessTestEntry}, |
| 70 | {"vnet", false, VnetTestEntry}, |
| 71 | {"waitpid", false, WaitPidTestEntry}, |
| 72 | {"wslpath", false, WslPathTestEntry}, |
| 73 | {"xattr", false, XattrTestEntry}}; |
| 74 | |
| 75 | int main(int Argc, char* Argv[], char** Envp) |
| 76 | { |
| 77 | |
| 78 | unsigned int Itr = 0; |
| 79 | int Result = 1; |
| 80 | |
| 81 | // parse arguments as: |
| 82 | // [0 - binary name] [1 - test name] [2.. - test name params] |
| 83 | if (Argc < 2) |
| 84 | { |
| 85 | // throw error |
| 86 | LxtLogError( |
| 87 | "Error: too few arguments\n \ |
| 88 | example usage: ./unittests [testname] [testparam1] [testparam..]\n"); |
| 89 | goto ErrorExit; |
| 90 | } |
| 91 | |
| 92 | // decrement Argc when passing it to the test |
| 93 | // tests view themselves as the binaries being called |
| 94 | // main(Argc = 3, Argv = ["unittests", false, "exampletest", false, "param1"]) --> |
| 95 | // ex. ExampleTestEntry(Argc = 2, Argv = ["exampletest", false, "param1"]) |
| 96 | Argc--; |
| 97 | |
| 98 | for (Itr = 0; Itr < LXT_COUNT_OF(LxtTests); Itr++) |
| 99 | { |
| 100 | if (strcmp(Argv[1], LxtTests[Itr].Name) == 0) |
| 101 | { |
| 102 | Result = (LxtTests[Itr].Envp) ? (LxtTests[Itr].Handler.TestHandlerEnvp(Argc, Argv + 1, Envp)) |
| 103 | : (LxtTests[Itr].Handler.TestHandler(Argc, Argv + 1)); |
| 104 | |
| 105 | if (LXT_SUCCESS(Result)) |
| 106 | { |
| 107 | LxtLogPassed("%s", LxtTests[Itr].Name); |
| 108 | } |
| 109 | else |
| 110 | { |
| 111 | LxtLogError("%s", LxtTests[Itr].Name); |
| 112 | } |
| 113 | |
| 114 | goto ErrorExit; |
| 115 | } |
| 116 | } |
| 117 | |
| 118 | LxtLogError("Test name [%s] could not be recognized", Argv[1]); |
| 119 | |
| 120 | ErrorExit: |
| 121 | return Result; |
| 122 | } |