summaryrefslogtreecommitdiffhomepage
path: root/test/kernel_test/process.test.cc
blob: 2ec7d191c61166b29b755aa2785cd175271473f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/// \file process.test.cc
/// \brief Process management tests.
/// \author Amlal El Mahrouss (amlal at nekernel dot org)

#include <KernelTest.fwrk/headers/TestCase.h>
#include <libSystem/SystemKit/System.h>

/// \note RtlSpawnProcess tests
KT_DECL_TEST(ProcessHasFailed, []() -> bool {
  /// \todo we return -1 here, should we document that or classify as common knowledge?
  return RtlSpawnProcess("/", 0, nullptr, nullptr, 0) == -1;
});

KT_DECL_TEST(ProcessHasSucceeded, []() -> bool {
  /// \note Any process greater than zero, exists within a specific team domain (real-time, high, or
  /// low domains).
  return RtlSpawnProcess("/system/list", 0, nullptr, nullptr, 0) > 0;
});

KT_DECL_TEST(ProcessSpawnNullPath,
             []() -> bool { return RtlSpawnProcess(nullptr, 0, nullptr, nullptr, 0) == -1; });

KT_DECL_TEST(ProcessSpawnInvalidPath, []() -> bool {
  return RtlSpawnProcess("/invalid/nonexistent", 0, nullptr, nullptr, 0) == -1;
});

/// \note RtlSpawnIB tests
KT_DECL_TEST(ProcessSpawnIBValid, []() -> bool {
  UIntPtr pid = RtlSpawnProcess("/system/list", 0, nullptr, nullptr, 0);
  if (pid <= 0) return NO;

  UInt32 result = RtlSpawnIB(pid);
  return result == 0;
});

KT_DECL_TEST(ProcessSpawnIBInvalid, []() -> bool {
  UInt32 result = RtlSpawnIB(0);
  return result > 0;
});

/// \note RtlExitProcess tests
KT_DECL_TEST(ProcessExitValid, []() -> bool {
  UIntPtr pid = RtlSpawnProcess("/system/list", 0, nullptr, nullptr, 0);
  if (pid <= 0) return NO;

  Bool result = RtlExitProcess(pid, 0);
  return result == YES;
});

KT_DECL_TEST(ProcessExitWithCode, []() -> bool {
  UIntPtr pid = RtlSpawnProcess("/system/list", 0, nullptr, nullptr, 0);
  if (pid <= 0) return NO;

  Bool result = RtlExitProcess(pid, 42);
  return result == YES;
});

KT_DECL_TEST(ProcessExitInvalid, []() -> bool {
  Bool result = RtlExitProcess(0, 0);
  return result == NO;
});

/// \brief Run 'process' test.
IMPORT_C SInt32 KT_TEST_MAIN() {
  KT_RUN_TEST(ProcessHasFailed);
  KT_RUN_TEST(ProcessHasSucceeded);
  KT_RUN_TEST(ProcessSpawnNullPath);
  KT_RUN_TEST(ProcessSpawnInvalidPath);

  KT_RUN_TEST(ProcessSpawnIBValid);
  KT_RUN_TEST(ProcessSpawnIBInvalid);

  KT_RUN_TEST(ProcessExitValid);
  KT_RUN_TEST(ProcessExitWithCode);
  KT_RUN_TEST(ProcessExitInvalid);

  return KT_TEST_SUCCESS;
}