/* * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2.0, * as published by the Free Software Foundation. * * This program is also distributed with certain software (including * but not limited to OpenSSL) that is licensed under separate terms, * as designated in a particular file or component or in included license * documentation. The authors of MySQL hereby grant you an additional * permission to link the program and your derivative works with the * separately licensed software that they have included with MySQL. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License, version 2.0, for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include "plugin/x/src/admin_cmd_arguments.h" #include "plugin/x/src/xpl_error.h" #include "unittest/gunit/xplugin/xpl/assert_error_code.h" #include "unittest/gunit/xplugin/xpl/mysqlx_pb_wrapper.h" namespace xpl { namespace test { class Admin_command_arguments_object_test : public ::testing::Test { public: using Argument_appearance = Admin_command_handler::Command_arguments::Appearance_type; Admin_command_arguments_object_test() : extractor(new Admin_command_arguments_object(args)) {} void set_arguments(const Any &value) { args.Add()->CopyFrom(value); extractor.reset(new Admin_command_arguments_object(args)); } Admin_command_arguments_object::List args; std::unique_ptr extractor; }; TEST_F(Admin_command_arguments_object_test, is_end_empty_args) { ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, is_end_empty_obj) { set_arguments(Any::Object{}); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, is_end_one_val) { set_arguments(Any::Object{{"first", Scalar(42)}}); ASSERT_FALSE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, end_empty_args) { ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor->end()); } TEST_F(Admin_command_arguments_object_test, end_no_obj) { set_arguments(Scalar(42)); ASSERT_ERROR_CODE(ER_X_CMD_ARGUMENT_TYPE, extractor->end()); } TEST_F(Admin_command_arguments_object_test, end_empty_obj) { set_arguments(Any::Object{}); ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor->end()); } TEST_F(Admin_command_arguments_object_test, string_arg) { set_arguments(Any::Object{{"first", "bunny"}}); std::string value("none"); ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor ->string_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("bunny", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_arg_no_obj) { std::string value("none"); ASSERT_ERROR_CODE( ER_X_CMD_NUM_ARGUMENTS, extractor ->string_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_arg_empty_arg) { set_arguments(Any::Object{}); std::string value("none"); ASSERT_ERROR_CODE( ER_X_CMD_NUM_ARGUMENTS, extractor ->string_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_arg_no_arg) { set_arguments(Any::Object{{"first", "bunny"}}); std::string value("none"); ASSERT_ERROR_CODE( ER_X_CMD_NUM_ARGUMENTS, extractor ->string_arg({"second"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_arg_twice) { set_arguments(Any::Object{{"first", "bunny"}, {"second", "carrot"}}); std::string value1("none"), value2("none"); ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor ->string_arg({"second"}, &value1, Argument_appearance::k_obligatory) .string_arg({"first"}, &value2, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("carrot", value1); ASSERT_EQ("bunny", value2); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_arg_twice_no_arg) { set_arguments(Any::Object{{"first", "bunny"}}); std::string value1("none"), value2("none"); ASSERT_ERROR_CODE( ER_X_CMD_NUM_ARGUMENTS, extractor ->string_arg({"first"}, &value1, Argument_appearance::k_obligatory) .string_arg({"second"}, &value2, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("bunny", value1); ASSERT_EQ("none", value2); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_arg_diff_type) { set_arguments(Any::Object{{"first", 42}}); std::string value("none"); ASSERT_ERROR_CODE( ER_X_CMD_ARGUMENT_VALUE, extractor ->string_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_arg_second_name) { set_arguments(Any::Object{{"first", "bunny"}}); std::string value("none"); ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->string_arg({"second", "first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("bunny", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, sint_arg) { set_arguments(Any::Object{{"first", 42}}); int64_t value = -666; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor->sint_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(42, value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, sint_arg_bad_val) { set_arguments(Any::Object{{"first", "42!"}}); int64_t value = -666; ASSERT_ERROR_CODE( ER_X_CMD_ARGUMENT_VALUE, extractor->sint_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(-666, value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, sint_arg_negative) { set_arguments(Any::Object{{"first", -42}}); int64_t value = -666; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor->sint_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(-42, value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, uint_arg) { set_arguments(Any::Object{{"first", 42u}}); uint64_t value = 666; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor->uint_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(42, value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, uint_arg_negative) { set_arguments(Any::Object{{"first", -42}}); uint64_t value = 666; ASSERT_ERROR_CODE( ER_X_CMD_ARGUMENT_VALUE, extractor->uint_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(666, value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, bool_arg_true) { set_arguments(Any::Object{{"first", true}}); bool value = false; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor->bool_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_TRUE(value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, bool_arg_false) { set_arguments(Any::Object{{"first", false}}); bool value = true; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor->bool_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_FALSE(value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, optional) { set_arguments(Any::Object{{"first", "bunny"}}); std::string value("none"); ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor->string_arg({"first"}, &value, Argument_appearance::k_optional) .end()); ASSERT_EQ("bunny", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, optional_second_name) { set_arguments(Any::Object{{"first", "bunny"}}); std::string value("none"); ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->string_arg({"second", "first"}, &value, Argument_appearance::k_optional) .end()); ASSERT_EQ("bunny", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, optional_empty_args) { set_arguments(Any::Object{}); std::string value("none"); ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor->string_arg({"first"}, &value, Argument_appearance::k_optional) .end()); ASSERT_EQ("none", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, optional_no_obj) { std::string value("none"); ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor->string_arg({"first"}, &value, Argument_appearance::k_optional) .end()); ASSERT_EQ("none", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, optional_second) { set_arguments(Any::Object{{"first", "bunny"}}); std::string value1("none"); uint64_t value2 = 666; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor ->string_arg({"first"}, &value1, Argument_appearance::k_obligatory) .uint_arg({"second"}, &value2, Argument_appearance::k_optional) .end()); ASSERT_EQ("bunny", value1); ASSERT_EQ(666, value2); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, optional_inside) { set_arguments(Any::Object{{"first", "bunny"}, {"third", 42u}}); std::string value1("none"), value2("none"); uint64_t value3 = 666; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor ->string_arg({"first"}, &value1, Argument_appearance::k_obligatory) .string_arg({"second"}, &value2, Argument_appearance::k_optional) .uint_arg({"third"}, &value3, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("bunny", value1); ASSERT_EQ("none", value2); ASSERT_EQ(42, value3); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, optional_inside_second_name) { set_arguments(Any::Object{{"first", "bunny"}, {"third", 42u}}); std::string value1("none"), value2("none"); uint64_t value3 = 666; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor ->string_arg({"first"}, &value1, Argument_appearance::k_obligatory) .string_arg({"fourth", "second"}, &value2, Argument_appearance::k_optional) .uint_arg({"third"}, &value3, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("bunny", value1); ASSERT_EQ("none", value2); ASSERT_EQ(42, value3); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, end_to_many_args) { set_arguments(Any::Object{{"first", "bunny"}, {"third", 42u}}); std::string value("none"); ASSERT_ERROR_CODE( ER_X_CMD_NUM_ARGUMENTS, extractor ->string_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("bunny", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, end_to_many_args_optional) { set_arguments(Any::Object{{"first", "bunny"}, {"third", 42u}}); std::string value("none"); ASSERT_ERROR_CODE( ER_X_CMD_NUM_ARGUMENTS, extractor->string_arg({"second"}, &value, Argument_appearance::k_optional) .end()); ASSERT_EQ("none", value); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_list_one_value) { set_arguments(Any::Object{{"first", "bunny"}}); std::vector values; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor ->string_list({"first"}, &values, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(std::vector{"bunny"}, values); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_list_array_one) { set_arguments(Any::Object{{"first", Any::Array{"bunny"}}}); std::vector values; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor ->string_list({"first"}, &values, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(std::vector{"bunny"}, values); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_list_array) { set_arguments(Any::Object{{"first", Any::Array{"bunny", "carrot"}}}); std::vector values; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor ->string_list({"first"}, &values, Argument_appearance::k_obligatory) .end()); std::vector expect{"bunny", "carrot"}; ASSERT_EQ(expect, values); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_list_array_mix) { set_arguments( Any::Object{{"first", Any::Array{"bunny", "carrot"}}, {"second", 42u}}); std::vector values1; uint64_t value2 = 666; ASSERT_ERROR_CODE( ER_X_SUCCESS, extractor ->string_list({"first"}, &values1, Argument_appearance::k_obligatory) .uint_arg({"second"}, &value2, Argument_appearance::k_obligatory) .end()); std::vector expect{"bunny", "carrot"}; ASSERT_EQ(expect, values1); ASSERT_EQ(42u, value2); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_list_empty) { set_arguments(Any::Object{{"first", Any::Array{}}}); std::vector values; ASSERT_ERROR_CODE( ER_X_CMD_ARGUMENT_VALUE, extractor ->string_list({"first"}, &values, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(std::vector(), values); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, string_list_bad_arg) { set_arguments(Any::Object{{"first", Any::Array{"bunny", 42u}}}); std::vector values; ASSERT_ERROR_CODE( ER_X_CMD_ARGUMENT_VALUE, extractor ->string_list({"first"}, &values, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(std::vector(), values); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, object_list_one_value) { set_arguments(Any::Object{{"first", Any::Object{{"second", 42u}}}}); std::vector values; ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->object_list({"first"}, &values, Argument_appearance::k_obligatory, 0) .end()); ASSERT_EQ(1u, values.size()); ASSERT_TRUE(extractor->is_end()); uint64_t value2 = 666; ASSERT_ERROR_CODE( ER_X_SUCCESS, values[0] ->uint_arg({"second"}, &value2, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(42u, value2); ASSERT_TRUE(values[0]->is_end()); } TEST_F(Admin_command_arguments_object_test, object_list_array_one) { set_arguments( Any::Object{{"first", Any::Array{Any::Object{{"second", 42u}}}}}); std::vector values; ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->object_list({"first"}, &values, Argument_appearance::k_obligatory, 0) .end()); ASSERT_EQ(1u, values.size()); ASSERT_TRUE(extractor->is_end()); uint64_t value2 = 666; ASSERT_ERROR_CODE( ER_X_SUCCESS, values[0] ->uint_arg({"second"}, &value2, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(42u, value2); ASSERT_TRUE(values[0]->is_end()); } TEST_F(Admin_command_arguments_object_test, object_list_array) { set_arguments( Any::Object{{"first", Any::Array{Any::Object{{"second", 42u}}, Any::Object{{"third", -44}}}}}); std::vector values; ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->object_list({"first"}, &values, Argument_appearance::k_obligatory, 0) .end()); ASSERT_EQ(2u, values.size()); ASSERT_TRUE(extractor->is_end()); uint64_t value1 = 666; ASSERT_ERROR_CODE( ER_X_SUCCESS, values[0] ->uint_arg({"second"}, &value1, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(42u, value1); ASSERT_TRUE(values[0]->is_end()); int64_t value2 = 666; ASSERT_ERROR_CODE( ER_X_SUCCESS, values[1] ->sint_arg({"third"}, &value2, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(-44, value2); ASSERT_TRUE(values[1]->is_end()); } TEST_F(Admin_command_arguments_object_test, object_list_empty) { set_arguments(Any::Object{{"first", Any::Array{}}}); std::vector values; ASSERT_ERROR_CODE(ER_X_CMD_ARGUMENT_VALUE, extractor ->object_list({"first"}, &values, Argument_appearance::k_obligatory, 0) .end()); ASSERT_EQ(0u, values.size()); ASSERT_TRUE(extractor->is_end()); } TEST_F(Admin_command_arguments_object_test, object_list_array_bad_arg) { set_arguments(Any::Object{ {"first", Any::Array{Any::Object{{"second", 42u}}, "bunny"}}}); std::vector values; ASSERT_ERROR_CODE(ER_X_CMD_ARGUMENT_VALUE, extractor ->object_list({"first"}, &values, Argument_appearance::k_obligatory, 0) .end()); ASSERT_EQ(0u, values.size()); ASSERT_TRUE(extractor->is_end()); } struct Param_docpath_arg { int expect_error; std::string path; }; class Admin_command_arguments_docpath_test : public Admin_command_arguments_object_test, public testing::WithParamInterface {}; TEST_P(Admin_command_arguments_docpath_test, docpath_arg) { const Param_docpath_arg ¶m = GetParam(); set_arguments(Any::Object{{"first", param.path.c_str()}}); std::string value("none"); ASSERT_ERROR_CODE( param.expect_error, extractor ->docpath_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ(param.expect_error == ER_X_SUCCESS ? param.path : "none", value); ASSERT_TRUE(extractor->is_end()); } Param_docpath_arg docpath_arg_param[] = { {ER_X_SUCCESS, "$"}, {ER_X_SUCCESS, "$.path"}, {ER_X_SUCCESS, "$.path.to.member"}, {ER_X_CMD_ARGUMENT_VALUE, "$."}, {ER_X_CMD_ARGUMENT_VALUE, ".path"}, {ER_X_CMD_ARGUMENT_VALUE, "path"}, {ER_X_CMD_ARGUMENT_VALUE, "$.1"}, {ER_X_CMD_ARGUMENT_VALUE, "$.1path"}, {ER_X_SUCCESS, "$.p1ath"}, {ER_X_SUCCESS, "$.path1"}, {ER_X_SUCCESS, "$.$"}, {ER_X_SUCCESS, "$.$$"}, {ER_X_SUCCESS, "$.$$$"}, {ER_X_SUCCESS, "$.$.path"}, {ER_X_SUCCESS, "$.path.$"}, {ER_X_SUCCESS, "$.$path"}, {ER_X_SUCCESS, "$.pa$th"}, {ER_X_SUCCESS, "$.path$"}, {ER_X_SUCCESS, "$.$pa$th$"}, {ER_X_SUCCESS, "$._"}, {ER_X_SUCCESS, "$.__"}, {ER_X_SUCCESS, "$.___"}, {ER_X_SUCCESS, "$._.path"}, {ER_X_SUCCESS, "$.path._"}, {ER_X_SUCCESS, "$._path"}, {ER_X_SUCCESS, "$.pa_th"}, {ER_X_SUCCESS, "$.path_"}, {ER_X_SUCCESS, "$._pa_th_"}, {ER_X_SUCCESS, "$.*"}, {ER_X_CMD_ARGUMENT_VALUE, "$.**"}, {ER_X_CMD_ARGUMENT_VALUE, "$.***"}, {ER_X_SUCCESS, "$.*.path"}, {ER_X_SUCCESS, "$.path.*"}, {ER_X_CMD_ARGUMENT_VALUE, "$.*path"}, {ER_X_CMD_ARGUMENT_VALUE, "$.pa*th"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path*"}, {ER_X_CMD_ARGUMENT_VALUE, "$.*pa*th*"}, {ER_X_SUCCESS, "$.path[1]"}, {ER_X_SUCCESS, "$.path[123]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path[-1]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path[a]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path[]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path["}, {ER_X_CMD_ARGUMENT_VALUE, "$.path]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.[path]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.[1]"}, {ER_X_SUCCESS, "$.path[1].path[2]"}, {ER_X_SUCCESS, "$.path[1].path"}, {ER_X_SUCCESS, "$.path[1].*"}, {ER_X_SUCCESS, "$.*.path[1]"}, {ER_X_SUCCESS, "$.path[*]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path[**]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path[*1]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path[1*]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path[1*1]"}, {ER_X_SUCCESS, "$[1]"}, {ER_X_SUCCESS, "$[1][2]"}, {ER_X_SUCCESS, "$[1].path[2]"}, {ER_X_SUCCESS, "$[1][2].path"}, {ER_X_SUCCESS, "$.path[1][2]"}, {ER_X_CMD_ARGUMENT_VALUE, "$.pa th"}, {ER_X_SUCCESS, "$.\"pa th\""}, {ER_X_CMD_ARGUMENT_VALUE, "$.pa\th"}, {ER_X_SUCCESS, "$.\"pa\tth\""}, {ER_X_CMD_ARGUMENT_VALUE, "$.\""}, {ER_X_SUCCESS, "$.\"\"\""}, {ER_X_CMD_ARGUMENT_VALUE, "$.\"path"}, {ER_X_SUCCESS, "$.\"\"path\""}, {ER_X_CMD_ARGUMENT_VALUE, "$.path\""}, {ER_X_SUCCESS, "$.\"path\"\""}, {ER_X_CMD_ARGUMENT_VALUE, "$.#"}, {ER_X_SUCCESS, "$.\"#\""}, {ER_X_CMD_ARGUMENT_VALUE, "$.path#"}, {ER_X_SUCCESS, "$.\"path#\""}, {ER_X_CMD_ARGUMENT_VALUE, "$.#path"}, {ER_X_SUCCESS, "$.\"#path\""}, {ER_X_SUCCESS, "$.\"#\"[1]"}, {ER_X_SUCCESS, "$.\"\""}, {ER_X_SUCCESS, "$.część"}, {ER_X_SUCCESS, "$.łódź"}, {ER_X_SUCCESS, "$**.path"}, {ER_X_SUCCESS, "$**[1]"}, {ER_X_SUCCESS, "$.path**.path"}, {ER_X_SUCCESS, "$.path**[1]"}, {ER_X_SUCCESS, "$[1]**.path"}, {ER_X_SUCCESS, "$[1]**[1]"}, {ER_X_CMD_ARGUMENT_VALUE, "$**"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path**"}, {ER_X_CMD_ARGUMENT_VALUE, "$[1]**"}, {ER_X_CMD_ARGUMENT_VALUE, "$***"}, {ER_X_CMD_ARGUMENT_VALUE, "$.path***"}, {ER_X_CMD_ARGUMENT_VALUE, "$[1]***"}, {ER_X_CMD_ARGUMENT_VALUE, "$.**.path"}, {ER_X_SUCCESS, "$.***.path"}, {ER_X_SUCCESS, "$.\"**\""}, {ER_X_SUCCESS, "$.\"***\""}, {ER_X_SUCCESS, "$.\"pa.th\""}, {ER_X_CMD_ARGUMENT_VALUE, "$*"}, }; INSTANTIATE_TEST_CASE_P(docpath_arg, Admin_command_arguments_docpath_test, testing::ValuesIn(docpath_arg_param)); #define INVALID_VALUE_ERROR(arg_name) \ ngs::Error_code(ER_X_CMD_ARGUMENT_VALUE, \ "Invalid value for argument '" arg_name "'") #define INVALID_NUMBER_ERROR(arg_name) \ ngs::Error_code(ER_X_CMD_NUM_ARGUMENTS, \ "Invalid number of arguments, " \ "expected value for '" arg_name "'") TEST_F(Admin_command_arguments_object_test, string_arg_error_msg_invalid_type) { set_arguments(Any::Object{{"first", 42}}); std::string value("none"); ASSERT_ERROR( INVALID_VALUE_ERROR("first"), extractor ->string_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); } TEST_F(Admin_command_arguments_object_test, string_arg_error_msg_invalid_number) { set_arguments(Any::Object{{"second", "bunny"}}); std::string value("none"); ASSERT_ERROR( INVALID_NUMBER_ERROR("first"), extractor ->string_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); } TEST_F(Admin_command_arguments_object_test, docpath_arg_error_msg_invalid_value) { set_arguments(Any::Object{{"first", "bunny"}}); std::string value("none"); ASSERT_ERROR( INVALID_VALUE_ERROR("first"), extractor ->docpath_arg({"first"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); } TEST_F(Admin_command_arguments_object_test, string_list_error_msg_invalid_type_object) { set_arguments(Any::Object{{"first", Any::Object{{"bunny", "carrot"}}}}); std::vector values; ASSERT_ERROR( INVALID_VALUE_ERROR("first"), extractor ->string_list({"first"}, &values, Argument_appearance::k_obligatory) .end()); ASSERT_TRUE(values.empty()); } TEST_F(Admin_command_arguments_object_test, string_list_error_msg_invalid_type_number) { set_arguments(Any::Object{{"first", Any::Array{42u}}}); std::vector values; ASSERT_ERROR( INVALID_VALUE_ERROR("first[0]"), extractor ->string_list({"first"}, &values, Argument_appearance::k_obligatory) .end()); ASSERT_TRUE(values.empty()); } TEST_F(Admin_command_arguments_object_test, string_list_error_msg_invalid_type_number_2nd) { set_arguments(Any::Object{{"first", Any::Array{"bunny", 42u}}}); std::vector values; ASSERT_ERROR( INVALID_VALUE_ERROR("first[1]"), extractor ->string_list({"first"}, &values, Argument_appearance::k_obligatory) .end()); ASSERT_TRUE(values.empty()); } TEST_F(Admin_command_arguments_object_test, object_arg_error_msg_invalid_value) { set_arguments(Any::Object{{"first", "bunny"}}); std::vector values; ASSERT_ERROR(INVALID_VALUE_ERROR("first"), extractor ->object_list({"first"}, &values, Argument_appearance::k_obligatory, 0) .end()); ASSERT_TRUE(values.empty()); } TEST_F(Admin_command_arguments_object_test, object_arg_string_arg_error_msg_invalid_value) { set_arguments(Any::Object{{"first", Any::Object{{"second", 42u}}}}); std::vector values; ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->object_list({"first"}, &values, Argument_appearance::k_obligatory, 0) .end()); ASSERT_FALSE(values.empty()); std::string value("none"); ASSERT_ERROR( INVALID_VALUE_ERROR("first.second"), values[0] ->string_arg({"second"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); } TEST_F(Admin_command_arguments_object_test, object_arg_object_arg_string_arg_error_msg_invalid_value) { set_arguments(Any::Object{ {"first", Any::Object{{"second", Any::Object{{"third", 42u}}}}}}); std::vector values1; ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->object_list({"first"}, &values1, Argument_appearance::k_obligatory, 0) .end()); ASSERT_FALSE(values1.empty()); std::vector values2; ASSERT_ERROR_CODE(ER_X_SUCCESS, values1[0] ->object_list({"second"}, &values2, Argument_appearance::k_obligatory, 0) .end()); ASSERT_FALSE(values2.empty()); std::string value("none"); ASSERT_ERROR( INVALID_VALUE_ERROR("first.second.third"), values2[0] ->string_arg({"third"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); } TEST_F(Admin_command_arguments_object_test, object_arg_string_arg_error_msg_invalid_number) { set_arguments(Any::Object{{"first", Any::Object{{"second", "bunny"}}}}); std::vector values; ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->object_list({"first"}, &values, Argument_appearance::k_obligatory, 0) .end()); ASSERT_FALSE(values.empty()); std::string value("none"); ASSERT_ERROR( INVALID_NUMBER_ERROR("first.third"), values[0] ->string_arg({"third"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); } TEST_F(Admin_command_arguments_object_test, object_list_string_arg_error_msg_invalid_value) { set_arguments( Any::Object{{"first", Any::Array{Any::Object{{"second", 42u}}}}}); std::vector values; ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->object_list({"first"}, &values, Argument_appearance::k_obligatory, 0) .end()); ASSERT_FALSE(values.empty()); std::string value("none"); ASSERT_ERROR( INVALID_VALUE_ERROR("first[0].second"), values[0] ->string_arg({"second"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); } TEST_F(Admin_command_arguments_object_test, object_list_object_arg_string_arg_error_msg_invalid_value) { set_arguments(Any::Object{ {"first", Any::Array{Any::Object{{"second", Any::Object{{"third", 42u}}}}}}}); std::vector values1; ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->object_list({"first"}, &values1, Argument_appearance::k_obligatory, 0) .end()); ASSERT_FALSE(values1.empty()); std::vector values2; ASSERT_ERROR_CODE(ER_X_SUCCESS, values1[0] ->object_list({"second"}, &values2, Argument_appearance::k_obligatory, 0) .end()); ASSERT_FALSE(values2.empty()); std::string value("none"); ASSERT_ERROR( INVALID_VALUE_ERROR("first[0].second.third"), values2[0] ->string_arg({"third"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); } TEST_F(Admin_command_arguments_object_test, object_list_object_list_string_arg_error_msg_invalid_value) { set_arguments(Any::Object{ {"first", Any::Array{Any::Object{ {"second", Any::Array{Any::Object{{"third", 42u}}}}}}}}); std::vector values1; ASSERT_ERROR_CODE(ER_X_SUCCESS, extractor ->object_list({"first"}, &values1, Argument_appearance::k_obligatory, 0) .end()); ASSERT_FALSE(values1.empty()); std::vector values2; ASSERT_ERROR_CODE(ER_X_SUCCESS, values1[0] ->object_list({"second"}, &values2, Argument_appearance::k_obligatory, 0) .end()); ASSERT_FALSE(values2.empty()); std::string value("none"); ASSERT_ERROR( INVALID_VALUE_ERROR("first[0].second[0].third"), values2[0] ->string_arg({"third"}, &value, Argument_appearance::k_obligatory) .end()); ASSERT_EQ("none", value); } } // namespace test } // namespace xpl