T_MAYFAIL;
T_EXPECT_TRUE(os_variant_allows_internal_security_policies("com.apple.Libc.tests"), NULL);
+
+ T_MAYFAIL;
+ T_EXPECT_FALSE(os_variant_has_factory_content("com.apple.Libc.tests"), NULL);
+
+ T_MAYFAIL;
+ T_EXPECT_FALSE(os_variant_is_darwinos("com.apple.Libc.tests"), NULL);
+
+ T_MAYFAIL;
+ T_EXPECT_FALSE(os_variant_uses_ephemeral_storage("com.apple.Libc.tests"), NULL);
+
+ T_MAYFAIL;
+ T_EXPECT_TRUE(os_variant_check("com.apple.Libc.tests", "HasFullLogging"), NULL);
}
#define VARIANT_SKIP_EXPORTED
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-function"
#include "../libdarwin/variant.c"
+#pragma clang diagnostic pop
T_DECL(os_variant_detailed, "Looks at individual checks")
{
- T_MAYFAIL;
- T_EXPECT_FALSE(_check_disabled(VP_ALL), NULL);
-
T_MAYFAIL;
T_EXPECT_FALSE(_check_disabled(VP_CONTENT), NULL);
#if TARGET_OS_IPHONE
T_MAYFAIL;
T_EXPECT_TRUE(_check_internal_release_type(), NULL);
+
+ T_MAYFAIL;
+ T_EXPECT_TRUE(_check_factory_release_type(), NULL);
#else
T_MAYFAIL;
T_EXPECT_FALSE(_check_internal_diags_profile(), NULL);
+
+ T_MAYFAIL;
+ T_EXPECT_FALSE(_check_factory_content(), NULL);
#endif
T_MAYFAIL;
T_DECL(os_variant_override_parse, "Checks the parsing of the override file")
{
// Warm up the dispatch_once
- _check_disabled(VP_ALL);
+ _check_disabled(VP_CONTENT);
T_LOG("Override: NULL"); // Live system
_parse_disabled_status(NULL);
T_EXPECT_TRUE(os_variant_allows_internal_security_policies(NULL), NULL);
status = STATUS_INITIAL_BITS |
- (S_NO << (SFP_CAN_HAS_DEBUGGER * STATUS_BIT_WIDTH));
- T_LOG("Restoring status without can_has_debugger: %llx", status);
+ (S_NO << (SFP_CAN_HAS_DEBUGGER * STATUS_BIT_WIDTH)) |
+ (S_NO << (SFP_DEVELOPMENT_KERNEL * STATUS_BIT_WIDTH));
+ T_LOG("Restoring status without can_has_debugger and development_kernel: %llx", status);
_restore_cached_check_status(status);
T_EXPECT_FALSE(_check_can_has_debugger(), NULL);
T_EXPECT_TRUE(_check_disabled(VP_SECURITY), NULL);
}
+
+// Ignore the last NULL entry in _variant_map.
+#define VARIANTS_LEN (sizeof(_variant_map) / sizeof(_variant_map[0])) - 1
+
+T_DECL(os_variant_asciibetical,
+ "Check that the variant map is in asciibetical order")
+{
+ const char *prev_variant = _variant_map[0].variant;
+ for (size_t i = 1; i < VARIANTS_LEN; i++) {
+ const char *variant = _variant_map[i].variant;
+ T_EXPECT_GT(strcmp(variant, prev_variant), 0,
+ "Variant %s should be asciibetically after variant %s",
+ variant, prev_variant);
+ prev_variant = variant;
+ }
+}
+
+T_DECL(os_variant_copy_description,
+ "Check that the description matches what os_variant_check returns")
+{
+ T_SETUPBEGIN;
+ struct {
+ const char *variant;
+ bool seen;
+ } seen_variants[VARIANTS_LEN] = {};
+ for (size_t i = 0; i < VARIANTS_LEN; i++) {
+ seen_variants[i].variant = _variant_map[i].variant;
+ T_QUIET; T_ASSERT_NOTNULL(seen_variants[i].variant,
+ "copied variant %zu to test for", i);
+ }
+ T_SETUPEND;
+
+ char *variant_desc = os_variant_copy_description("com.apple.Libc.tests");
+ T_WITH_ERRNO; T_ASSERT_NOTNULL(variant_desc,
+ "copied os_variant description");
+ T_LOG("Got os_variant description: %s", variant_desc);
+
+ char *next_variant = variant_desc;
+ while (next_variant && next_variant[0] != '\0') {
+ char *variant_end = strchr(next_variant, ' ');
+ if (variant_end) {
+ variant_end[0] = '\0';
+ variant_end += 1;
+ }
+ for (size_t i = 0; i < VARIANTS_LEN; i++) {
+ if (strcmp(next_variant, seen_variants[i].variant) == 0) {
+ seen_variants[i].seen = true;
+ }
+ }
+ T_EXPECT_TRUE(os_variant_check("com.apple.Libc.tests", next_variant),
+ "Y: %s: os_variant_check should agree with description",
+ next_variant);
+ next_variant = variant_end;
+ }
+
+ for (size_t i = 0; i < VARIANTS_LEN; i++) {
+ if (!seen_variants[i].seen) {
+ T_EXPECT_FALSE(os_variant_check("com.apple.Libc.tests",
+ seen_variants[i].variant),
+ "N: %s: os_variant_check should return false for variant "
+ "missing from description", seen_variants[i].variant);
+ }
+ }
+
+ free(variant_desc);
+}