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