1 #include <os/variant_private.h>
3 #include <darwintest.h>
6 * Most of these are MAYFAIL because the test might sometimes run on non-internal devices.
9 T_DECL(os_variant_basic
, "Just calls all the APIs")
12 T_EXPECT_TRUE(os_variant_has_internal_content("com.apple.Libc.tests"), NULL
);
15 T_EXPECT_TRUE(os_variant_has_internal_diagnostics("com.apple.Libc.tests"), NULL
);
18 T_EXPECT_TRUE(os_variant_has_internal_ui("com.apple.Libc.tests"), NULL
);
21 T_EXPECT_TRUE(os_variant_allows_internal_security_policies("com.apple.Libc.tests"), NULL
);
24 T_EXPECT_FALSE(os_variant_has_factory_content("com.apple.Libc.tests"), NULL
);
27 T_EXPECT_FALSE(os_variant_is_darwinos("com.apple.Libc.tests"), NULL
);
30 T_EXPECT_FALSE(os_variant_uses_ephemeral_storage("com.apple.Libc.tests"), NULL
);
33 #define VARIANT_SKIP_EXPORTED
35 #include "../libdarwin/variant.c"
37 T_DECL(os_variant_detailed
, "Looks at individual checks")
40 T_EXPECT_FALSE(_check_disabled(VP_CONTENT
), NULL
);
43 T_EXPECT_FALSE(_check_disabled(VP_DIAGNOSTICS
), NULL
);
46 T_EXPECT_FALSE(_check_disabled(VP_UI
), NULL
);
49 T_EXPECT_FALSE(_check_disabled(VP_SECURITY
), NULL
);
51 #if !TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR
53 T_EXPECT_TRUE(_check_internal_content(), NULL
);
58 T_EXPECT_TRUE(_check_internal_release_type(), NULL
);
61 T_EXPECT_TRUE(_check_factory_release_type(), NULL
);
64 T_EXPECT_FALSE(_check_internal_diags_profile(), NULL
);
67 T_EXPECT_FALSE(_check_factory_content(), NULL
);
71 T_EXPECT_TRUE(_check_can_has_debugger(), NULL
);
74 T_DECL(os_variant_override_parse
, "Checks the parsing of the override file")
76 // Warm up the dispatch_once
77 _check_disabled(VP_CONTENT
);
79 T_LOG("Override: NULL"); // Live system
80 _parse_disabled_status(NULL
);
81 T_MAYFAIL
; T_EXPECT_FALSE(_check_disabled(VP_CONTENT
), NULL
);
82 T_MAYFAIL
; T_EXPECT_FALSE(_check_disabled(VP_DIAGNOSTICS
), NULL
);
83 T_MAYFAIL
; T_EXPECT_FALSE(_check_disabled(VP_UI
), NULL
);
84 T_MAYFAIL
; T_EXPECT_FALSE(_check_disabled(VP_SECURITY
), NULL
);
86 T_LOG("Override: \"content\"");
87 _parse_disabled_status("content");
88 T_EXPECT_TRUE(_check_disabled(VP_CONTENT
), NULL
);
89 T_EXPECT_FALSE(_check_disabled(VP_DIAGNOSTICS
), NULL
);
90 T_EXPECT_FALSE(_check_disabled(VP_UI
), NULL
);
91 T_EXPECT_FALSE(_check_disabled(VP_SECURITY
), NULL
);
93 T_LOG("Override: \"ui\"");
94 _parse_disabled_status("ui");
95 T_EXPECT_FALSE(_check_disabled(VP_CONTENT
), NULL
);
96 T_EXPECT_FALSE(_check_disabled(VP_DIAGNOSTICS
), NULL
);
97 T_EXPECT_TRUE(_check_disabled(VP_UI
), NULL
);
98 T_EXPECT_FALSE(_check_disabled(VP_SECURITY
), NULL
);
100 T_LOG("Override: \"security,diagnostics\"");
101 _parse_disabled_status("security,diagnostics");
102 T_EXPECT_FALSE(_check_disabled(VP_CONTENT
), NULL
);
103 T_EXPECT_TRUE(_check_disabled(VP_DIAGNOSTICS
), NULL
);
104 T_EXPECT_FALSE(_check_disabled(VP_UI
), NULL
);
105 T_EXPECT_TRUE(_check_disabled(VP_SECURITY
), NULL
);
107 T_LOG("Override: \"content,diagnostics,ui,security\"");
108 _parse_disabled_status("content,diagnostics,ui,security");
109 T_EXPECT_TRUE(_check_disabled(VP_CONTENT
), NULL
);
110 T_EXPECT_TRUE(_check_disabled(VP_DIAGNOSTICS
), NULL
);
111 T_EXPECT_TRUE(_check_disabled(VP_UI
), NULL
);
112 T_EXPECT_TRUE(_check_disabled(VP_SECURITY
), NULL
);
114 T_LOG("Override: \"diagnostics\\n"); // Now check newline-handling.
115 _parse_disabled_status("diagnostics\n");
116 T_EXPECT_FALSE(_check_disabled(VP_CONTENT
), NULL
);
117 T_EXPECT_TRUE(_check_disabled(VP_DIAGNOSTICS
), NULL
);
118 T_EXPECT_FALSE(_check_disabled(VP_UI
), NULL
);
119 T_EXPECT_FALSE(_check_disabled(VP_SECURITY
), NULL
);
121 T_LOG("Override: \"content,diagnostics\\nui,security\\n\"");
122 _parse_disabled_status("content,diagnostics\nui,security\n");
123 T_EXPECT_TRUE(_check_disabled(VP_CONTENT
), NULL
);
124 T_EXPECT_TRUE(_check_disabled(VP_DIAGNOSTICS
), NULL
);
125 T_EXPECT_TRUE(_check_disabled(VP_UI
), NULL
);
126 T_EXPECT_TRUE(_check_disabled(VP_SECURITY
), NULL
);
129 T_DECL(os_status_cache
, "Checks saving and restoring of state")
132 size_t status_size
= sizeof(status
);
133 int ret
= sysctlbyname(CACHE_SYSCTL_NAME
, &status
, &status_size
, NULL
, 0);
134 T_EXPECT_POSIX_ZERO(ret
, "sysctlbyname(kern.osvariant_status)");
135 T_EXPECT_GT(status
, 0ULL, "Kernel's status has bits set");
136 T_EXPECT_EQ(status
& STATUS_INITIAL_BITS
, STATUS_INITIAL_BITS
, "Kernel's status has initial bits set");
139 T_EXPECT_TRUE(_check_can_has_debugger(), NULL
);
141 status
= _get_cached_check_status();
142 T_LOG("Cached status: %llx", status
);
144 T_EXPECT_EQ(status
& STATUS_INITIAL_BITS
, STATUS_INITIAL_BITS
, "Our status has initial bits set");
146 _restore_cached_check_status(status
);
149 T_EXPECT_TRUE(os_variant_allows_internal_security_policies(NULL
), NULL
);
151 status
= STATUS_INITIAL_BITS
|
152 (S_NO
<< (SFP_CAN_HAS_DEBUGGER
* STATUS_BIT_WIDTH
)) |
153 (S_NO
<< (SFP_DEVELOPMENT_KERNEL
* STATUS_BIT_WIDTH
));
154 T_LOG("Restoring status without can_has_debugger and development_kernel: %llx", status
);
155 _restore_cached_check_status(status
);
157 T_EXPECT_FALSE(_check_can_has_debugger(), NULL
);
159 // Trigger dispatch_once internally with known state
160 _check_disabled(VP_SECURITY
);
162 status
= STATUS_INITIAL_BITS
|
163 (0x1ULL
<< (VP_SECURITY
+ 32));
164 T_LOG("Restoring status with override: %llx", status
);
165 _restore_cached_check_status(status
);
167 T_EXPECT_TRUE(_check_disabled(VP_SECURITY
), NULL
);