27 const Rule& generator) {}
55 for (std::vector<Node*>::iterator it = nodes.begin(); it != nodes.end();
67 state_.
AddOut(header_edge,
"generated_header", 0,
nullptr);
69 state_.
AddOut(compile_edge,
"compiled_object", 0,
nullptr);
81 ASSERT_EQ(1u,
scanner().nodes_missing_deps_.count(flaky_node));
83 ASSERT_EQ(1u,
scanner().generated_nodes_.count(generated_node));
84 ASSERT_EQ(1u,
scanner().generator_rules_.count(rule));
99 ASSERT_FALSE(scanner().HadMissingDeps());
103 CreateInitialState();
105 ASSERT_FALSE(scanner().HadMissingDeps());
109 CreateInitialState();
111 RecordDepsLogDep(
"compiled_object",
"generated_header");
113 ASSERT_TRUE(scanner().HadMissingDeps());
114 ASSERT_EQ(1u, scanner().nodes_missing_deps_.size());
115 ASSERT_EQ(1u, scanner().missing_dep_path_count_);
116 AssertMissingDependencyBetween(
"compiled_object",
"generated_header",
121 CreateInitialState();
123 CreateGraphDependencyBetween(
"compiled_object",
"generated_header");
124 RecordDepsLogDep(
"compiled_object",
"generated_header");
126 ASSERT_FALSE(scanner().HadMissingDeps());
130 CreateInitialState();
132 Edge* intermediate_edge = state_.AddEdge(&generator_rule_);
133 state_.AddOut(intermediate_edge,
"intermediate", 0,
nullptr);
134 CreateGraphDependencyBetween(
"compiled_object",
"intermediate");
135 CreateGraphDependencyBetween(
"intermediate",
"generated_header");
136 RecordDepsLogDep(
"compiled_object",
"generated_header");
138 ASSERT_FALSE(scanner().HadMissingDeps());
142 CreateInitialState();
143 RecordDepsLogDep(
"generated_header",
"compiled_object");
144 RecordDepsLogDep(
"compiled_object",
"generated_header");
148 ASSERT_TRUE(scanner().HadMissingDeps());
149 ASSERT_EQ(2u, scanner().nodes_missing_deps_.size());
150 ASSERT_EQ(2u, scanner().missing_dep_path_count_);
151 AssertMissingDependencyBetween(
"compiled_object",
"generated_header",
153 AssertMissingDependencyBetween(
"generated_header",
"compiled_object",
158 CreateInitialState();
159 CreateGraphDependencyBetween(
"compiled_object",
"generated_header");
160 CreateGraphDependencyBetween(
"generated_header",
"compiled_object");
165 std::vector<Node*> nodes = state_.RootNodes(&err);
void OnMissingDep(Node *node, const std::string &path, const Rule &generator)
const char kTestDepsLogFilename[]
TEST_F(MissingDependencyScannerTest, EmptyGraph)
As build commands run they can output extra dependency information (e.g.
bool OpenForWrite(const std::string &path, std::string *err)
bool RecordDeps(Node *node, TimeStamp mtime, const std::vector< Node * > &nodes)
An edge in the dependency graph; links between Nodes using Rules.
A tokenized string that contains variable references.
void AddText(StringPiece text)
MissingDependencyScanner scanner_
ScopedFilePath scoped_file_path_
void CreateGraphDependencyBetween(const char *from, const char *to)
MissingDependencyScanner & scanner()
MissingDependencyTestDelegate delegate_
void AssertMissingDependencyBetween(const char *flaky, const char *generated, Rule *rule)
void CreateInitialState()
MissingDependencyScannerTest()
VirtualFileSystem filesystem_
~MissingDependencyScannerTest()
void RecordDepsLogDep(const std::string &from, const std::string &to)
void ProcessNode(Node *node)
Information about a node in the dependency graph: the file, whether it's dirty, mtime,...
An invocable build command and associated metadata (description, etc.).
void AddBinding(const std::string &key, const EvalString &val)
A class that records a file path and ensures that it is removed on destruction.
Global state (file status) for a single run.
std::vector< Node * > RootNodes(std::string *error) const
Edge * AddEdge(const Rule *rule)
void AddIn(Edge *edge, StringPiece path, uint64_t slash_bits)
Add input / output / validation nodes to a given edge.
Node * LookupNode(StringPiece path) const
bool AddOut(Edge *edge, StringPiece path, uint64_t slash_bits, std::string *err)
An implementation of DiskInterface that uses an in-memory representation of disk state.