| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef TOOLS_FIDLCAT_LIB_MESSAGES_GRAPH_TEST_H_ |
| #define TOOLS_FIDLCAT_LIB_MESSAGES_GRAPH_TEST_H_ |
| |
| #include "tools/fidlcat/lib/message_graph.h" |
| |
| #include <map> |
| #include <memory> |
| #include <string> |
| #include <string_view> |
| #include <vector> |
| |
| #include <gtest/gtest.h> |
| |
| class GoldenMessageGraphTest : public GoldenMessageGraph { |
| public: |
| static std::map<uint32_t, int> ReplacesHandlesWithTokensTest(std::string* message) { |
| return ReplacesHandlesWithTokens(message); |
| } |
| } |
| |
| namespace fidlcat { |
| TEST(MessageGraph, GoldenGraphConstruction) { |
| std::string message100 = "100"; |
| std::string message101 = "101"; |
| std::string message110 = "110"; |
| std::string message200 = "200"; |
| std::string process1 = "process1"; |
| std::string process2 = "process2"; |
| std::string pid = "pid"; |
| std::string tid = "tid"; |
| std::string message = "message"; |
| GoldenMessageGraph messages_graph; |
| |
| auto message_node100 = messages_graph.InsertMessage(process1, 1, 10, message100); |
| auto message_node101 = messages_graph.InsertMessage(process1, 1, 10, message101); |
| auto message_node110 = messages_graph.InsertMessage(process1, 1, 11, message110); |
| auto message_node200 = messages_graph.InsertMessage(process2, 2, 20, message200); |
| |
| // Pid nodes are present. |
| auto pid1 = messages_graph.get_pid_node(1); |
| auto pid2 = messages_graph.get_pid_node(2); |
| |
| // Tid nodes and their link to pid nodes as well. |
| // We use here that pid is the first dependency added to a tid. |
| auto tid10 = messages_graph.get_tid_node(10); |
| constexpr DependencyType kTidPidLink = DependencyType(kTidNode, kPidNode); |
| constexpr DependencyType kMessageTidLink = DependencyType(kMessageNode, kTidNode); |
| auto pid_of_tid10 = tid10->get_dependency_by_type(kTidPidLink); |
| ASSERT_EQ(pid_of_tid10, pid1); |
| |
| auto tid11 = messages_graph.get_tid_node(11); |
| auto pid_of_tid11 = tid11->get_dependency_by_type(kTidPidLink); |
| ASSERT_EQ(pid_of_tid11, pid1); |
| |
| auto tid20 = messages_graph.get_tid_node(20); |
| auto pid_of_tid20 = tid20->get_dependency_by_type(kTidPidLink); |
| ASSERT_EQ(pid_of_tid20, pid2); |
| |
| // And the reverse links from pid nodes to tid nodes. |
| auto links_pid1 = pid1->get_reverse_dependencies_by_type(kTidPidLink); |
| ASSERT_EQ(links_pid1->second.size(), 2u); |
| ASSERT_TRUE(links_pid1->second[0].lock() == tid10 || links_pid1->second[0].lock() == tid11); |
| ASSERT_TRUE(links_pid1->second[1].lock() == tid10 || links_pid1->second[1].lock() == tid11); |
| |
| auto links_pid2 = pid2->get_reverse_dependencies_by_type(kTidPidLink); |
| ASSERT_EQ(links_pid2->second.size(), 1u); |
| ASSERT_EQ(links_pid2->second[0].lock(), tid20); |
| |
| // Message nodes and their links to tid nodes. |
| // We use here that tid is the first dependency added to a message. |
| ASSERT_EQ(tid10, message_node100->get_dependency_by_type(kMessageTidLink)); |
| ASSERT_EQ(tid10, message_node101->get_dependency_by_type(kMessageTidLink)); |
| ASSERT_EQ(tid11, message_node110->get_dependency_by_type(kMessageTidLink)); |
| ASSERT_EQ(tid20, message_node200->get_dependency_by_type(kMessageTidLink)); |
| |
| // And the reverse links from tid nodes to messages. |
| auto links_tid10 = tid10->get_reverse_dependencies_by_type(kMessageTidLink); |
| ASSERT_EQ(links_tid10->second.size(), 2u); |
| ASSERT_TRUE(links_tid10->second[0].lock() == message_node100 || |
| links_tid10->second[0].lock() == message_node101); |
| ASSERT_TRUE(links_tid10->second[1].lock() == message_node100 || |
| links_tid10->second[1].lock() == message_node101); |
| |
| auto links_tid11 = tid11->get_reverse_dependencies_by_type(kMessageTidLink); |
| ASSERT_EQ(links_tid11->second.size(), 1u); |
| ASSERT_EQ(links_tid11->second[0].lock(), message_node110); |
| |
| auto links_tid20 = tid20->get_reverse_dependencies_by_type(kMessageTidLink); |
| ASSERT_EQ(links_tid20->second.size(), 1u); |
| ASSERT_EQ(links_tid20->second[0].lock(), message_node200); |
| } |
| |
| TEST(MessageGraph, ActualGraphConstruction) { |
| std::string message100 = "100"; |
| std::string message101 = "101"; |
| std::string message110 = "110"; |
| std::string message200 = "200"; |
| std::string process1 = "process1"; |
| std::string process2 = "process2"; |
| std::string pid = "pid"; |
| std::string tid = "tid"; |
| std::string message = "message"; |
| ActualMessageGraph messages_graph; |
| |
| auto message_node100 = messages_graph.InsertMessage(process1, 1, 10, message100); |
| auto message_node101 = messages_graph.InsertMessage(process1, 1, 10, message101); |
| auto message_node110 = messages_graph.InsertMessage(process1, 1, 11, message110); |
| auto message_node200 = messages_graph.InsertMessage(process2, 2, 20, message200); |
| |
| // Pid nodes are present. |
| auto pid1 = messages_graph.get_pid_node(1); |
| auto pid2 = messages_graph.get_pid_node(2); |
| |
| constexpr DependencyType kTidPidLink = DependencyType(kTidNode, kPidNode); |
| constexpr DependencyType kMessageTidLink = DependencyType(kMessageNode, kTidNode); |
| |
| // Tid nodes and their link to pid nodes as well. |
| // We use here that pid is the first dependency added to a tid. |
| auto tid10 = messages_graph.get_tid_node(10); |
| auto pid_of_tid10 = tid10->get_dependency_by_type(kTidPidLink); |
| ASSERT_EQ(pid_of_tid10, pid1); |
| |
| auto tid11 = messages_graph.get_tid_node(11); |
| auto pid_of_tid11 = tid11->get_dependency_by_type(kTidPidLink); |
| ASSERT_EQ(pid_of_tid11, pid1); |
| |
| auto tid20 = messages_graph.get_tid_node(20); |
| auto pid_of_tid20 = tid20->get_dependency_by_type(kTidPidLink); |
| ASSERT_EQ(pid_of_tid20, pid2); |
| |
| // And the reverse links from pid nodes to tid nodes. |
| auto links_pid1 = pid1->get_reverse_dependencies_by_type(kTidPidLink); |
| ASSERT_EQ(links_pid1->second.size(), 2u); |
| ASSERT_TRUE(links_pid1->second[0].lock() == tid10 || links_pid1->second[0].lock() == tid11); |
| ASSERT_TRUE(links_pid1->second[1].lock() == tid10 || links_pid1->second[1].lock() == tid11); |
| |
| auto links_pid2 = pid2->get_reverse_dependencies_by_type(kTidPidLink); |
| ASSERT_EQ(links_pid2->second.size(), 1u); |
| ASSERT_EQ(links_pid2->second[0].lock(), tid20); |
| |
| // Message nodes and their links to tid nodes. |
| // We use here that tid is the first dependency added to a message. |
| ASSERT_EQ(tid10, message_node100->get_dependency_by_type(kMessageTidLink)); |
| ASSERT_EQ(tid10, message_node101->get_dependency_by_type(kMessageTidLink)); |
| ASSERT_EQ(tid11, message_node110->get_dependency_by_type(kMessageTidLink)); |
| ASSERT_EQ(tid20, message_node200->get_dependency_by_type(kMessageTidLink)); |
| |
| // And the reverse links from tid nodes to messages. |
| auto links_tid10 = tid10->get_reverse_dependencies_by_type(kMessageTidLink); |
| ASSERT_EQ(links_tid10->second.size(), 2u); |
| ASSERT_TRUE(links_tid10->second[0].lock() == message_node100 || |
| links_tid10->second[0].lock() == message_node101); |
| ASSERT_TRUE(links_tid10->second[1].lock() == message_node100 || |
| links_tid10->second[1].lock() == message_node101); |
| |
| auto links_tid11 = tid11->get_reverse_dependencies_by_type(kMessageTidLink); |
| ASSERT_EQ(links_tid11->second.size(), 1u); |
| ASSERT_EQ(links_tid11->second[0].lock(), message_node110); |
| |
| auto links_tid20 = tid20->get_reverse_dependencies_by_type(kMessageTidLink); |
| ASSERT_EQ(links_tid20->second.size(), 1u); |
| ASSERT_EQ(links_tid20->second[0].lock(), message_node200); |
| } |
| |
| TEST(MessageGraph, ReplacesHandlesWithTokens) { |
| std::string message = "handle: 1, out handle = 4, in handle = 1\n"; |
| std::vector<uint32_t> handle_tokens = |
| GoldenMessageGraphTest::ReplacesHandlesWithTokensTest(&message); |
| ASSERT_EQ(message, "handle: 0, out handle = 1, in handle = 2\n"); |
| ASSERT_EQ(handle_tokens[0], 1); |
| ASSERT_EQ(handle_tokens[1], 4); |
| ASSERT_EQ(handle_tokens[2], 1); |
| } |
| |
| } // namespace fidlcat |
| |
| #endif // TOOLS_FIDLCAT_LIB_MESSAGES_GRAPH_TEST_H_ |