Merge pull request #352 from tfarina/string-piece-private
[platform/upstream/ninja.git] / src / build_test.cc
1 // Copyright 2011 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 "build.h"
16
17 #include "build_log.h"
18 #include "graph.h"
19 #include "test.h"
20
21 /// Fixture for tests involving Plan.
22 // Though Plan doesn't use State, it's useful to have one around
23 // to create Nodes and Edges.
24 struct PlanTest : public StateTestWithBuiltinRules {
25   Plan plan_;
26 };
27
28 TEST_F(PlanTest, Basic) {
29   AssertParse(&state_,
30 "build out: cat mid\n"
31 "build mid: cat in\n");
32   GetNode("mid")->MarkDirty();
33   GetNode("out")->MarkDirty();
34   string err;
35   EXPECT_TRUE(plan_.AddTarget(GetNode("out"), &err));
36   ASSERT_EQ("", err);
37   ASSERT_TRUE(plan_.more_to_do());
38
39   Edge* edge = plan_.FindWork();
40   ASSERT_TRUE(edge);
41   ASSERT_EQ("in",  edge->inputs_[0]->path());
42   ASSERT_EQ("mid", edge->outputs_[0]->path());
43
44   ASSERT_FALSE(plan_.FindWork());
45
46   plan_.EdgeFinished(edge);
47
48   edge = plan_.FindWork();
49   ASSERT_TRUE(edge);
50   ASSERT_EQ("mid", edge->inputs_[0]->path());
51   ASSERT_EQ("out", edge->outputs_[0]->path());
52
53   plan_.EdgeFinished(edge);
54
55   ASSERT_FALSE(plan_.more_to_do());
56   edge = plan_.FindWork();
57   ASSERT_EQ(0, edge);
58 }
59
60 // Test that two outputs from one rule can be handled as inputs to the next.
61 TEST_F(PlanTest, DoubleOutputDirect) {
62   AssertParse(&state_,
63 "build out: cat mid1 mid2\n"
64 "build mid1 mid2: cat in\n");
65   GetNode("mid1")->MarkDirty();
66   GetNode("mid2")->MarkDirty();
67   GetNode("out")->MarkDirty();
68
69   string err;
70   EXPECT_TRUE(plan_.AddTarget(GetNode("out"), &err));
71   ASSERT_EQ("", err);
72   ASSERT_TRUE(plan_.more_to_do());
73
74   Edge* edge;
75   edge = plan_.FindWork();
76   ASSERT_TRUE(edge);  // cat in
77   plan_.EdgeFinished(edge);
78
79   edge = plan_.FindWork();
80   ASSERT_TRUE(edge);  // cat mid1 mid2
81   plan_.EdgeFinished(edge);
82
83   edge = plan_.FindWork();
84   ASSERT_FALSE(edge);  // done
85 }
86
87 // Test that two outputs from one rule can eventually be routed to another.
88 TEST_F(PlanTest, DoubleOutputIndirect) {
89   AssertParse(&state_,
90 "build out: cat b1 b2\n"
91 "build b1: cat a1\n"
92 "build b2: cat a2\n"
93 "build a1 a2: cat in\n");
94   GetNode("a1")->MarkDirty();
95   GetNode("a2")->MarkDirty();
96   GetNode("b1")->MarkDirty();
97   GetNode("b2")->MarkDirty();
98   GetNode("out")->MarkDirty();
99   string err;
100   EXPECT_TRUE(plan_.AddTarget(GetNode("out"), &err));
101   ASSERT_EQ("", err);
102   ASSERT_TRUE(plan_.more_to_do());
103
104   Edge* edge;
105   edge = plan_.FindWork();
106   ASSERT_TRUE(edge);  // cat in
107   plan_.EdgeFinished(edge);
108
109   edge = plan_.FindWork();
110   ASSERT_TRUE(edge);  // cat a1
111   plan_.EdgeFinished(edge);
112
113   edge = plan_.FindWork();
114   ASSERT_TRUE(edge);  // cat a2
115   plan_.EdgeFinished(edge);
116
117   edge = plan_.FindWork();
118   ASSERT_TRUE(edge);  // cat b1 b2
119   plan_.EdgeFinished(edge);
120
121   edge = plan_.FindWork();
122   ASSERT_FALSE(edge);  // done
123 }
124
125 // Test that two edges from one output can both execute.
126 TEST_F(PlanTest, DoubleDependent) {
127   AssertParse(&state_,
128 "build out: cat a1 a2\n"
129 "build a1: cat mid\n"
130 "build a2: cat mid\n"
131 "build mid: cat in\n");
132   GetNode("mid")->MarkDirty();
133   GetNode("a1")->MarkDirty();
134   GetNode("a2")->MarkDirty();
135   GetNode("out")->MarkDirty();
136
137   string err;
138   EXPECT_TRUE(plan_.AddTarget(GetNode("out"), &err));
139   ASSERT_EQ("", err);
140   ASSERT_TRUE(plan_.more_to_do());
141
142   Edge* edge;
143   edge = plan_.FindWork();
144   ASSERT_TRUE(edge);  // cat in
145   plan_.EdgeFinished(edge);
146
147   edge = plan_.FindWork();
148   ASSERT_TRUE(edge);  // cat mid
149   plan_.EdgeFinished(edge);
150
151   edge = plan_.FindWork();
152   ASSERT_TRUE(edge);  // cat mid
153   plan_.EdgeFinished(edge);
154
155   edge = plan_.FindWork();
156   ASSERT_TRUE(edge);  // cat a1 a2
157   plan_.EdgeFinished(edge);
158
159   edge = plan_.FindWork();
160   ASSERT_FALSE(edge);  // done
161 }
162
163 TEST_F(PlanTest, DependencyCycle) {
164   AssertParse(&state_,
165 "build out: cat mid\n"
166 "build mid: cat in\n"
167 "build in: cat pre\n"
168 "build pre: cat out\n");
169   GetNode("out")->MarkDirty();
170   GetNode("mid")->MarkDirty();
171   GetNode("in")->MarkDirty();
172   GetNode("pre")->MarkDirty();
173
174   string err;
175   EXPECT_FALSE(plan_.AddTarget(GetNode("out"), &err));
176   ASSERT_EQ("dependency cycle: out -> mid -> in -> pre -> out", err);
177 }
178
179 struct BuildTest : public StateTestWithBuiltinRules,
180                    public CommandRunner {
181   BuildTest() : config_(MakeConfig()), builder_(&state_, config_), now_(1),
182                 last_command_(NULL), status_(config_) {
183     builder_.disk_interface_ = &fs_;
184     builder_.command_runner_.reset(this);
185     AssertParse(&state_,
186 "build cat1: cat in1\n"
187 "build cat2: cat in1 in2\n"
188 "build cat12: cat cat1 cat2\n");
189
190     fs_.Create("in1", now_, "");
191     fs_.Create("in2", now_, "");
192   }
193
194   ~BuildTest() {
195     builder_.command_runner_.release();
196   }
197
198   // Mark a path dirty.
199   void Dirty(const string& path);
200
201   // CommandRunner impl
202   virtual bool CanRunMore();
203   virtual bool StartCommand(Edge* edge);
204   virtual Edge* WaitForCommand(ExitStatus* status, string* output);
205   virtual vector<Edge*> GetActiveEdges();
206   virtual void Abort();
207
208   BuildConfig MakeConfig() {
209     BuildConfig config;
210     config.verbosity = BuildConfig::QUIET;
211     return config;
212   }
213
214   BuildConfig config_;
215   Builder builder_;
216   int now_;
217
218   VirtualFileSystem fs_;
219
220   vector<string> commands_ran_;
221   Edge* last_command_;
222   BuildStatus status_;
223 };
224
225 void BuildTest::Dirty(const string& path) {
226   Node* node = GetNode(path);
227   node->MarkDirty();
228
229   // If it's an input file, mark that we've already stat()ed it and
230   // it's missing.
231   if (!node->in_edge())
232     node->MarkMissing();
233 }
234
235 bool BuildTest::CanRunMore() {
236   // Only run one at a time.
237   return last_command_ == NULL;
238 }
239
240 bool BuildTest::StartCommand(Edge* edge) {
241   assert(!last_command_);
242   commands_ran_.push_back(edge->EvaluateCommand());
243   if (edge->rule().name() == "cat"  ||
244       edge->rule().name() == "cat_rsp" ||
245       edge->rule().name() == "cc" ||
246       edge->rule().name() == "touch" ||
247       edge->rule().name() == "touch-interrupt") {
248     for (vector<Node*>::iterator out = edge->outputs_.begin();
249          out != edge->outputs_.end(); ++out) {
250       fs_.Create((*out)->path(), now_, "");
251     }
252   } else if (edge->rule().name() == "true" ||
253              edge->rule().name() == "fail" ||
254              edge->rule().name() == "interrupt") {
255     // Don't do anything.
256   } else {
257     printf("unknown command\n");
258     return false;
259   }
260
261   last_command_ = edge;
262   return true;
263 }
264
265 Edge* BuildTest::WaitForCommand(ExitStatus* status, string* /* output */) {
266   if (Edge* edge = last_command_) {
267     if (edge->rule().name() == "interrupt" ||
268         edge->rule().name() == "touch-interrupt") {
269       *status = ExitInterrupted;
270       return NULL;
271     }
272
273     if (edge->rule().name() == "fail")
274       *status = ExitFailure;
275     else
276       *status = ExitSuccess;
277     last_command_ = NULL;
278     return edge;
279   }
280   *status = ExitFailure;
281   return NULL;
282 }
283
284 vector<Edge*> BuildTest::GetActiveEdges() {
285   vector<Edge*> edges;
286   if (last_command_)
287     edges.push_back(last_command_);
288   return edges;
289 }
290
291 void BuildTest::Abort() {
292   last_command_ = NULL;
293 }
294
295 TEST_F(BuildTest, NoWork) {
296   string err;
297   EXPECT_TRUE(builder_.AlreadyUpToDate());
298 }
299
300 TEST_F(BuildTest, OneStep) {
301   // Given a dirty target with one ready input,
302   // we should rebuild the target.
303   Dirty("cat1");
304   string err;
305   EXPECT_TRUE(builder_.AddTarget("cat1", &err));
306   ASSERT_EQ("", err);
307   EXPECT_TRUE(builder_.Build(&err));
308   ASSERT_EQ("", err);
309
310   ASSERT_EQ(1u, commands_ran_.size());
311   EXPECT_EQ("cat in1 > cat1", commands_ran_[0]);
312 }
313
314 TEST_F(BuildTest, OneStep2) {
315   // Given a target with one dirty input,
316   // we should rebuild the target.
317   Dirty("cat1");
318   string err;
319   EXPECT_TRUE(builder_.AddTarget("cat1", &err));
320   ASSERT_EQ("", err);
321   EXPECT_TRUE(builder_.Build(&err));
322   EXPECT_EQ("", err);
323
324   ASSERT_EQ(1u, commands_ran_.size());
325   EXPECT_EQ("cat in1 > cat1", commands_ran_[0]);
326 }
327
328 TEST_F(BuildTest, TwoStep) {
329   string err;
330   EXPECT_TRUE(builder_.AddTarget("cat12", &err));
331   ASSERT_EQ("", err);
332   EXPECT_TRUE(builder_.Build(&err));
333   EXPECT_EQ("", err);
334   ASSERT_EQ(3u, commands_ran_.size());
335   // Depending on how the pointers work out, we could've ran
336   // the first two commands in either order.
337   EXPECT_TRUE((commands_ran_[0] == "cat in1 > cat1" &&
338                commands_ran_[1] == "cat in1 in2 > cat2") ||
339               (commands_ran_[1] == "cat in1 > cat1" &&
340                commands_ran_[0] == "cat in1 in2 > cat2"));
341
342   EXPECT_EQ("cat cat1 cat2 > cat12", commands_ran_[2]);
343
344   now_++;
345
346   // Modifying in2 requires rebuilding one intermediate file
347   // and the final file.
348   fs_.Create("in2", now_, "");
349   state_.Reset();
350   EXPECT_TRUE(builder_.AddTarget("cat12", &err));
351   ASSERT_EQ("", err);
352   EXPECT_TRUE(builder_.Build(&err));
353   ASSERT_EQ("", err);
354   ASSERT_EQ(5u, commands_ran_.size());
355   EXPECT_EQ("cat in1 in2 > cat2", commands_ran_[3]);
356   EXPECT_EQ("cat cat1 cat2 > cat12", commands_ran_[4]);
357 }
358
359 TEST_F(BuildTest, TwoOutputs) {
360   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
361 "rule touch\n"
362 "  command = touch $out\n"
363 "build out1 out2: touch in.txt\n"));
364
365   fs_.Create("in.txt", now_, "");
366
367   string err;
368   EXPECT_TRUE(builder_.AddTarget("out1", &err));
369   ASSERT_EQ("", err);
370   EXPECT_TRUE(builder_.Build(&err));
371   EXPECT_EQ("", err);
372   ASSERT_EQ(1u, commands_ran_.size());
373   EXPECT_EQ("touch out1 out2", commands_ran_[0]);
374 }
375
376 // Test case from
377 //   https://github.com/martine/ninja/issues/148
378 TEST_F(BuildTest, MultiOutIn) {
379   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
380 "rule touch\n"
381 "  command = touch $out\n"
382 "build in1 otherfile: touch in\n"
383 "build out: touch in | in1\n"));
384
385   fs_.Create("in", now_, "");
386   fs_.Create("in1", ++now_, "");
387
388   string err;
389   EXPECT_TRUE(builder_.AddTarget("out", &err));
390   ASSERT_EQ("", err);
391   EXPECT_TRUE(builder_.Build(&err));
392   EXPECT_EQ("", err);
393 }
394
395 TEST_F(BuildTest, Chain) {
396   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
397 "build c2: cat c1\n"
398 "build c3: cat c2\n"
399 "build c4: cat c3\n"
400 "build c5: cat c4\n"));
401
402   fs_.Create("c1", now_, "");
403
404   string err;
405   EXPECT_TRUE(builder_.AddTarget("c5", &err));
406   ASSERT_EQ("", err);
407   EXPECT_TRUE(builder_.Build(&err));
408   EXPECT_EQ("", err);
409   ASSERT_EQ(4u, commands_ran_.size());
410
411   err.clear();
412   commands_ran_.clear();
413   state_.Reset();
414   EXPECT_TRUE(builder_.AddTarget("c5", &err));
415   ASSERT_EQ("", err);
416   EXPECT_TRUE(builder_.AlreadyUpToDate());
417
418   now_++;
419
420   fs_.Create("c3", now_, "");
421   err.clear();
422   commands_ran_.clear();
423   state_.Reset();
424   EXPECT_TRUE(builder_.AddTarget("c5", &err));
425   ASSERT_EQ("", err);
426   EXPECT_FALSE(builder_.AlreadyUpToDate());
427   EXPECT_TRUE(builder_.Build(&err));
428   ASSERT_EQ(2u, commands_ran_.size());  // 3->4, 4->5
429 }
430
431 TEST_F(BuildTest, MissingInput) {
432   // Input is referenced by build file, but no rule for it.
433   string err;
434   Dirty("in1");
435   EXPECT_FALSE(builder_.AddTarget("cat1", &err));
436   EXPECT_EQ("'in1', needed by 'cat1', missing and no known rule to make it",
437             err);
438 }
439
440 TEST_F(BuildTest, MissingTarget) {
441   // Target is not referenced by build file.
442   string err;
443   EXPECT_FALSE(builder_.AddTarget("meow", &err));
444   EXPECT_EQ("unknown target: 'meow'", err);
445 }
446
447 TEST_F(BuildTest, MakeDirs) {
448   string err;
449
450 #ifdef _WIN32
451   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_, "build subdir\\dir2\\file: cat in1\n"));
452   EXPECT_TRUE(builder_.AddTarget("subdir\\dir2\\file", &err));
453 #else
454   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_, "build subdir/dir2/file: cat in1\n"));
455   EXPECT_TRUE(builder_.AddTarget("subdir/dir2/file", &err));
456 #endif
457
458   EXPECT_EQ("", err);
459   now_ = 0;  // Make all stat()s return file not found.
460   EXPECT_TRUE(builder_.Build(&err));
461   ASSERT_EQ("", err);
462   ASSERT_EQ(2u, fs_.directories_made_.size());
463   EXPECT_EQ("subdir", fs_.directories_made_[0]);
464 #ifdef _WIN32
465   EXPECT_EQ("subdir\\dir2", fs_.directories_made_[1]);
466 #else
467   EXPECT_EQ("subdir/dir2", fs_.directories_made_[1]);
468 #endif
469 }
470
471 TEST_F(BuildTest, DepFileMissing) {
472   string err;
473   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
474 "rule cc\n  command = cc $in\n  depfile = $out.d\n"
475 "build foo.o: cc foo.c\n"));
476   fs_.Create("foo.c", now_, "");
477
478   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
479   ASSERT_EQ("", err);
480   ASSERT_EQ(1u, fs_.files_read_.size());
481   EXPECT_EQ("foo.o.d", fs_.files_read_[0]);
482 }
483
484 TEST_F(BuildTest, DepFileOK) {
485   string err;
486   int orig_edges = state_.edges_.size();
487   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
488 "rule cc\n  command = cc $in\n  depfile = $out.d\n"
489 "build foo.o: cc foo.c\n"));
490   Edge* edge = state_.edges_.back();
491
492   fs_.Create("foo.c", now_, "");
493   GetNode("bar.h")->MarkDirty();  // Mark bar.h as missing.
494   fs_.Create("foo.o.d", now_, "foo.o: blah.h bar.h\n");
495   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
496   ASSERT_EQ("", err);
497   ASSERT_EQ(1u, fs_.files_read_.size());
498   EXPECT_EQ("foo.o.d", fs_.files_read_[0]);
499
500   // Expect three new edges: one generating foo.o, and two more from
501   // loading the depfile.
502   ASSERT_EQ(orig_edges + 3, (int)state_.edges_.size());
503   // Expect our edge to now have three inputs: foo.c and two headers.
504   ASSERT_EQ(3u, edge->inputs_.size());
505
506   // Expect the command line we generate to only use the original input.
507   ASSERT_EQ("cc foo.c", edge->EvaluateCommand());
508 }
509
510 TEST_F(BuildTest, DepFileParseError) {
511   string err;
512   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
513 "rule cc\n  command = cc $in\n  depfile = $out.d\n"
514 "build foo.o: cc foo.c\n"));
515   fs_.Create("foo.c", now_, "");
516   fs_.Create("foo.o.d", now_, "randomtext\n");
517   EXPECT_FALSE(builder_.AddTarget("foo.o", &err));
518   EXPECT_EQ("expected depfile 'foo.o.d' to mention 'foo.o', got 'randomtext'",
519             err);
520 }
521
522 TEST_F(BuildTest, OrderOnlyDeps) {
523   string err;
524   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
525 "rule cc\n  command = cc $in\n  depfile = $out.d\n"
526 "build foo.o: cc foo.c || otherfile\n"));
527   Edge* edge = state_.edges_.back();
528
529   fs_.Create("foo.c", now_, "");
530   fs_.Create("otherfile", now_, "");
531   fs_.Create("foo.o.d", now_, "foo.o: blah.h bar.h\n");
532   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
533   ASSERT_EQ("", err);
534
535   // One explicit, two implicit, one order only.
536   ASSERT_EQ(4u, edge->inputs_.size());
537   EXPECT_EQ(2, edge->implicit_deps_);
538   EXPECT_EQ(1, edge->order_only_deps_);
539   // Verify the inputs are in the order we expect
540   // (explicit then implicit then orderonly).
541   EXPECT_EQ("foo.c", edge->inputs_[0]->path());
542   EXPECT_EQ("blah.h", edge->inputs_[1]->path());
543   EXPECT_EQ("bar.h", edge->inputs_[2]->path());
544   EXPECT_EQ("otherfile", edge->inputs_[3]->path());
545
546   // Expect the command line we generate to only use the original input.
547   ASSERT_EQ("cc foo.c", edge->EvaluateCommand());
548
549   // explicit dep dirty, expect a rebuild.
550   EXPECT_TRUE(builder_.Build(&err));
551   ASSERT_EQ("", err);
552   ASSERT_EQ(1u, commands_ran_.size());
553
554   now_++;
555
556   // implicit dep dirty, expect a rebuild.
557   fs_.Create("blah.h", now_, "");
558   fs_.Create("bar.h", now_, "");
559   commands_ran_.clear();
560   state_.Reset();
561   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
562   EXPECT_TRUE(builder_.Build(&err));
563   ASSERT_EQ("", err);
564   ASSERT_EQ(1u, commands_ran_.size());
565
566   now_++;
567
568   // order only dep dirty, no rebuild.
569   fs_.Create("otherfile", now_, "");
570   commands_ran_.clear();
571   state_.Reset();
572   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
573   EXPECT_EQ("", err);
574   EXPECT_TRUE(builder_.AlreadyUpToDate());
575
576   // implicit dep missing, expect rebuild.
577   fs_.RemoveFile("bar.h");
578   commands_ran_.clear();
579   state_.Reset();
580   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
581   EXPECT_TRUE(builder_.Build(&err));
582   ASSERT_EQ("", err);
583   ASSERT_EQ(1u, commands_ran_.size());
584 }
585
586 TEST_F(BuildTest, RebuildOrderOnlyDeps) {
587   string err;
588   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
589 "rule cc\n  command = cc $in\n"
590 "rule true\n  command = true\n"
591 "build oo.h: cc oo.h.in\n"
592 "build foo.o: cc foo.c || oo.h\n"));
593
594   fs_.Create("foo.c", now_, "");
595   fs_.Create("oo.h.in", now_, "");
596
597   // foo.o and order-only dep dirty, build both.
598   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
599   EXPECT_TRUE(builder_.Build(&err));
600   ASSERT_EQ("", err);
601   ASSERT_EQ(2u, commands_ran_.size());
602
603   // all clean, no rebuild.
604   commands_ran_.clear();
605   state_.Reset();
606   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
607   EXPECT_EQ("", err);
608   EXPECT_TRUE(builder_.AlreadyUpToDate());
609
610   // order-only dep missing, build it only.
611   fs_.RemoveFile("oo.h");
612   commands_ran_.clear();
613   state_.Reset();
614   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
615   EXPECT_TRUE(builder_.Build(&err));
616   ASSERT_EQ("", err);
617   ASSERT_EQ(1u, commands_ran_.size());
618   ASSERT_EQ("cc oo.h.in", commands_ran_[0]);
619
620   now_++;
621
622   // order-only dep dirty, build it only.
623   fs_.Create("oo.h.in", now_, "");
624   commands_ran_.clear();
625   state_.Reset();
626   EXPECT_TRUE(builder_.AddTarget("foo.o", &err));
627   EXPECT_TRUE(builder_.Build(&err));
628   ASSERT_EQ("", err);
629   ASSERT_EQ(1u, commands_ran_.size());
630   ASSERT_EQ("cc oo.h.in", commands_ran_[0]);
631 }
632
633 TEST_F(BuildTest, Phony) {
634   string err;
635   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
636 "build out: cat bar.cc\n"
637 "build all: phony out\n"));
638   fs_.Create("bar.cc", now_, "");
639
640   EXPECT_TRUE(builder_.AddTarget("all", &err));
641   ASSERT_EQ("", err);
642
643   // Only one command to run, because phony runs no command.
644   EXPECT_FALSE(builder_.AlreadyUpToDate());
645   EXPECT_TRUE(builder_.Build(&err));
646   ASSERT_EQ("", err);
647   ASSERT_EQ(1u, commands_ran_.size());
648 }
649
650 TEST_F(BuildTest, PhonyNoWork) {
651   string err;
652   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
653 "build out: cat bar.cc\n"
654 "build all: phony out\n"));
655   fs_.Create("bar.cc", now_, "");
656   fs_.Create("out", now_, "");
657
658   EXPECT_TRUE(builder_.AddTarget("all", &err));
659   ASSERT_EQ("", err);
660   EXPECT_TRUE(builder_.AlreadyUpToDate());
661 }
662
663 TEST_F(BuildTest, Fail) {
664   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
665 "rule fail\n"
666 "  command = fail\n"
667 "build out1: fail\n"));
668
669   string err;
670   EXPECT_TRUE(builder_.AddTarget("out1", &err));
671   ASSERT_EQ("", err);
672
673   EXPECT_FALSE(builder_.Build(&err));
674   ASSERT_EQ(1u, commands_ran_.size());
675   ASSERT_EQ("subcommand failed", err);
676 }
677
678 TEST_F(BuildTest, SwallowFailures) {
679   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
680 "rule fail\n"
681 "  command = fail\n"
682 "build out1: fail\n"
683 "build out2: fail\n"
684 "build out3: fail\n"
685 "build all: phony out1 out2 out3\n"));
686
687   // Swallow two failures, die on the third.
688   config_.failures_allowed = 3;
689
690   string err;
691   EXPECT_TRUE(builder_.AddTarget("all", &err));
692   ASSERT_EQ("", err);
693
694   EXPECT_FALSE(builder_.Build(&err));
695   ASSERT_EQ(3u, commands_ran_.size());
696   ASSERT_EQ("subcommands failed", err);
697 }
698
699 TEST_F(BuildTest, SwallowFailuresLimit) {
700   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
701 "rule fail\n"
702 "  command = fail\n"
703 "build out1: fail\n"
704 "build out2: fail\n"
705 "build out3: fail\n"
706 "build final: cat out1 out2 out3\n"));
707
708   // Swallow ten failures; we should stop before building final.
709   config_.failures_allowed = 11;
710
711   string err;
712   EXPECT_TRUE(builder_.AddTarget("final", &err));
713   ASSERT_EQ("", err);
714
715   EXPECT_FALSE(builder_.Build(&err));
716   ASSERT_EQ(3u, commands_ran_.size());
717   ASSERT_EQ("cannot make progress due to previous errors", err);
718 }
719
720 struct BuildWithLogTest : public BuildTest {
721   BuildWithLogTest() {
722     state_.build_log_ = builder_.log_ = &build_log_;
723   }
724
725   BuildLog build_log_;
726 };
727
728 TEST_F(BuildWithLogTest, RestatTest) {
729   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
730 "rule true\n"
731 "  command = true\n"
732 "  restat = 1\n"
733 "rule cc\n"
734 "  command = cc\n"
735 "  restat = 1\n"
736 "build out1: cc in\n"
737 "build out2: true out1\n"
738 "build out3: cat out2\n"));
739
740   fs_.Create("out1", now_, "");
741   fs_.Create("out2", now_, "");
742   fs_.Create("out3", now_, "");
743
744   now_++;
745
746   fs_.Create("in", now_, "");
747
748   // "cc" touches out1, so we should build out2.  But because "true" does not
749   // touch out2, we should cancel the build of out3.
750   string err;
751   EXPECT_TRUE(builder_.AddTarget("out3", &err));
752   ASSERT_EQ("", err);
753   EXPECT_TRUE(builder_.Build(&err));
754   ASSERT_EQ(2u, commands_ran_.size());
755
756   // If we run again, it should be a no-op, because the build log has recorded
757   // that we've already built out2 with an input timestamp of 2 (from out1).
758   commands_ran_.clear();
759   state_.Reset();
760   EXPECT_TRUE(builder_.AddTarget("out3", &err));
761   ASSERT_EQ("", err);
762   EXPECT_TRUE(builder_.AlreadyUpToDate());
763
764   now_++;
765
766   fs_.Create("in", now_, "");
767
768   // The build log entry should not, however, prevent us from rebuilding out2
769   // if out1 changes.
770   commands_ran_.clear();
771   state_.Reset();
772   EXPECT_TRUE(builder_.AddTarget("out3", &err));
773   ASSERT_EQ("", err);
774   EXPECT_TRUE(builder_.Build(&err));
775   ASSERT_EQ(2u, commands_ran_.size());
776 }
777
778 TEST_F(BuildWithLogTest, RestatMissingFile) {
779   // If a restat rule doesn't create its output, and the output didn't
780   // exist before the rule was run, consider that behavior equivalent
781   // to a rule that doesn't modify its existent output file.
782
783   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
784 "rule true\n"
785 "  command = true\n"
786 "  restat = 1\n"
787 "rule cc\n"
788 "  command = cc\n"
789 "build out1: true in\n"
790 "build out2: cc out1\n"));
791
792   fs_.Create("in", now_, "");
793   fs_.Create("out2", now_, "");
794
795   // Run a build, expect only the first command to run.
796   // It doesn't touch its output (due to being the "true" command), so
797   // we shouldn't run the dependent build.
798   string err;
799   EXPECT_TRUE(builder_.AddTarget("out2", &err));
800   ASSERT_EQ("", err);
801   EXPECT_TRUE(builder_.Build(&err));
802   ASSERT_EQ(1u, commands_ran_.size());
803 }
804
805 // Test scenario, in which an input file is removed, but output isn't changed
806 // https://github.com/martine/ninja/issues/295
807 TEST_F(BuildWithLogTest, RestatMissingInput) {
808   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
809     "rule true\n"
810     "  command = true\n"
811     "  depfile = $out.d\n"
812     "  restat = 1\n"
813     "rule cc\n"
814     "  command = cc\n"
815     "build out1: true in\n"
816     "build out2: cc out1\n"));
817
818   // Create all necessary files
819   fs_.Create("in", now_, "");
820
821   // The implicit dependencies and the depfile itself 
822   // are newer than the output
823   TimeStamp restat_mtime = ++now_;
824   fs_.Create("out1.d", now_, "out1: will.be.deleted restat.file\n");
825   fs_.Create("will.be.deleted", now_, "");
826   fs_.Create("restat.file", now_, "");
827
828   // Run the build, out1 and out2 get built
829   string err;
830   EXPECT_TRUE(builder_.AddTarget("out2", &err));
831   ASSERT_EQ("", err);
832   EXPECT_TRUE(builder_.Build(&err));
833   ASSERT_EQ(2u, commands_ran_.size());
834
835   // See that an entry in the logfile is created, capturing
836   // the right mtime
837   BuildLog::LogEntry * log_entry = build_log_.LookupByOutput("out1");
838   ASSERT_TRUE(NULL != log_entry);
839   ASSERT_EQ(restat_mtime, log_entry->restat_mtime);
840
841   // Now remove a file, referenced from depfile, so that target becomes 
842   // dirty, but the output does not change
843   fs_.RemoveFile("will.be.deleted");
844   
845   // Trigger the build again - only out1 gets built
846   commands_ran_.clear();
847   state_.Reset();
848   EXPECT_TRUE(builder_.AddTarget("out2", &err));
849   ASSERT_EQ("", err);
850   EXPECT_TRUE(builder_.Build(&err));
851   ASSERT_EQ(1u, commands_ran_.size());
852
853   // Check that the logfile entry remains correctly set
854   log_entry = build_log_.LookupByOutput("out1");
855   ASSERT_TRUE(NULL != log_entry);
856   ASSERT_EQ(restat_mtime, log_entry->restat_mtime);
857 }
858
859 struct BuildDryRun : public BuildWithLogTest {
860   BuildDryRun() {
861     config_.dry_run = true;
862   }
863 };
864
865 TEST_F(BuildDryRun, AllCommandsShown) {
866   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
867 "rule true\n"
868 "  command = true\n"
869 "  restat = 1\n"
870 "rule cc\n"
871 "  command = cc\n"
872 "  restat = 1\n"
873 "build out1: cc in\n"
874 "build out2: true out1\n"
875 "build out3: cat out2\n"));
876
877   fs_.Create("out1", now_, "");
878   fs_.Create("out2", now_, "");
879   fs_.Create("out3", now_, "");
880
881   now_++;
882
883   fs_.Create("in", now_, "");
884
885   // "cc" touches out1, so we should build out2.  But because "true" does not
886   // touch out2, we should cancel the build of out3.
887   string err;
888   EXPECT_TRUE(builder_.AddTarget("out3", &err));
889   ASSERT_EQ("", err);
890   EXPECT_TRUE(builder_.Build(&err));
891   ASSERT_EQ(3u, commands_ran_.size());
892 }
893
894 // Test that RSP files are created when & where appropriate and deleted after
895 // succesful execution.
896 TEST_F(BuildTest, RspFileSuccess)
897 {
898   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
899     "rule cat_rsp\n"
900     "  command = cat $rspfile > $out\n"
901     "  rspfile = $rspfile\n"
902     "  rspfile_content = $long_command\n"
903     "build out1: cat in\n"
904     "build out2: cat_rsp in\n"
905     "  rspfile = out2.rsp\n"
906     "  long_command = Some very long command\n"));
907
908   fs_.Create("out1", now_, "");
909   fs_.Create("out2", now_, "");
910   fs_.Create("out3", now_, "");
911
912   now_++;
913
914   fs_.Create("in", now_, "");
915
916   string err;
917   EXPECT_TRUE(builder_.AddTarget("out1", &err));
918   ASSERT_EQ("", err);
919   EXPECT_TRUE(builder_.AddTarget("out2", &err));
920   ASSERT_EQ("", err);
921
922   size_t files_created = fs_.files_created_.size();
923   size_t files_removed = fs_.files_removed_.size();
924
925   EXPECT_TRUE(builder_.Build(&err));
926   ASSERT_EQ(2u, commands_ran_.size()); // cat + cat_rsp
927
928   // The RSP file was created
929   ASSERT_EQ(files_created + 1, fs_.files_created_.size());
930   ASSERT_EQ(1u, fs_.files_created_.count("out2.rsp"));
931
932   // The RSP file was removed
933   ASSERT_EQ(files_removed + 1, fs_.files_removed_.size());
934   ASSERT_EQ(1u, fs_.files_removed_.count("out2.rsp"));
935 }
936
937 // Test that RSP file is created but not removed for commands, which fail
938 TEST_F(BuildTest, RspFileFailure) {
939   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
940     "rule fail\n"
941     "  command = fail\n"
942     "  rspfile = $rspfile\n"
943     "  rspfile_content = $long_command\n"
944     "build out: fail in\n"
945     "  rspfile = out.rsp\n"
946     "  long_command = Another very long command\n"));
947
948   fs_.Create("out", now_, "");
949   now_++;
950   fs_.Create("in", now_, "");
951
952   string err;
953   EXPECT_TRUE(builder_.AddTarget("out", &err));
954   ASSERT_EQ("", err);
955
956   size_t files_created = fs_.files_created_.size();
957   size_t files_removed = fs_.files_removed_.size();
958
959   EXPECT_FALSE(builder_.Build(&err));
960   ASSERT_EQ("subcommand failed", err);
961   ASSERT_EQ(1u, commands_ran_.size());
962
963   // The RSP file was created
964   ASSERT_EQ(files_created + 1, fs_.files_created_.size());
965   ASSERT_EQ(1u, fs_.files_created_.count("out.rsp"));
966
967   // The RSP file was NOT removed
968   ASSERT_EQ(files_removed, fs_.files_removed_.size());
969   ASSERT_EQ(0u, fs_.files_removed_.count("out.rsp"));
970
971   // The RSP file contains what it should
972   ASSERT_EQ("Another very long command", fs_.files_["out.rsp"].contents);
973 }
974
975 // Test that contens of the RSP file behaves like a regular part of
976 // command line, i.e. triggers a rebuild if changed
977 TEST_F(BuildWithLogTest, RspFileCmdLineChange) {
978   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
979     "rule cat_rsp\n"
980     "  command = cat $rspfile > $out\n"
981     "  rspfile = $rspfile\n"
982     "  rspfile_content = $long_command\n"
983     "build out: cat_rsp in\n"
984     "  rspfile = out.rsp\n"
985     "  long_command = Original very long command\n"));
986
987   fs_.Create("out", now_, "");
988   now_++;
989   fs_.Create("in", now_, "");
990
991   string err;
992   EXPECT_TRUE(builder_.AddTarget("out", &err));
993   ASSERT_EQ("", err);
994
995   // 1. Build for the 1st time (-> populate log)
996   EXPECT_TRUE(builder_.Build(&err));
997   ASSERT_EQ(1u, commands_ran_.size());
998
999   // 2. Build again (no change)
1000   commands_ran_.clear();
1001   state_.Reset();
1002   EXPECT_TRUE(builder_.AddTarget("out", &err));
1003   EXPECT_EQ("", err);
1004   ASSERT_TRUE(builder_.AlreadyUpToDate());
1005
1006   // 3. Alter the entry in the logfile
1007   // (to simulate a change in the command line between 2 builds)
1008   BuildLog::LogEntry * log_entry = build_log_.LookupByOutput("out");
1009   ASSERT_TRUE(NULL != log_entry);
1010   ASSERT_NO_FATAL_FAILURE(AssertHash(
1011         "cat out.rsp > out;rspfile=Original very long command",
1012         log_entry->command_hash));
1013   log_entry->command_hash++;  // Change the command hash to something else.
1014   // Now expect the target to be rebuilt
1015   commands_ran_.clear();
1016   state_.Reset();
1017   EXPECT_TRUE(builder_.AddTarget("out", &err));
1018   EXPECT_EQ("", err);
1019   EXPECT_TRUE(builder_.Build(&err));
1020   EXPECT_EQ(1u, commands_ran_.size());
1021 }
1022
1023 TEST_F(BuildTest, InterruptCleanup) {
1024   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
1025 "rule interrupt\n"
1026 "  command = interrupt\n"
1027 "rule touch-interrupt\n"
1028 "  command = touch-interrupt\n"
1029 "build out1: interrupt in1\n"
1030 "build out2: touch-interrupt in2\n"));
1031
1032   fs_.Create("out1", now_, "");
1033   fs_.Create("out2", now_, "");
1034   now_++;
1035   fs_.Create("in1", now_, "");
1036   fs_.Create("in2", now_, "");
1037
1038   // An untouched output of an interrupted command should be retained.
1039   string err;
1040   EXPECT_TRUE(builder_.AddTarget("out1", &err));
1041   EXPECT_EQ("", err);
1042   EXPECT_FALSE(builder_.Build(&err));
1043   EXPECT_EQ("interrupted by user", err);
1044   builder_.Cleanup();
1045   EXPECT_EQ(now_-1, fs_.Stat("out1"));
1046   err = "";
1047
1048   // A touched output of an interrupted command should be deleted.
1049   EXPECT_TRUE(builder_.AddTarget("out2", &err));
1050   EXPECT_EQ("", err);
1051   EXPECT_FALSE(builder_.Build(&err));
1052   EXPECT_EQ("interrupted by user", err);
1053   builder_.Cleanup();
1054   EXPECT_EQ(0, fs_.Stat("out2"));
1055 }
1056
1057 TEST_F(BuildTest, PhonyWithNoInputs) {
1058   ASSERT_NO_FATAL_FAILURE(AssertParse(&state_,
1059 "build nonexistent: phony\n"
1060 "build out1: cat || nonexistent\n"
1061 "build out2: cat nonexistent\n"));
1062   fs_.Create("out1", now_, "");
1063   fs_.Create("out2", now_, "");
1064
1065   // out1 should be up to date even though its input is dirty, because its
1066   // order-only dependency has nothing to do.
1067   string err;
1068   EXPECT_TRUE(builder_.AddTarget("out1", &err));
1069   ASSERT_EQ("", err);
1070   EXPECT_TRUE(builder_.AlreadyUpToDate());
1071
1072   // out2 should still be out of date though, because its input is dirty.
1073   err.clear();
1074   commands_ran_.clear();
1075   state_.Reset();
1076   EXPECT_TRUE(builder_.AddTarget("out2", &err));
1077   ASSERT_EQ("", err);
1078   EXPECT_TRUE(builder_.Build(&err));
1079   EXPECT_EQ("", err);
1080   ASSERT_EQ(1u, commands_ran_.size());
1081 }
1082
1083 TEST_F(BuildTest, StatusFormatReplacePlaceholder) {
1084   EXPECT_EQ("[%/s0/t0/r0/u0/f0]",
1085             status_.FormatProgressStatus("[%%/s%s/t%t/r%r/u%u/f%f]"));
1086 }