• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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