24 #include <sys/types.h>
34 virtual void SetUp() {
36 unlink(kTestFilename);
38 virtual void TearDown() {
39 unlink(kTestFilename);
43 TEST_F(BuildLogTest, WriteRead) {
45 "build out: cat mid\n"
46 "build mid: cat in\n");
57 EXPECT_TRUE(log2.
Load(kTestFilename, &err));
60 ASSERT_EQ(2u, log1.
entries().size());
61 ASSERT_EQ(2u, log2.
entries().size());
66 ASSERT_TRUE(*e1 == *e2);
67 ASSERT_EQ(15, e1->start_time);
68 ASSERT_EQ(
"out", e1->output);
71 TEST_F(BuildLogTest, FirstWriteAddsSignature) {
72 const char kExpectedVersion[] =
"# ninja log vX\n";
73 const size_t kVersionPos = strlen(kExpectedVersion) - 2;
82 ASSERT_EQ(0,
ReadFile(kTestFilename, &contents, &err));
84 if (contents.size() >= kVersionPos)
85 contents[kVersionPos] =
'X';
86 EXPECT_EQ(kExpectedVersion, contents);
94 ASSERT_EQ(0,
ReadFile(kTestFilename, &contents, &err));
96 if (contents.size() >= kVersionPos)
97 contents[kVersionPos] =
'X';
98 EXPECT_EQ(kExpectedVersion, contents);
101 TEST_F(BuildLogTest, DoubleEntry) {
102 FILE* f = fopen(kTestFilename,
"wb");
103 fprintf(f,
"# ninja log v4\n");
104 fprintf(f,
"0\t1\t2\tout\tcommand abc\n");
105 fprintf(f,
"3\t4\t5\tout\tcommand def\n");
110 EXPECT_TRUE(log.
Load(kTestFilename, &err));
120 "build out: cat mid\n"
121 "build mid: cat in\n");
132 ASSERT_EQ(0, stat(kTestFilename, &statbuf));
133 ASSERT_GT(statbuf.st_size, 0);
137 for (off_t size = statbuf.st_size; size > 0; --size) {
146 ASSERT_TRUE(
Truncate(kTestFilename, size, &err));
150 ASSERT_TRUE(log3.
Load(kTestFilename, &err) || !err.empty());
154 TEST_F(BuildLogTest, ObsoleteOldVersion) {
155 FILE* f = fopen(kTestFilename,
"wb");
156 fprintf(f,
"# ninja log v3\n");
157 fprintf(f,
"123 456 0 out command\n");
162 EXPECT_TRUE(log.
Load(kTestFilename, &err));
163 ASSERT_NE(err.find(
"version"), string::npos);
166 TEST_F(BuildLogTest, SpacesInOutputV4) {
167 FILE* f = fopen(kTestFilename,
"wb");
168 fprintf(f,
"# ninja log v4\n");
169 fprintf(f,
"123\t456\t456\tout with space\tcommand\n");
174 EXPECT_TRUE(log.
Load(kTestFilename, &err));
185 TEST_F(BuildLogTest, DuplicateVersionHeader) {
189 FILE* f = fopen(kTestFilename,
"wb");
190 fprintf(f,
"# ninja log v4\n");
191 fprintf(f,
"123\t456\t456\tout\tcommand\n");
192 fprintf(f,
"# ninja log v4\n");
193 fprintf(f,
"456\t789\t789\tout2\tcommand2\n");
198 EXPECT_TRUE(log.
Load(kTestFilename, &err));
216 TEST_F(BuildLogTest, VeryLongInputLine) {
219 FILE* f = fopen(kTestFilename,
"wb");
220 fprintf(f,
"# ninja log v4\n");
221 fprintf(f,
"123\t456\t456\tout\tcommand start");
222 for (
size_t i = 0; i < (512 << 10) / strlen(
" more_command"); ++i)
223 fputs(
" more_command", f);
225 fprintf(f,
"456\t789\t789\tout2\tcommand2\n");
230 EXPECT_TRUE(log.
Load(kTestFilename, &err));
244 TEST_F(BuildLogTest, MultiTargetEdge) {
246 "build out out.d: cat\n");
251 ASSERT_EQ(2u, log.
entries().size());
256 ASSERT_EQ(
"out", e1->output);
257 ASSERT_EQ(
"out.d", e2->
output);
258 ASSERT_EQ(21, e1->start_time);
bool OpenForWrite(const string &path, string *err)
const Entries & entries() const
void AssertParse(State *state, const char *input)
Store a log of every command ran for every build.
A base test fixture that includes a State object with a builtin "cat" rule.
void RecordCommand(Edge *edge, int start_time, int end_time, TimeStamp restat_mtime=0)
const char kTestFilename[]
int ReadFile(const string &path, string *contents, string *err)
Read a file to a string (in text mode: with CRLF conversion on Windows).
bool Truncate(const string &path, size_t size, string *err)
Truncates a file to the given size.
LogEntry * LookupByOutput(const string &path)
Lookup a previously-run command by its output path.
bool Load(const string &path, string *err)
Load the on-disk log.
void AssertHash(const char *expected, uint64_t actual)