1 //===-- sanitizer_common_test.cc ------------------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of ThreadSanitizer/AddressSanitizer runtime.
11 //
12 //===----------------------------------------------------------------------===//
13 #include "sanitizer_common/sanitizer_common.h"
14 #include "sanitizer_common/sanitizer_libc.h"
15 #include "gtest/gtest.h"
16
17 namespace __sanitizer {
18
IsSorted(const uptr * array,uptr n)19 static bool IsSorted(const uptr *array, uptr n) {
20 for (uptr i = 1; i < n; i++) {
21 if (array[i] < array[i - 1]) return false;
22 }
23 return true;
24 }
25
TEST(SanitizerCommon,SortTest)26 TEST(SanitizerCommon, SortTest) {
27 uptr array[100];
28 uptr n = 100;
29 // Already sorted.
30 for (uptr i = 0; i < n; i++) {
31 array[i] = i;
32 }
33 SortArray(array, n);
34 EXPECT_TRUE(IsSorted(array, n));
35 // Reverse order.
36 for (uptr i = 0; i < n; i++) {
37 array[i] = n - 1 - i;
38 }
39 SortArray(array, n);
40 EXPECT_TRUE(IsSorted(array, n));
41 // Mixed order.
42 for (uptr i = 0; i < n; i++) {
43 array[i] = (i % 2 == 0) ? i : n - 1 - i;
44 }
45 SortArray(array, n);
46 EXPECT_TRUE(IsSorted(array, n));
47 // All equal.
48 for (uptr i = 0; i < n; i++) {
49 array[i] = 42;
50 }
51 SortArray(array, n);
52 EXPECT_TRUE(IsSorted(array, n));
53 // All but one sorted.
54 for (uptr i = 0; i < n - 1; i++) {
55 array[i] = i;
56 }
57 array[n - 1] = 42;
58 SortArray(array, n);
59 EXPECT_TRUE(IsSorted(array, n));
60 // Minimal case - sort three elements.
61 array[0] = 1;
62 array[1] = 0;
63 SortArray(array, 2);
64 EXPECT_TRUE(IsSorted(array, 2));
65 }
66
TEST(SanitizerCommon,MmapAlignedOrDie)67 TEST(SanitizerCommon, MmapAlignedOrDie) {
68 uptr PageSize = GetPageSizeCached();
69 for (uptr size = 1; size <= 32; size *= 2) {
70 for (uptr alignment = 1; alignment <= 32; alignment *= 2) {
71 for (int iter = 0; iter < 100; iter++) {
72 uptr res = (uptr)MmapAlignedOrDie(
73 size * PageSize, alignment * PageSize, "MmapAlignedOrDieTest");
74 EXPECT_EQ(0U, res % (alignment * PageSize));
75 internal_memset((void*)res, 1, size * PageSize);
76 UnmapOrDie((void*)res, size * PageSize);
77 }
78 }
79 }
80 }
81
82 #ifdef __linux__
TEST(SanitizerCommon,SanitizerSetThreadName)83 TEST(SanitizerCommon, SanitizerSetThreadName) {
84 const char *names[] = {
85 "0123456789012",
86 "01234567890123",
87 "012345678901234", // Larger names will be truncated on linux.
88 };
89
90 for (size_t i = 0; i < ARRAY_SIZE(names); i++) {
91 EXPECT_TRUE(SanitizerSetThreadName(names[i]));
92 char buff[100];
93 EXPECT_TRUE(SanitizerGetThreadName(buff, sizeof(buff) - 1));
94 EXPECT_EQ(0, internal_strcmp(buff, names[i]));
95 }
96 }
97 #endif
98
TEST(SanitizerCommon,InternalVector)99 TEST(SanitizerCommon, InternalVector) {
100 InternalVector<uptr> vector(1);
101 for (uptr i = 0; i < 100; i++) {
102 EXPECT_EQ(i, vector.size());
103 vector.push_back(i);
104 }
105 for (uptr i = 0; i < 100; i++) {
106 EXPECT_EQ(i, vector[i]);
107 }
108 for (int i = 99; i >= 0; i--) {
109 EXPECT_EQ((uptr)i, vector.back());
110 vector.pop_back();
111 EXPECT_EQ((uptr)i, vector.size());
112 }
113 }
114
115 } // namespace __sanitizer
116