diff options
Diffstat (limited to 'src/test.cc')
-rw-r--r-- | src/test.cc | 60 |
1 files changed, 51 insertions, 9 deletions
diff --git a/src/test.cc b/src/test.cc index 45a9226..aed8db7 100644 --- a/src/test.cc +++ b/src/test.cc @@ -12,20 +12,26 @@ // See the License for the specific language governing permissions and // limitations under the License. +#ifdef _WIN32 +#include <direct.h> // Has to be before util.h is included. +#endif + #include "test.h" #include <algorithm> #include <errno.h> +#ifdef _WIN32 +#include <windows.h> +#else +#include <unistd.h> +#endif #include "build_log.h" +#include "graph.h" #include "manifest_parser.h" #include "util.h" -#ifdef _WIN32 -#include <windows.h> -#endif - namespace { #ifdef _WIN32 @@ -84,20 +90,54 @@ void StateTestWithBuiltinRules::AddCatRule(State* state) { } Node* StateTestWithBuiltinRules::GetNode(const string& path) { - return state_.GetNode(path); + EXPECT_FALSE(strpbrk(path.c_str(), "/\\")); + return state_.GetNode(path, 0); } void AssertParse(State* state, const char* input) { ManifestParser parser(state, NULL); string err; - ASSERT_TRUE(parser.ParseTest(input, &err)) << err; + EXPECT_TRUE(parser.ParseTest(input, &err)); ASSERT_EQ("", err); + VerifyGraph(*state); } void AssertHash(const char* expected, uint64_t actual) { ASSERT_EQ(BuildLog::LogEntry::HashCommand(expected), actual); } +void VerifyGraph(const State& state) { + for (vector<Edge*>::const_iterator e = state.edges_.begin(); + e != state.edges_.end(); ++e) { + // All edges need at least one output. + EXPECT_FALSE((*e)->outputs_.empty()); + // Check that the edge's inputs have the edge as out-edge. + for (vector<Node*>::const_iterator in_node = (*e)->inputs_.begin(); + in_node != (*e)->inputs_.end(); ++in_node) { + const vector<Edge*>& out_edges = (*in_node)->out_edges(); + EXPECT_NE(std::find(out_edges.begin(), out_edges.end(), *e), + out_edges.end()); + } + // Check that the edge's outputs have the edge as in-edge. + for (vector<Node*>::const_iterator out_node = (*e)->outputs_.begin(); + out_node != (*e)->outputs_.end(); ++out_node) { + EXPECT_EQ((*out_node)->in_edge(), *e); + } + } + + // The union of all in- and out-edges of each nodes should be exactly edges_. + set<const Edge*> node_edge_set; + for (State::Paths::const_iterator p = state.paths_.begin(); + p != state.paths_.end(); ++p) { + const Node* n = p->second; + if (n->in_edge()) + node_edge_set.insert(n->in_edge()); + node_edge_set.insert(n->out_edges().begin(), n->out_edges().end()); + } + set<const Edge*> edge_set(state.edges_.begin(), state.edges_.end()); + EXPECT_EQ(node_edge_set, edge_set); +} + void VirtualFileSystem::Create(const string& path, const string& contents) { files_[path].mtime = now_; @@ -105,10 +145,12 @@ void VirtualFileSystem::Create(const string& path, files_created_.insert(path); } -TimeStamp VirtualFileSystem::Stat(const string& path) { - FileMap::iterator i = files_.find(path); - if (i != files_.end()) +TimeStamp VirtualFileSystem::Stat(const string& path, string* err) const { + FileMap::const_iterator i = files_.find(path); + if (i != files_.end()) { + *err = i->second.stat_error; return i->second.mtime; + } return 0; } |