Home | History | Annotate | Download | only in tests
      1 //===-- sanitizer_common_printer_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 sanitizer_common test suite.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 #include "sanitizer_common/sanitizer_stacktrace_printer.h"
     14 
     15 #include "gtest/gtest.h"
     16 
     17 namespace __sanitizer {
     18 
     19 TEST(SanitizerStacktracePrinter, RenderSourceLocation) {
     20   InternalScopedString str(128);
     21   RenderSourceLocation(&str, "/dir/file.cc", 10, 5, false, "");
     22   EXPECT_STREQ("/dir/file.cc:10:5", str.data());
     23 
     24   str.clear();
     25   RenderSourceLocation(&str, "/dir/file.cc", 11, 0, false, "");
     26   EXPECT_STREQ("/dir/file.cc:11", str.data());
     27 
     28   str.clear();
     29   RenderSourceLocation(&str, "/dir/file.cc", 0, 0, false, "");
     30   EXPECT_STREQ("/dir/file.cc", str.data());
     31 
     32   str.clear();
     33   RenderSourceLocation(&str, "/dir/file.cc", 10, 5, false, "/dir/");
     34   EXPECT_STREQ("file.cc:10:5", str.data());
     35 
     36   str.clear();
     37   RenderSourceLocation(&str, "/dir/file.cc", 10, 5, true, "");
     38   EXPECT_STREQ("/dir/file.cc(10,5)", str.data());
     39 
     40   str.clear();
     41   RenderSourceLocation(&str, "/dir/file.cc", 11, 0, true, "");
     42   EXPECT_STREQ("/dir/file.cc(11)", str.data());
     43 
     44   str.clear();
     45   RenderSourceLocation(&str, "/dir/file.cc", 0, 0, true, "");
     46   EXPECT_STREQ("/dir/file.cc", str.data());
     47 
     48   str.clear();
     49   RenderSourceLocation(&str, "/dir/file.cc", 10, 5, true, "/dir/");
     50   EXPECT_STREQ("file.cc(10,5)", str.data());
     51 }
     52 
     53 TEST(SanitizerStacktracePrinter, RenderModuleLocation) {
     54   InternalScopedString str(128);
     55   RenderModuleLocation(&str, "/dir/exe", 0x123, "");
     56   EXPECT_STREQ("(/dir/exe+0x123)", str.data());
     57 
     58   // Check that we strip file prefix if necessary.
     59   str.clear();
     60   RenderModuleLocation(&str, "/dir/exe", 0x123, "/dir/");
     61   EXPECT_STREQ("(exe+0x123)", str.data());
     62 }
     63 
     64 TEST(SanitizerStacktracePrinter, RenderFrame) {
     65   int frame_no = 42;
     66   AddressInfo info;
     67   info.address = 0x400000;
     68   info.module = internal_strdup("/path/to/my/module");
     69   info.module_offset = 0x200;
     70   info.function = internal_strdup("function_foo");
     71   info.function_offset = 0x100;
     72   info.file = internal_strdup("/path/to/my/source");
     73   info.line = 10;
     74   info.column = 5;
     75   InternalScopedString str(256);
     76 
     77   // Dump all the AddressInfo fields.
     78   RenderFrame(&str, "%% Frame:%n PC:%p Module:%m ModuleOffset:%o "
     79                     "Function:%f FunctionOffset:%q Source:%s Line:%l "
     80                     "Column:%c",
     81               frame_no, info, false, "/path/to/", "function_");
     82   EXPECT_STREQ("% Frame:42 PC:0x400000 Module:my/module ModuleOffset:0x200 "
     83                "Function:foo FunctionOffset:0x100 Source:my/source Line:10 "
     84                "Column:5",
     85                str.data());
     86   info.Clear();
     87   str.clear();
     88 
     89   // Test special format specifiers.
     90   info.address = 0x400000;
     91   RenderFrame(&str, "%M", frame_no, info, false);
     92   EXPECT_NE(nullptr, internal_strstr(str.data(), "400000"));
     93   str.clear();
     94 
     95   RenderFrame(&str, "%L", frame_no, info, false);
     96   EXPECT_STREQ("(<unknown module>)", str.data());
     97   str.clear();
     98 
     99   info.module = internal_strdup("/path/to/module");
    100   info.module_offset = 0x200;
    101   RenderFrame(&str, "%M", frame_no, info, false);
    102   EXPECT_NE(nullptr, internal_strstr(str.data(), "(module+0x"));
    103   EXPECT_NE(nullptr, internal_strstr(str.data(), "200"));
    104   str.clear();
    105 
    106   RenderFrame(&str, "%L", frame_no, info, false);
    107   EXPECT_STREQ("(/path/to/module+0x200)", str.data());
    108   str.clear();
    109 
    110   info.function = internal_strdup("my_function");
    111   RenderFrame(&str, "%F", frame_no, info, false);
    112   EXPECT_STREQ("in my_function", str.data());
    113   str.clear();
    114 
    115   info.function_offset = 0x100;
    116   RenderFrame(&str, "%F %S", frame_no, info, false);
    117   EXPECT_STREQ("in my_function+0x100 <null>", str.data());
    118   str.clear();
    119 
    120   info.file = internal_strdup("my_file");
    121   RenderFrame(&str, "%F %S", frame_no, info, false);
    122   EXPECT_STREQ("in my_function my_file", str.data());
    123   str.clear();
    124 
    125   info.line = 10;
    126   RenderFrame(&str, "%F %S", frame_no, info, false);
    127   EXPECT_STREQ("in my_function my_file:10", str.data());
    128   str.clear();
    129 
    130   info.column = 5;
    131   RenderFrame(&str, "%S %L", frame_no, info, false);
    132   EXPECT_STREQ("my_file:10:5 my_file:10:5", str.data());
    133   str.clear();
    134 
    135   RenderFrame(&str, "%S %L", frame_no, info, true);
    136   EXPECT_STREQ("my_file(10,5) my_file(10,5)", str.data());
    137   str.clear();
    138 
    139   info.column = 0;
    140   RenderFrame(&str, "%F %S", frame_no, info, true);
    141   EXPECT_STREQ("in my_function my_file(10)", str.data());
    142   str.clear();
    143 
    144   info.line = 0;
    145   RenderFrame(&str, "%F %S", frame_no, info, true);
    146   EXPECT_STREQ("in my_function my_file", str.data());
    147   str.clear();
    148 
    149   info.Clear();
    150 }
    151 
    152 }  // namespace __sanitizer
    153