Home | History | Annotate | Download | only in tests
      1 //===-- sanitizer_stackdepot_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_stackdepot.h"
     14 #include "sanitizer_common/sanitizer_internal_defs.h"
     15 #include "sanitizer_common/sanitizer_libc.h"
     16 #include "gtest/gtest.h"
     17 
     18 namespace __sanitizer {
     19 
     20 TEST(SanitizerCommon, StackDepotBasic) {
     21   uptr array[] = {1, 2, 3, 4, 5};
     22   StackTrace s1(array, ARRAY_SIZE(array));
     23   u32 i1 = StackDepotPut(s1);
     24   StackTrace stack = StackDepotGet(i1);
     25   EXPECT_NE(stack.trace, (uptr*)0);
     26   EXPECT_EQ(ARRAY_SIZE(array), stack.size);
     27   EXPECT_EQ(0, internal_memcmp(stack.trace, array, sizeof(array)));
     28 }
     29 
     30 TEST(SanitizerCommon, StackDepotAbsent) {
     31   StackTrace stack = StackDepotGet((1 << 30) - 1);
     32   EXPECT_EQ((uptr*)0, stack.trace);
     33 }
     34 
     35 TEST(SanitizerCommon, StackDepotEmptyStack) {
     36   u32 i1 = StackDepotPut(StackTrace());
     37   StackTrace stack = StackDepotGet(i1);
     38   EXPECT_EQ((uptr*)0, stack.trace);
     39 }
     40 
     41 TEST(SanitizerCommon, StackDepotZeroId) {
     42   StackTrace stack = StackDepotGet(0);
     43   EXPECT_EQ((uptr*)0, stack.trace);
     44 }
     45 
     46 TEST(SanitizerCommon, StackDepotSame) {
     47   uptr array[] = {1, 2, 3, 4, 6};
     48   StackTrace s1(array, ARRAY_SIZE(array));
     49   u32 i1 = StackDepotPut(s1);
     50   u32 i2 = StackDepotPut(s1);
     51   EXPECT_EQ(i1, i2);
     52   StackTrace stack = StackDepotGet(i1);
     53   EXPECT_NE(stack.trace, (uptr*)0);
     54   EXPECT_EQ(ARRAY_SIZE(array), stack.size);
     55   EXPECT_EQ(0, internal_memcmp(stack.trace, array, sizeof(array)));
     56 }
     57 
     58 TEST(SanitizerCommon, StackDepotSeveral) {
     59   uptr array1[] = {1, 2, 3, 4, 7};
     60   StackTrace s1(array1, ARRAY_SIZE(array1));
     61   u32 i1 = StackDepotPut(s1);
     62   uptr array2[] = {1, 2, 3, 4, 8, 9};
     63   StackTrace s2(array2, ARRAY_SIZE(array2));
     64   u32 i2 = StackDepotPut(s2);
     65   EXPECT_NE(i1, i2);
     66 }
     67 
     68 TEST(SanitizerCommon, StackDepotReverseMap) {
     69   uptr array1[] = {1, 2, 3, 4, 5};
     70   uptr array2[] = {7, 1, 3, 0};
     71   uptr array3[] = {10, 2, 5, 3};
     72   uptr array4[] = {1, 3, 2, 5};
     73   u32 ids[4] = {0};
     74   StackTrace s1(array1, ARRAY_SIZE(array1));
     75   StackTrace s2(array2, ARRAY_SIZE(array2));
     76   StackTrace s3(array3, ARRAY_SIZE(array3));
     77   StackTrace s4(array4, ARRAY_SIZE(array4));
     78   ids[0] = StackDepotPut(s1);
     79   ids[1] = StackDepotPut(s2);
     80   ids[2] = StackDepotPut(s3);
     81   ids[3] = StackDepotPut(s4);
     82 
     83   StackDepotReverseMap map;
     84 
     85   for (uptr i = 0; i < 4; i++) {
     86     StackTrace stack = StackDepotGet(ids[i]);
     87     StackTrace from_map = map.Get(ids[i]);
     88     EXPECT_EQ(stack.size, from_map.size);
     89     EXPECT_EQ(stack.trace, from_map.trace);
     90   }
     91 }
     92 
     93 }  // namespace __sanitizer
     94