25 struct DepsLogTest :
public testing::Test {
26 virtual void SetUp() {
30 virtual void TearDown() {
35 TEST_F(DepsLogTest, WriteRead) {
44 deps.push_back(state1.
GetNode(
"foo.h"));
45 deps.push_back(state1.
GetNode(
"bar.h"));
49 deps.push_back(state1.
GetNode(
"foo.h"));
50 deps.push_back(state1.
GetNode(
"bar2.h"));
54 ASSERT_TRUE(log_deps);
55 ASSERT_EQ(1, log_deps->
mtime);
57 ASSERT_EQ(
"foo.h", log_deps->
nodes[0]->
path());
58 ASSERT_EQ(
"bar.h", log_deps->
nodes[1]->
path());
68 ASSERT_EQ(log1.
nodes().size(), log2.
nodes().size());
69 for (
int i = 0; i < (int)log1.
nodes().size(); ++i) {
72 ASSERT_EQ(i, node1->
id());
73 ASSERT_EQ(node1->
id(), node2->
id());
78 ASSERT_TRUE(log_deps);
79 ASSERT_EQ(2, log_deps->
mtime);
81 ASSERT_EQ(
"foo.h", log_deps->
nodes[0]->
path());
82 ASSERT_EQ(
"bar2.h", log_deps->
nodes[1]->
path());
86 TEST_F(DepsLogTest, DoubleEntry) {
97 deps.push_back(state.
GetNode(
"foo.h"));
98 deps.push_back(state.
GetNode(
"bar.h"));
104 file_size = (int)st.st_size;
105 ASSERT_GT(file_size, 0);
119 deps.push_back(state.
GetNode(
"foo.h"));
120 deps.push_back(state.
GetNode(
"bar.h"));
126 int file_size_2 = (int)st.st_size;
127 ASSERT_EQ(file_size, file_size_2);
132 TEST_F(DepsLogTest, Recompact) {
143 deps.push_back(state.
GetNode(
"foo.h"));
144 deps.push_back(state.
GetNode(
"bar.h"));
148 deps.push_back(state.
GetNode(
"foo.h"));
149 deps.push_back(state.
GetNode(
"baz.h"));
156 file_size = (int)st.st_size;
157 ASSERT_GT(file_size, 0);
172 deps.push_back(state.
GetNode(
"foo.h"));
178 file_size_2 = (int)st.st_size;
180 ASSERT_GT(file_size_2, file_size);
194 ASSERT_EQ(1, deps->
mtime);
196 ASSERT_EQ(
"foo.h", deps->
nodes[0]->
path());
201 ASSERT_EQ(1, deps->
mtime);
203 ASSERT_EQ(
"foo.h", deps->
nodes[0]->
path());
204 ASSERT_EQ(
"baz.h", deps->
nodes[1]->
path());
211 ASSERT_EQ(1, deps->mtime);
212 ASSERT_EQ(1, deps->node_count);
213 ASSERT_EQ(
"foo.h", deps->nodes[0]->path());
214 ASSERT_EQ(out, log.
nodes()[out->id()]);
218 ASSERT_EQ(1, deps->mtime);
219 ASSERT_EQ(2, deps->node_count);
220 ASSERT_EQ(
"foo.h", deps->nodes[0]->path());
221 ASSERT_EQ(
"baz.h", deps->nodes[1]->path());
222 ASSERT_EQ(other_out, log.
nodes()[other_out->id()]);
227 int file_size_3 = (int)st.st_size;
228 ASSERT_LT(file_size_3, file_size_2);
233 TEST_F(DepsLogTest, InvalidHeader) {
234 const char *kInvalidHeaders[] = {
238 "# ninjadeps\n\001\002",
239 "# ninjadeps\n\001\002\003\004"
241 for (
size_t i = 0; i <
sizeof(kInvalidHeaders) /
sizeof(kInvalidHeaders[0]);
244 ASSERT_TRUE(deps_log != NULL);
246 strlen(kInvalidHeaders[i]),
247 fwrite(kInvalidHeaders[i], 1, strlen(kInvalidHeaders[i]), deps_log));
248 ASSERT_EQ(0 ,fclose(deps_log));
254 EXPECT_EQ(
"bad deps log signature or version; starting over", err);
259 TEST_F(DepsLogTest, Truncated) {
269 deps.push_back(state.
GetNode(
"foo.h"));
270 deps.push_back(state.
GetNode(
"bar.h"));
274 deps.push_back(state.
GetNode(
"foo.h"));
275 deps.push_back(state.
GetNode(
"bar2.h"));
290 for (
int size = (
int)st.st_size; size > 0; --size) {
302 ASSERT_GE(node_count, (
int)log.
nodes().size());
303 node_count = log.
nodes().size();
306 int new_deps_count = 0;
307 for (vector<DepsLog::Deps*>::const_iterator i = log.
deps().begin();
308 i != log.
deps().end(); ++i) {
312 ASSERT_GE(deps_count, new_deps_count);
313 deps_count = new_deps_count;
318 TEST_F(DepsLogTest, TruncatedRecovery) {
328 deps.push_back(state.
GetNode(
"foo.h"));
329 deps.push_back(state.
GetNode(
"bar.h"));
333 deps.push_back(state.
GetNode(
"foo.h"));
334 deps.push_back(state.
GetNode(
"bar2.h"));
352 ASSERT_EQ(
"premature end of file; recovering", err);
363 deps.push_back(state.
GetNode(
"foo.h"));
364 deps.push_back(state.
GetNode(
"bar2.h"));
Node * GetNode(StringPiece path)
Information about a node in the dependency graph: the file, whether it's dirty, mtime, etc.
As build commands run they can output extra dependency information (e.g.
bool OpenForWrite(const string &path, string *err)
Deps * GetDeps(Node *node)
const char kTestFilename[]
bool Load(const string &path, State *state, string *err)
bool Recompact(const string &path, string *err)
Rewrite the known log entries, throwing away old data.
const string & path() const
bool Truncate(const string &path, size_t size, string *err)
Truncates a file to the given size.
const vector< Deps * > & deps() const
Global state (file status, loaded rules) for a single run.
const vector< Node * > & nodes() const
Used for tests.
bool RecordDeps(Node *node, TimeStamp mtime, const vector< Node * > &nodes)