]> git.saurik.com Git - apple/libc.git/blob - tests/os_variant.c
4890c51f6c1ef82bc9d15bc087c3b469ccd316de
[apple/libc.git] / tests / os_variant.c
1 #include <os/variant_private.h>
2
3 #include <darwintest.h>
4
5 /*
6 * Most of these are MAYFAIL because the test might sometimes run on non-internal devices.
7 */
8
9 T_DECL(os_variant_basic, "Just calls all the APIs")
10 {
11 T_MAYFAIL;
12 T_EXPECT_TRUE(os_variant_has_internal_content("com.apple.Libc.tests"), NULL);
13
14 T_MAYFAIL;
15 T_EXPECT_TRUE(os_variant_has_internal_diagnostics("com.apple.Libc.tests"), NULL);
16
17 T_MAYFAIL;
18 T_EXPECT_TRUE(os_variant_has_internal_ui("com.apple.Libc.tests"), NULL);
19
20 T_MAYFAIL;
21 T_EXPECT_TRUE(os_variant_allows_internal_security_policies("com.apple.Libc.tests"), NULL);
22
23 T_MAYFAIL;
24 T_EXPECT_FALSE(os_variant_has_factory_content("com.apple.Libc.tests"), NULL);
25 }
26
27 #define VARIANT_SKIP_EXPORTED
28
29 #include "../libdarwin/variant.c"
30
31 T_DECL(os_variant_detailed, "Looks at individual checks")
32 {
33 T_MAYFAIL;
34 T_EXPECT_FALSE(_check_disabled(VP_CONTENT), NULL);
35
36 T_MAYFAIL;
37 T_EXPECT_FALSE(_check_disabled(VP_DIAGNOSTICS), NULL);
38
39 T_MAYFAIL;
40 T_EXPECT_FALSE(_check_disabled(VP_UI), NULL);
41
42 T_MAYFAIL;
43 T_EXPECT_FALSE(_check_disabled(VP_SECURITY), NULL);
44
45 #if !TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
46 T_MAYFAIL;
47 T_EXPECT_TRUE(_check_internal_content(), NULL);
48 #endif
49
50 #if TARGET_OS_IPHONE
51 T_MAYFAIL;
52 T_EXPECT_TRUE(_check_internal_release_type(), NULL);
53
54 T_MAYFAIL;
55 T_EXPECT_TRUE(_check_factory_release_type(), NULL);
56 #else
57 T_MAYFAIL;
58 T_EXPECT_FALSE(_check_internal_diags_profile(), NULL);
59
60 T_MAYFAIL;
61 T_EXPECT_FALSE(_check_factory_content(), NULL);
62 #endif
63
64 T_MAYFAIL;
65 T_EXPECT_TRUE(_check_can_has_debugger(), NULL);
66 }
67
68 T_DECL(os_variant_override_parse, "Checks the parsing of the override file")
69 {
70 // Warm up the dispatch_once
71 _check_disabled(VP_CONTENT);
72
73 T_LOG("Override: NULL"); // Live system
74 _parse_disabled_status(NULL);
75 T_MAYFAIL; T_EXPECT_FALSE(_check_disabled(VP_CONTENT), NULL);
76 T_MAYFAIL; T_EXPECT_FALSE(_check_disabled(VP_DIAGNOSTICS), NULL);
77 T_MAYFAIL; T_EXPECT_FALSE(_check_disabled(VP_UI), NULL);
78 T_MAYFAIL; T_EXPECT_FALSE(_check_disabled(VP_SECURITY), NULL);
79
80 T_LOG("Override: \"content\"");
81 _parse_disabled_status("content");
82 T_EXPECT_TRUE(_check_disabled(VP_CONTENT), NULL);
83 T_EXPECT_FALSE(_check_disabled(VP_DIAGNOSTICS), NULL);
84 T_EXPECT_FALSE(_check_disabled(VP_UI), NULL);
85 T_EXPECT_FALSE(_check_disabled(VP_SECURITY), NULL);
86
87 T_LOG("Override: \"ui\"");
88 _parse_disabled_status("ui");
89 T_EXPECT_FALSE(_check_disabled(VP_CONTENT), NULL);
90 T_EXPECT_FALSE(_check_disabled(VP_DIAGNOSTICS), NULL);
91 T_EXPECT_TRUE(_check_disabled(VP_UI), NULL);
92 T_EXPECT_FALSE(_check_disabled(VP_SECURITY), NULL);
93
94 T_LOG("Override: \"security,diagnostics\"");
95 _parse_disabled_status("security,diagnostics");
96 T_EXPECT_FALSE(_check_disabled(VP_CONTENT), NULL);
97 T_EXPECT_TRUE(_check_disabled(VP_DIAGNOSTICS), NULL);
98 T_EXPECT_FALSE(_check_disabled(VP_UI), NULL);
99 T_EXPECT_TRUE(_check_disabled(VP_SECURITY), NULL);
100
101 T_LOG("Override: \"content,diagnostics,ui,security\"");
102 _parse_disabled_status("content,diagnostics,ui,security");
103 T_EXPECT_TRUE(_check_disabled(VP_CONTENT), NULL);
104 T_EXPECT_TRUE(_check_disabled(VP_DIAGNOSTICS), NULL);
105 T_EXPECT_TRUE(_check_disabled(VP_UI), NULL);
106 T_EXPECT_TRUE(_check_disabled(VP_SECURITY), NULL);
107
108 T_LOG("Override: \"diagnostics\\n"); // Now check newline-handling.
109 _parse_disabled_status("diagnostics\n");
110 T_EXPECT_FALSE(_check_disabled(VP_CONTENT), NULL);
111 T_EXPECT_TRUE(_check_disabled(VP_DIAGNOSTICS), NULL);
112 T_EXPECT_FALSE(_check_disabled(VP_UI), NULL);
113 T_EXPECT_FALSE(_check_disabled(VP_SECURITY), NULL);
114
115 T_LOG("Override: \"content,diagnostics\\nui,security\\n\"");
116 _parse_disabled_status("content,diagnostics\nui,security\n");
117 T_EXPECT_TRUE(_check_disabled(VP_CONTENT), NULL);
118 T_EXPECT_TRUE(_check_disabled(VP_DIAGNOSTICS), NULL);
119 T_EXPECT_TRUE(_check_disabled(VP_UI), NULL);
120 T_EXPECT_TRUE(_check_disabled(VP_SECURITY), NULL);
121 }
122
123 T_DECL(os_status_cache, "Checks saving and restoring of state")
124 {
125 uint64_t status = 0;
126 size_t status_size = sizeof(status);
127 int ret = sysctlbyname(CACHE_SYSCTL_NAME, &status, &status_size, NULL, 0);
128 T_EXPECT_POSIX_ZERO(ret, "sysctlbyname(kern.osvariant_status)");
129 T_EXPECT_GT(status, 0ULL, "Kernel's status has bits set");
130 T_EXPECT_EQ(status & STATUS_INITIAL_BITS, STATUS_INITIAL_BITS, "Kernel's status has initial bits set");
131
132 T_MAYFAIL;
133 T_EXPECT_TRUE(_check_can_has_debugger(), NULL);
134
135 status = _get_cached_check_status();
136 T_LOG("Cached status: %llx", status);
137
138 T_EXPECT_EQ(status & STATUS_INITIAL_BITS, STATUS_INITIAL_BITS, "Our status has initial bits set");
139
140 _restore_cached_check_status(status);
141
142 T_MAYFAIL;
143 T_EXPECT_TRUE(os_variant_allows_internal_security_policies(NULL), NULL);
144
145 status = STATUS_INITIAL_BITS |
146 (S_NO << (SFP_CAN_HAS_DEBUGGER * STATUS_BIT_WIDTH));
147 T_LOG("Restoring status without can_has_debugger: %llx", status);
148 _restore_cached_check_status(status);
149
150 T_EXPECT_FALSE(_check_can_has_debugger(), NULL);
151
152 // Trigger dispatch_once internally with known state
153 _check_disabled(VP_SECURITY);
154
155 status = STATUS_INITIAL_BITS |
156 (0x1ULL << (VP_SECURITY + 32));
157 T_LOG("Restoring status with override: %llx", status);
158 _restore_cached_check_status(status);
159
160 T_EXPECT_TRUE(_check_disabled(VP_SECURITY), NULL);
161 }