blob: c5c54a1c3fc1898412b259e21b4d302d47223893 [file] [log] [blame]
#include "./rpc_fuzzing/rpc_potential_dfg.h"
#include <vector>
#include "google/protobuf/descriptor.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "./rpc_fuzzing/proto_field_path.h"
#include "./rpc_fuzzing/testdata/mini_blogger.pb.h"
#include "./rpc_fuzzing/testdata/mini_blogger.grpc.pb.h"
namespace fuzztest::internal {
namespace {
using ::testing::FieldsAre;
using ::testing::UnorderedElementsAre;
class RpcPotentialDfgTest : public ::testing::Test {
protected:
void SetUp() override {
const google::protobuf::DescriptorPool* pool =
google::protobuf::DescriptorPool::generated_pool();
mini_blogger_serivce_ =
pool->FindServiceByName("fuzztest.internal.MiniBlogger");
ASSERT_TRUE(mini_blogger_serivce_ != nullptr);
log_out_user_method_ =
mini_blogger_serivce_->FindMethodByName("LogOutUser");
ASSERT_TRUE(log_out_user_method_ != nullptr);
log_in_user_method_ = mini_blogger_serivce_->FindMethodByName("LogInUser");
ASSERT_TRUE(log_in_user_method_ != nullptr);
register_user_method_ =
mini_blogger_serivce_->FindMethodByName("RegisterUser");
ASSERT_TRUE(register_user_method_ != nullptr);
get_user_posts_method_ =
mini_blogger_serivce_->FindMethodByName("GetUserPosts");
ASSERT_TRUE(get_user_posts_method_ != nullptr);
}
const google::protobuf::ServiceDescriptor* mini_blogger_serivce_;
const google::protobuf::MethodDescriptor* log_out_user_method_;
const google::protobuf::MethodDescriptor* log_in_user_method_;
const google::protobuf::MethodDescriptor* register_user_method_;
const google::protobuf::MethodDescriptor* get_user_posts_method_;
};
TEST_F(RpcPotentialDfgTest,
NodesNotDependingOnOthersHaveNoPotentialDependencies) {
RpcPotentialDataFlowGraph dfg = CreatePotentialDfg<MiniBlogger>();
const RpcPotentialDfgNode& register_user_node =
dfg.GetNode(*register_user_method_);
// RegisterUser doesn't depend on others.
EXPECT_FALSE(register_user_node.HasDependency());
const RpcPotentialDfgNode& log_in_user_node =
dfg.GetNode(*log_in_user_method_);
// LogInUser doesn't depend on others.
EXPECT_FALSE(log_in_user_node.HasDependency());
}
TEST_F(RpcPotentialDfgTest, DependneciesSetUpBasedOnNameAndType) {
RpcPotentialDataFlowGraph dfg = CreatePotentialDfg<MiniBlogger>();
const RpcPotentialDfgNode& get_user_posts_node =
dfg.GetNode(*get_user_posts_method_);
// GetUserPostsRequest.session_id depends on LogInUserResponse.session_id.
EXPECT_EQ(get_user_posts_node.GetAllDependencies().size(), 1);
FieldPath get_user_posts_request_field =
GetFieldPath<GetUserPostsRequest>("session_id");
std::vector<RpcPotentialDfgNode::PotentialDependencySource> all_dep_sources =
get_user_posts_node.GetDependencies(get_user_posts_request_field);
// Depends on the session_id of the response in `LogInUser`.
EXPECT_THAT(
all_dep_sources,
UnorderedElementsAre(FieldsAre(
log_in_user_method_, GetFieldPath<LogInUserResponse>("session_id"))));
}
TEST_F(RpcPotentialDfgTest, DependneciesSetUpOnInnerFields) {
RpcPotentialDataFlowGraph dfg = CreatePotentialDfg<MiniBlogger>();
const RpcPotentialDfgNode& log_out_user_node =
dfg.GetNode(*log_out_user_method_);
// LogOutUserRequest.log_out_info.session_info.session_id and
// LogOutUserRequest.log_out_info.session_id depends on
// LogInUserResponse.session_id.
EXPECT_EQ(log_out_user_node.GetAllDependencies().size(), 2);
FieldPath log_out_user_request_field =
GetFieldPath<LogOutUserRequest>("log_out_info.session_info.session_id");
std::vector<RpcPotentialDfgNode::PotentialDependencySource> all_dep_sources =
log_out_user_node.GetDependencies(log_out_user_request_field);
EXPECT_EQ(all_dep_sources.size(), 1);
// Depends on the session_id of the response in `LogInUser`.
EXPECT_THAT(
all_dep_sources,
UnorderedElementsAre(FieldsAre(
log_in_user_method_, GetFieldPath<LogInUserResponse>("session_id"))));
}
} // namespace
} // namespace fuzztest::internal