33 virtual void SetUp() {
37 virtual void TearDown() {
42 TEST_F(DepsLogTest, WriteRead) {
51 deps.push_back(state1.
GetNode(
"foo.h", 0));
52 deps.push_back(state1.
GetNode(
"bar.h", 0));
56 deps.push_back(state1.
GetNode(
"foo.h", 0));
57 deps.push_back(state1.
GetNode(
"bar2.h", 0));
76 for (
int i = 0; i < (int)log1.
nodes().size(); ++i) {
92 TEST_F(DepsLogTest, LotsOfDeps) {
93 const int kNumDeps = 100000;
103 for (
int i = 0; i < kNumDeps; ++i) {
105 sprintf(buf,
"file%d.h", i);
106 deps.push_back(state1.
GetNode(buf, 0));
126 TEST_F(DepsLogTest, DoubleEntry) {
137 deps.push_back(state.
GetNode(
"foo.h", 0));
138 deps.push_back(state.
GetNode(
"bar.h", 0));
144 file_size = (int)st.st_size;
159 deps.push_back(state.
GetNode(
"foo.h", 0));
160 deps.push_back(state.
GetNode(
"bar.h", 0));
166 int file_size_2 = (int)st.st_size;
172 TEST_F(DepsLogTest, Recompact) {
173 const char kManifest[] =
178 "build other_out.o: cc\n";
191 deps.push_back(state.
GetNode(
"foo.h", 0));
192 deps.push_back(state.
GetNode(
"bar.h", 0));
196 deps.push_back(state.
GetNode(
"foo.h", 0));
197 deps.push_back(state.
GetNode(
"baz.h", 0));
204 file_size = (int)st.st_size;
221 deps.push_back(state.
GetNode(
"foo.h", 0));
227 file_size_2 = (int)st.st_size;
264 ASSERT_EQ(
"foo.h", deps->nodes[0]->path());
271 ASSERT_EQ(
"foo.h", deps->nodes[0]->path());
272 ASSERT_EQ(
"baz.h", deps->nodes[1]->path());
278 file_size_3 = (int)st.st_size;
322 int file_size_4 = (int)st.st_size;
328 TEST_F(DepsLogTest, InvalidHeader) {
329 const char *kInvalidHeaders[] = {
333 "# ninjadeps\n\001\002",
334 "# ninjadeps\n\001\002\003\004" 336 for (
size_t i = 0; i <
sizeof(kInvalidHeaders) /
sizeof(kInvalidHeaders[0]);
341 strlen(kInvalidHeaders[i]),
342 fwrite(kInvalidHeaders[i], 1, strlen(kInvalidHeaders[i]), deps_log));
349 EXPECT_EQ(
"bad deps log signature or version; starting over", err);
354 TEST_F(DepsLogTest, Truncated) {
364 deps.push_back(state.
GetNode(
"foo.h", 0));
365 deps.push_back(state.
GetNode(
"bar.h", 0));
369 deps.push_back(state.
GetNode(
"foo.h", 0));
370 deps.push_back(state.
GetNode(
"bar2.h", 0));
385 for (
int size = (
int)st.st_size; size > 0; --size) {
398 node_count = log.
nodes().size();
401 int new_deps_count = 0;
402 for (vector<DepsLog::Deps*>::const_iterator i = log.
deps().begin();
403 i != log.
deps().end(); ++i) {
408 deps_count = new_deps_count;
413 TEST_F(DepsLogTest, TruncatedRecovery) {
423 deps.push_back(state.
GetNode(
"foo.h", 0));
424 deps.push_back(state.
GetNode(
"bar.h", 0));
428 deps.push_back(state.
GetNode(
"foo.h", 0));
429 deps.push_back(state.
GetNode(
"bar2.h", 0));
449 ASSERT_EQ(
"premature end of file; recovering", err);
460 deps.push_back(state.
GetNode(
"foo.h", 0));
461 deps.push_back(state.
GetNode(
"bar2.h", 0));
void AssertParse(State *state, const char *input, ManifestParserOptions opts)
const std::vector< Node * > & nodes() const
Used for tests.
Node * GetNode(StringPiece path, uint64_t slash_bits)
Information about a node in the dependency graph: the file, whether it's dirty, mtime, etc.
Node * LookupNode(StringPiece path) const
LoadStatus Load(const std::string &path, State *state, std::string *err)
const std::string & path() const
bool Recompact(const std::string &path, std::string *err)
Rewrite the known log entries, throwing away old data.
As build commands run they can output extra dependency information (e.g.
bool RecordDeps(Node *node, TimeStamp mtime, const std::vector< Node *> &nodes)
Deps * GetDeps(Node *node)
const char kTestFilename[]
bool OpenForWrite(const std::string &path, std::string *err)
bool Truncate(const string &path, size_t size, string *err)
#define ASSERT_NO_FATAL_FAILURE(a)
Global state (file status) for a single run.
const std::vector< Deps * > & deps() const