compiler-rt checks OS versions by querying the Darwin kernel version. This is not necessarily correct inside the simulators if the simulator runtime is not aligned with the host macOS. Let's instead check the `SIMULATOR_RUNTIME_VERSION` env var. rdar://63031937 Reviewed By: delcypher Differential Revision: https://reviews.llvm.org/D83977
87 lines
2.4 KiB
C++
87 lines
2.4 KiB
C++
//===-- 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 <sys/sysctl.h> // sysctlbyname
|
|
#include <mach/kern_return.h> // 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();
|
|
u16 kernel_major = GetDarwinKernelVersion().major;
|
|
bool macos_11 = (kernel_major >= 20);
|
|
u16 expected_major = macos_11 ? (kernel_major - 9) : 10;
|
|
u16 expected_minor = macos_11 ? 0 : (kernel_major - 4);
|
|
EXPECT_EQ(vers.major, expected_major);
|
|
EXPECT_EQ(vers.minor, expected_minor);
|
|
}
|
|
#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
|