Coverage for /Syzygy/instrument/mutators/add_indexed_data_ranges_stream_unittest.cc

CoverageLines executed / instrumented / missingexe / inst / missLanguageGroup
100.0%47470.C++test

Line-by-line coverage:

   1    :  // Copyright 2012 Google Inc. All Rights Reserved.
   2    :  //
   3    :  // Licensed under the Apache License, Version 2.0 (the "License");
   4    :  // you may not use this file except in compliance with the License.
   5    :  // You may obtain a copy of the License at
   6    :  //
   7    :  //     http://www.apache.org/licenses/LICENSE-2.0
   8    :  //
   9    :  // Unless required by applicable law or agreed to in writing, software
  10    :  // distributed under the License is distributed on an "AS IS" BASIS,
  11    :  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12    :  // See the License for the specific language governing permissions and
  13    :  // limitations under the License.
  14    :  
  15    :  #include "syzygy/instrument/mutators/add_indexed_data_ranges_stream.h"
  16    :  
  17    :  #include "gmock/gmock.h"
  18    :  #include "gtest/gtest.h"
  19    :  #include "syzygy/common/indexed_frequency_data.h"
  20    :  #include "syzygy/pdb/pdb_byte_stream.h"
  21    :  #include "syzygy/pdb/unittest_util.h"
  22    :  
  23    :  namespace instrument {
  24    :  namespace mutators {
  25    :  
  26    :  namespace {
  27    :  
  28    :  typedef AddIndexedDataRangesStreamPdbMutator::RelativeAddressRange
  29    :      RelativeAddressRange;
  30    :  typedef AddIndexedDataRangesStreamPdbMutator::RelativeAddressRangeVector
  31    :      RelativeAddressRangeVector;
  32    :  
  33    :  using core::RelativeAddress;
  34    :  
  35    :  const char stream_name[] = "IndexedDataStream";
  36    :  
  37    :  }  // namespace
  38    :  
  39  E :  TEST(AddIndexedDataRangesStreamPdbMutatorTest, FailsIfStreamAlreadyExists) {
  40  E :    RelativeAddressRangeVector indexed_data;
  41  E :    AddIndexedDataRangesStreamPdbMutator mutator(indexed_data, stream_name);
  42    :  
  43  E :    indexed_data.push_back(RelativeAddressRange(RelativeAddress(0x11111111), 4));
  44  E :    indexed_data.push_back(RelativeAddressRange(RelativeAddress(0x22222222), 4));
  45    :  
  46  E :    pdb::PdbFile pdb_file;
  47  E :    ASSERT_NO_FATAL_FAILURE(testing::InitMockPdbFile(&pdb_file));
  48    :  
  49    :    // Add a dummy stream with the same name as the one we want to add.
  50  E :    pdb::PdbInfoHeader70 pdb_header = {};
  51  E :    pdb::NameStreamMap name_stream_map;
  52    :    EXPECT_TRUE(pdb::ReadHeaderInfoStream(pdb_file, &pdb_header,
  53  E :                                          &name_stream_map));
  54  E :    scoped_refptr<pdb::PdbStream> stream(new pdb::PdbByteStream);
  55  E :    size_t stream_id = pdb_file.AppendStream(stream.get());
  56  E :    name_stream_map[stream_name] = stream_id;
  57    :    EXPECT_TRUE(pdb::WriteHeaderInfoStream(pdb_header, name_stream_map,
  58  E :                                           &pdb_file));
  59    :  
  60  E :    EXPECT_FALSE(mutator.MutatePdb(&pdb_file));
  61  E :  }
  62    :  
  63  E :  TEST(AddIndexedDataRangesStreamPdbMutatorTest, DoesNotAddEmptyStream) {
  64  E :    RelativeAddressRangeVector indexed_data;
  65  E :    AddIndexedDataRangesStreamPdbMutator mutator(indexed_data, stream_name);
  66    :  
  67  E :    pdb::PdbFile pdb_file;
  68  E :    ASSERT_NO_FATAL_FAILURE(testing::InitMockPdbFile(&pdb_file));
  69    :  
  70  E :    EXPECT_TRUE(mutator.MutatePdb(&pdb_file));
  71    :  
  72  E :    pdb::PdbInfoHeader70 pdb_header = {};
  73  E :    pdb::NameStreamMap name_stream_map;
  74    :    EXPECT_TRUE(pdb::ReadHeaderInfoStream(pdb_file, &pdb_header,
  75  E :                                          &name_stream_map));
  76    :  
  77    :    // We expect no named stream to have been added.
  78  E :    EXPECT_EQ(0u, name_stream_map.count(stream_name));
  79  E :  }
  80    :  
  81  E :  TEST(AddIndexedDataRangesStreamPdbMutatorTest, AddsStream) {
  82  E :    RelativeAddressRangeVector indexed_data;
  83  E :    AddIndexedDataRangesStreamPdbMutator mutator(indexed_data, stream_name);
  84    :  
  85  E :    indexed_data.push_back(RelativeAddressRange(RelativeAddress(0x11111111), 4));
  86  E :    indexed_data.push_back(RelativeAddressRange(RelativeAddress(0x22222222), 4));
  87    :  
  88  E :    pdb::PdbFile pdb_file;
  89  E :    ASSERT_NO_FATAL_FAILURE(testing::InitMockPdbFile(&pdb_file));
  90    :  
  91  E :    EXPECT_TRUE(mutator.MutatePdb(&pdb_file));
  92    :  
  93  E :    pdb::PdbInfoHeader70 pdb_header = {};
  94  E :    pdb::NameStreamMap name_stream_map;
  95    :    EXPECT_TRUE(pdb::ReadHeaderInfoStream(pdb_file, &pdb_header,
  96  E :                                          &name_stream_map));
  97    :  
  98    :    // We expect the named stream to have been added.
  99  E :    EXPECT_EQ(1u, name_stream_map.count(stream_name));
 100    :  
 101    :    // Get the stream.
 102  E :    size_t stream_id = name_stream_map[stream_name];
 103  E :    scoped_refptr<pdb::PdbStream> stream = pdb_file.GetStream(stream_id);
 104  E :    EXPECT_TRUE(stream.get() != NULL);
 105    :  
 106    :    // Validate the stream contents.
 107  E :    RelativeAddressRangeVector bb_addresses2;
 108  E :    EXPECT_TRUE(stream->Seek(0));
 109  E :    EXPECT_TRUE(stream->Read(&bb_addresses2));
 110  E :    EXPECT_THAT(indexed_data, testing::ContainerEq(bb_addresses2));
 111  E :  }
 112    :  
 113    :  }  // namespace mutators
 114    :  }  // namespace instrument

Coverage information generated Thu Jan 14 17:40:38 2016.