toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols_unittest.cc

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 // Copyright (c) 2011 Google Inc.
     2 // All rights reserved.
     3 //
     4 // Redistribution and use in source and binary forms, with or without
     5 // modification, are permitted provided that the following conditions are
     6 // met:
     7 //
     8 //     * Redistributions of source code must retain the above copyright
     9 // notice, this list of conditions and the following disclaimer.
    10 //     * Redistributions in binary form must reproduce the above
    11 // copyright notice, this list of conditions and the following disclaimer
    12 // in the documentation and/or other materials provided with the
    13 // distribution.
    14 //     * Neither the name of Google Inc. nor the names of its
    15 // contributors may be used to endorse or promote products derived from
    16 // this software without specific prior written permission.
    17 //
    18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    30 // Original author: Ted Mielczarek <ted.mielczarek@gmail.com>
    32 // dump_symbols_unittest.cc:
    33 // Unittests for google_breakpad::DumpSymbols
    35 #include <elf.h>
    36 #include <link.h>
    37 #include <stdio.h>
    39 #include <sstream>
    40 #include <vector>
    42 #include "breakpad_googletest_includes.h"
    43 #include "common/linux/synth_elf.h"
    44 #include "common/module.h"
    45 #include "common/using_std_string.h"
    47 namespace google_breakpad {
    48 bool ReadSymbolDataInternal(const uint8_t* obj_file,
    49                             const string& obj_filename,
    50                             const std::vector<string>& debug_dir,
    51                             SymbolData symbol_data,
    52                             Module** module);
    53 }
    55 using google_breakpad::synth_elf::ELF;
    56 using google_breakpad::synth_elf::StringTable;
    57 using google_breakpad::synth_elf::SymbolTable;
    58 using google_breakpad::test_assembler::kLittleEndian;
    59 using google_breakpad::test_assembler::Section;
    60 using google_breakpad::Module;
    61 using google_breakpad::ReadSymbolDataInternal;
    62 using std::stringstream;
    63 using std::vector;
    64 using ::testing::Test;
    66 class DumpSymbols : public Test {
    67  public:
    68   void GetElfContents(ELF& elf) {
    69     string contents;
    70     ASSERT_TRUE(elf.GetContents(&contents));
    71     ASSERT_LT(0U, contents.size());
    73     elfdata_v.clear();
    74     elfdata_v.insert(elfdata_v.begin(), contents.begin(), contents.end());
    75     elfdata = &elfdata_v[0];
    76   }
    78   vector<uint8_t> elfdata_v;
    79   uint8_t* elfdata;
    80 };
    82 TEST_F(DumpSymbols, Invalid) {
    83   Elf32_Ehdr header;
    84   memset(&header, 0, sizeof(header));
    85   Module* module;
    86   EXPECT_FALSE(ReadSymbolDataInternal(reinterpret_cast<uint8_t*>(&header),
    87                                       "foo",
    88                                       vector<string>(),
    89                                       ALL_SYMBOL_DATA,
    90                                       &module));
    91 }
    93 TEST_F(DumpSymbols, SimplePublic32) {
    94   ELF elf(EM_386, ELFCLASS32, kLittleEndian);
    95   // Zero out text section for simplicity.
    96   Section text(kLittleEndian);
    97   text.Append(4096, 0);
    98   elf.AddSection(".text", text, SHT_PROGBITS);
   100   // Add a public symbol.
   101   StringTable table(kLittleEndian);
   102   SymbolTable syms(kLittleEndian, 4, table);
   103   syms.AddSymbol("superfunc", (uint32_t)0x1000, (uint32_t)0x10,
   104                  ELF32_ST_INFO(STB_GLOBAL, STT_FUNC),
   105                  SHN_UNDEF + 1);
   106   int index = elf.AddSection(".dynstr", table, SHT_STRTAB);
   107   elf.AddSection(".dynsym", syms,
   108                  SHT_DYNSYM,          // type
   109                  SHF_ALLOC,           // flags
   110                  0,                   // addr
   111                  index,               // link
   112                  sizeof(Elf32_Sym));  // entsize
   114   elf.Finish();
   115   GetElfContents(elf);
   117   Module* module;
   118   EXPECT_TRUE(ReadSymbolDataInternal(elfdata,
   119                                      "foo",
   120                                      vector<string>(),
   121                                      ALL_SYMBOL_DATA,
   122                                      &module));
   124   stringstream s;
   125   module->Write(s, ALL_SYMBOL_DATA);
   126   EXPECT_EQ("MODULE Linux x86 000000000000000000000000000000000 foo\n"
   127             "PUBLIC 1000 0 superfunc\n",
   128             s.str());
   129   delete module;
   130 }
   132 TEST_F(DumpSymbols, SimplePublic64) {
   133   ELF elf(EM_X86_64, ELFCLASS64, kLittleEndian);
   134   // Zero out text section for simplicity.
   135   Section text(kLittleEndian);
   136   text.Append(4096, 0);
   137   elf.AddSection(".text", text, SHT_PROGBITS);
   139   // Add a public symbol.
   140   StringTable table(kLittleEndian);
   141   SymbolTable syms(kLittleEndian, 8, table);
   142   syms.AddSymbol("superfunc", (uint64_t)0x1000, (uint64_t)0x10,
   143                  ELF64_ST_INFO(STB_GLOBAL, STT_FUNC),
   144                  SHN_UNDEF + 1);
   145   int index = elf.AddSection(".dynstr", table, SHT_STRTAB);
   146   elf.AddSection(".dynsym", syms,
   147                  SHT_DYNSYM,          // type
   148                  SHF_ALLOC,           // flags
   149                  0,                   // addr
   150                  index,               // link
   151                  sizeof(Elf64_Sym));  // entsize
   153   elf.Finish();
   154   GetElfContents(elf);
   156   Module* module;
   157   EXPECT_TRUE(ReadSymbolDataInternal(elfdata,
   158                                      "foo",
   159                                      vector<string>(),
   160                                      ALL_SYMBOL_DATA,
   161                                      &module));
   163   stringstream s;
   164   module->Write(s, ALL_SYMBOL_DATA);
   165   EXPECT_EQ("MODULE Linux x86_64 000000000000000000000000000000000 foo\n"
   166             "PUBLIC 1000 0 superfunc\n",
   167             s.str());
   168 }

mercurial