Home | History | Annotate | Download | only in tests
      1 //===-- interception_linux_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 // Tests for interception_linux.h.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 #include "interception/interception.h"
     15 
     16 #include "gtest/gtest.h"
     17 
     18 // Too slow for debug build
     19 #if !SANITIZER_DEBUG
     20 #if SANITIZER_LINUX
     21 
     22 static int InterceptorFunctionCalled;
     23 
     24 DECLARE_REAL(int, isdigit, int);
     25 
     26 INTERCEPTOR(int, isdigit, int d) {
     27   ++InterceptorFunctionCalled;
     28   return d >= '0' && d <= '9';
     29 }
     30 
     31 namespace __interception {
     32 
     33 TEST(Interception, GetRealFunctionAddress) {
     34   uptr expected_malloc_address = (uptr)(void*)&malloc;
     35   uptr malloc_address = 0;
     36   EXPECT_TRUE(GetRealFunctionAddress("malloc", &malloc_address, 0, 0));
     37   EXPECT_EQ(expected_malloc_address, malloc_address);
     38 
     39   uptr dummy_address = 0;
     40   EXPECT_TRUE(
     41       GetRealFunctionAddress("dummy_doesnt_exist__", &dummy_address, 0, 0));
     42   EXPECT_EQ(0U, dummy_address);
     43 }
     44 
     45 TEST(Interception, Basic) {
     46   ASSERT_TRUE(INTERCEPT_FUNCTION(isdigit));
     47 
     48   // After interception, the counter should be incremented.
     49   InterceptorFunctionCalled = 0;
     50   EXPECT_NE(0, isdigit('1'));
     51   EXPECT_EQ(1, InterceptorFunctionCalled);
     52   EXPECT_EQ(0, isdigit('a'));
     53   EXPECT_EQ(2, InterceptorFunctionCalled);
     54 
     55   // Calling the REAL function should not affect the counter.
     56   InterceptorFunctionCalled = 0;
     57   EXPECT_NE(0, REAL(isdigit)('1'));
     58   EXPECT_EQ(0, REAL(isdigit)('a'));
     59   EXPECT_EQ(0, InterceptorFunctionCalled);
     60 }
     61 
     62 }  // namespace __interception
     63 
     64 #endif  // SANITIZER_LINUX
     65 #endif  // #if !SANITIZER_DEBUG
     66