11f9cb04fSpatrick //===-- sanitizer_mac_test.cpp --------------------------------------------===//
21f9cb04fSpatrick //
31f9cb04fSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41f9cb04fSpatrick // See https://llvm.org/LICENSE.txt for license information.
51f9cb04fSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61f9cb04fSpatrick //
71f9cb04fSpatrick //===----------------------------------------------------------------------===//
81f9cb04fSpatrick //
91f9cb04fSpatrick // Tests for sanitizer_mac.{h,cpp}
101f9cb04fSpatrick //
111f9cb04fSpatrick //===----------------------------------------------------------------------===//
121f9cb04fSpatrick
131f9cb04fSpatrick #include "sanitizer_common/sanitizer_platform.h"
14*810390e3Srobert #if SANITIZER_APPLE
151f9cb04fSpatrick
161f9cb04fSpatrick #include "sanitizer_common/sanitizer_mac.h"
171f9cb04fSpatrick
181f9cb04fSpatrick #include "gtest/gtest.h"
191f9cb04fSpatrick
201f9cb04fSpatrick #include <sys/sysctl.h> // sysctlbyname
211f9cb04fSpatrick #include <mach/kern_return.h> // KERN_SUCCESS
221f9cb04fSpatrick
231f9cb04fSpatrick namespace __sanitizer {
241f9cb04fSpatrick
251f9cb04fSpatrick void ParseVersion(const char *vers, u16 *major, u16 *minor);
261f9cb04fSpatrick
TEST(SanitizerMac,ParseVersion)271f9cb04fSpatrick TEST(SanitizerMac, ParseVersion) {
281f9cb04fSpatrick u16 major, minor;
29d89ec533Spatrick
301f9cb04fSpatrick ParseVersion("11.22.33", &major, &minor);
311f9cb04fSpatrick EXPECT_EQ(major, 11);
321f9cb04fSpatrick EXPECT_EQ(minor, 22);
33d89ec533Spatrick
34d89ec533Spatrick ParseVersion("1.2", &major, &minor);
35d89ec533Spatrick EXPECT_EQ(major, 1);
36d89ec533Spatrick EXPECT_EQ(minor, 2);
371f9cb04fSpatrick }
381f9cb04fSpatrick
39d89ec533Spatrick // TODO(yln): Run sanitizer unit tests for the simulators (rdar://65680742)
40d89ec533Spatrick #if SANITIZER_IOSSIM
TEST(SanitizerMac,GetMacosAlignedVersion)41d89ec533Spatrick TEST(SanitizerMac, GetMacosAlignedVersion) {
42d89ec533Spatrick const char *vers_str;
43d89ec533Spatrick if (SANITIZER_IOS || SANITIZER_TVOS) {
44d89ec533Spatrick vers_str = "13.0";
45d89ec533Spatrick } else if (SANITIZER_WATCHOS) {
46d89ec533Spatrick vers_str = "6.5";
47d89ec533Spatrick } else {
48d89ec533Spatrick FAIL() << "unsupported simulator runtime";
49d89ec533Spatrick }
50d89ec533Spatrick setenv("SIMULATOR_RUNTIME_VERSION", vers_str, /*overwrite=*/1);
51d89ec533Spatrick
52d89ec533Spatrick MacosVersion vers = GetMacosAlignedVersion();
53d89ec533Spatrick EXPECT_EQ(vers.major, 10);
54d89ec533Spatrick EXPECT_EQ(vers.minor, 15);
55d89ec533Spatrick }
56d89ec533Spatrick #else
TEST(SanitizerMac,GetMacosAlignedVersion)57d89ec533Spatrick TEST(SanitizerMac, GetMacosAlignedVersion) {
58d89ec533Spatrick MacosVersion vers = GetMacosAlignedVersion();
59d89ec533Spatrick std::ostringstream oss;
60d89ec533Spatrick oss << vers.major << '.' << vers.minor;
61d89ec533Spatrick std::string actual = oss.str();
62d89ec533Spatrick
63d89ec533Spatrick char buf[100];
64d89ec533Spatrick size_t len = sizeof(buf);
65d89ec533Spatrick int res = sysctlbyname("kern.osproductversion", buf, &len, nullptr, 0);
66d89ec533Spatrick ASSERT_EQ(res, KERN_SUCCESS);
67d89ec533Spatrick std::string expected(buf);
68d89ec533Spatrick
69d89ec533Spatrick // Prefix match
70d89ec533Spatrick ASSERT_EQ(expected.compare(0, actual.size(), actual), 0);
71d89ec533Spatrick }
72d89ec533Spatrick #endif
73d89ec533Spatrick
TEST(SanitizerMac,GetDarwinKernelVersion)741f9cb04fSpatrick TEST(SanitizerMac, GetDarwinKernelVersion) {
751f9cb04fSpatrick DarwinKernelVersion vers = GetDarwinKernelVersion();
761f9cb04fSpatrick std::ostringstream oss;
771f9cb04fSpatrick oss << vers.major << '.' << vers.minor;
781f9cb04fSpatrick std::string actual = oss.str();
791f9cb04fSpatrick
801f9cb04fSpatrick char buf[100];
811f9cb04fSpatrick size_t len = sizeof(buf);
821f9cb04fSpatrick int res = sysctlbyname("kern.osrelease", buf, &len, nullptr, 0);
831f9cb04fSpatrick ASSERT_EQ(res, KERN_SUCCESS);
841f9cb04fSpatrick std::string expected(buf);
851f9cb04fSpatrick
861f9cb04fSpatrick // Prefix match
871f9cb04fSpatrick ASSERT_EQ(expected.compare(0, actual.size(), actual), 0);
881f9cb04fSpatrick }
891f9cb04fSpatrick
901f9cb04fSpatrick } // namespace __sanitizer
911f9cb04fSpatrick
92*810390e3Srobert #endif // SANITIZER_APPLE
93