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/pdb/pdb_file.h"
16 :
17 : #include "base/memory/scoped_ptr.h"
18 : #include "gmock/gmock.h"
19 : #include "gtest/gtest.h"
20 :
21 : namespace pdb {
22 :
23 : namespace {
24 :
25 : class DummyPdbStream : public PdbStream {
26 : public:
27 E : DummyPdbStream() : PdbStream(10) {
28 E : ++instance_count_;
29 E : }
30 :
31 i : virtual bool ReadBytes(void* dest, size_t count, size_t* bytes_read) {
32 i : return false;
33 i : }
34 :
35 E : static size_t instance_count() { return instance_count_; }
36 :
37 : protected:
38 E : virtual ~DummyPdbStream() {
39 E : --instance_count_;
40 E : }
41 :
42 : static size_t instance_count_;
43 : };
44 :
45 : size_t DummyPdbStream::instance_count_;
46 :
47 : } // namespace
48 :
49 E : TEST(PdbFileTest, Clear) {
50 E : PdbFile pdb_file;
51 E : EXPECT_EQ(0u, pdb_file.StreamCount());
52 E : EXPECT_EQ(0u, DummyPdbStream::instance_count());
53 :
54 E : pdb_file.AppendStream(new DummyPdbStream());
55 E : EXPECT_EQ(1u, pdb_file.StreamCount());
56 E : EXPECT_EQ(1u, DummyPdbStream::instance_count());
57 :
58 E : pdb_file.AppendStream(new DummyPdbStream());
59 E : EXPECT_EQ(2u, pdb_file.StreamCount());
60 E : EXPECT_EQ(2u, DummyPdbStream::instance_count());
61 :
62 E : pdb_file.SetStream(100, new DummyPdbStream());
63 E : EXPECT_EQ(101u, pdb_file.StreamCount());
64 E : EXPECT_TRUE(pdb_file.GetStream(99) == NULL);
65 E : EXPECT_EQ(3u, DummyPdbStream::instance_count());
66 :
67 E : pdb_file.Clear();
68 E : EXPECT_EQ(0u, pdb_file.StreamCount());
69 E : EXPECT_EQ(0u, DummyPdbStream::instance_count());
70 E : }
71 :
72 E : TEST(PdbFileTest, WorksAsExpected) {
73 E : scoped_ptr<PdbFile> pdb(new PdbFile());
74 E : EXPECT_EQ(0u, pdb->StreamCount());
75 E : EXPECT_EQ(0u, DummyPdbStream::instance_count());
76 :
77 E : scoped_refptr<PdbStream> stream(new DummyPdbStream());
78 E : EXPECT_EQ(1u, DummyPdbStream::instance_count());
79 E : size_t index0 = pdb->AppendStream(stream.get());
80 E : EXPECT_EQ(0u, index0);
81 E : EXPECT_EQ(1u, pdb->StreamCount());
82 E : EXPECT_EQ(stream.get(), pdb->GetStream(index0));
83 :
84 E : stream = new DummyPdbStream();
85 E : EXPECT_EQ(2u, DummyPdbStream::instance_count());
86 E : size_t index1 = pdb->AppendStream(stream.get());
87 E : EXPECT_EQ(1u, index1);
88 E : EXPECT_EQ(2u, pdb->StreamCount());
89 E : EXPECT_EQ(stream.get(), pdb->GetStream(index1));
90 E : PdbStream* stream1 = stream.get();
91 :
92 E : stream = new DummyPdbStream();
93 E : EXPECT_EQ(3u, DummyPdbStream::instance_count());
94 E : pdb->ReplaceStream(index0, stream.get());
95 E : EXPECT_EQ(2u, DummyPdbStream::instance_count());
96 E : EXPECT_EQ(2u, pdb->StreamCount());
97 E : EXPECT_EQ(stream.get(), pdb->GetStream(index0));
98 E : PdbStream* stream0 = stream.get();
99 E : stream = NULL;
100 :
101 E : EXPECT_EQ(stream0, pdb->GetStream(0));
102 E : EXPECT_EQ(stream1, pdb->GetStream(1));
103 :
104 E : pdb.reset(NULL);
105 E : EXPECT_EQ(0u, DummyPdbStream::instance_count());
106 E : }
107 :
108 : } // namespace pdb
|