//===-- sanitizer_mac_test.cpp --------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Tests for sanitizer_mac.{h,cpp} // //===----------------------------------------------------------------------===// #include "sanitizer_common/sanitizer_platform.h" #if SANITIZER_MAC #include "sanitizer_common/sanitizer_mac.h" #include "gtest/gtest.h" #include // sysctlbyname #include // KERN_SUCCESS namespace __sanitizer { void ParseVersion(const char *vers, u16 *major, u16 *minor); TEST(SanitizerMac, ParseVersion) { u16 major, minor; ParseVersion("11.22.33", &major, &minor); EXPECT_EQ(major, 11); EXPECT_EQ(minor, 22); ParseVersion("1.2", &major, &minor); EXPECT_EQ(major, 1); EXPECT_EQ(minor, 2); } // TODO(yln): Run sanitizer unit tests for the simulators (rdar://65680742) #if SANITIZER_IOSSIM TEST(SanitizerMac, GetMacosAlignedVersion) { const char *vers_str; if (SANITIZER_IOS || SANITIZER_TVOS) { vers_str = "13.0"; } else if (SANITIZER_WATCHOS) { vers_str = "6.5"; } else { FAIL() << "unsupported simulator runtime"; } setenv("SIMULATOR_RUNTIME_VERSION", vers_str, /*overwrite=*/1); MacosVersion vers = GetMacosAlignedVersion(); EXPECT_EQ(vers.major, 10); EXPECT_EQ(vers.minor, 15); } #else TEST(SanitizerMac, GetMacosAlignedVersion) { MacosVersion vers = GetMacosAlignedVersion(); std::ostringstream oss; oss << vers.major << '.' << vers.minor; std::string actual = oss.str(); char buf[100]; size_t len = sizeof(buf); int res = sysctlbyname("kern.osproductversion", buf, &len, nullptr, 0); ASSERT_EQ(res, KERN_SUCCESS); std::string expected(buf); // Prefix match ASSERT_EQ(expected.compare(0, actual.size(), actual), 0); } #endif TEST(SanitizerMac, GetDarwinKernelVersion) { DarwinKernelVersion vers = GetDarwinKernelVersion(); std::ostringstream oss; oss << vers.major << '.' << vers.minor; std::string actual = oss.str(); char buf[100]; size_t len = sizeof(buf); int res = sysctlbyname("kern.osrelease", buf, &len, nullptr, 0); ASSERT_EQ(res, KERN_SUCCESS); std::string expected(buf); // Prefix match ASSERT_EQ(expected.compare(0, actual.size(), actual), 0); } } // namespace __sanitizer #endif // SANITIZER_MAC