15e8c39c7d328ff0534d040c3219bd6519443128etturney// 25e8c39c7d328ff0534d040c3219bd6519443128etturney// Copyright (C) 2016 Google, Inc. 35e8c39c7d328ff0534d040c3219bd6519443128etturney// 45e8c39c7d328ff0534d040c3219bd6519443128etturney// Licensed under the Apache License, Version 2.0 (the "License"); 55e8c39c7d328ff0534d040c3219bd6519443128etturney// you may not use this file except in compliance with the License. 65e8c39c7d328ff0534d040c3219bd6519443128etturney// You may obtain a copy of the License at: 75e8c39c7d328ff0534d040c3219bd6519443128etturney// 85e8c39c7d328ff0534d040c3219bd6519443128etturney// http://www.apache.org/licenses/LICENSE-2.0 95e8c39c7d328ff0534d040c3219bd6519443128etturney// 105e8c39c7d328ff0534d040c3219bd6519443128etturney// Unless required by applicable law or agreed to in writing, software 115e8c39c7d328ff0534d040c3219bd6519443128etturney// distributed under the License is distributed on an "AS IS" BASIS, 125e8c39c7d328ff0534d040c3219bd6519443128etturney// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135e8c39c7d328ff0534d040c3219bd6519443128etturney// See the License for the specific language governing permissions and 145e8c39c7d328ff0534d040c3219bd6519443128etturney// limitations under the License. 155e8c39c7d328ff0534d040c3219bd6519443128etturney// 165e8c39c7d328ff0534d040c3219bd6519443128etturney 175e8c39c7d328ff0534d040c3219bd6519443128etturney#include <base.h> 185e8c39c7d328ff0534d040c3219bd6519443128etturney#include <base/logging.h> 195e8c39c7d328ff0534d040c3219bd6519443128etturney#include <rapidjson/document.h> 205e8c39c7d328ff0534d040c3219bd6519443128etturney#include <rapidjson/writer.h> 215e8c39c7d328ff0534d040c3219bd6519443128etturney#include <rapidjson/stringbuffer.h> 225e8c39c7d328ff0534d040c3219bd6519443128etturney#include "test_facade.h" 235e8c39c7d328ff0534d040c3219bd6519443128etturney#include <tuple> 245e8c39c7d328ff0534d040c3219bd6519443128etturney#include <utils/command_receiver.h> 255e8c39c7d328ff0534d040c3219bd6519443128etturney#include <utils/common_utils.h> 265e8c39c7d328ff0534d040c3219bd6519443128etturney 275e8c39c7d328ff0534d040c3219bd6519443128etturneystd::tuple<bool, int> TestFacade::TestBoolTrueReturn() { 285e8c39c7d328ff0534d040c3219bd6519443128etturney return std::make_tuple(true, sl4n_error_codes::kPassInt); 295e8c39c7d328ff0534d040c3219bd6519443128etturney} 305e8c39c7d328ff0534d040c3219bd6519443128etturney 315e8c39c7d328ff0534d040c3219bd6519443128etturneystd::tuple<bool, int> TestFacade::TestBoolFalseReturn() { 325e8c39c7d328ff0534d040c3219bd6519443128etturney return std::make_tuple(false, sl4n_error_codes::kPassInt); 335e8c39c7d328ff0534d040c3219bd6519443128etturney} 345e8c39c7d328ff0534d040c3219bd6519443128etturney 355e8c39c7d328ff0534d040c3219bd6519443128etturneystd::tuple<bool, int> TestFacade::TestErrorCodeFail() { 365e8c39c7d328ff0534d040c3219bd6519443128etturney return std::make_tuple(true, sl4n_error_codes::kFailInt); 375e8c39c7d328ff0534d040c3219bd6519443128etturney} 385e8c39c7d328ff0534d040c3219bd6519443128etturney 395e8c39c7d328ff0534d040c3219bd6519443128etturneystd::tuple<int, int> TestFacade::TestNullReturn() { 405e8c39c7d328ff0534d040c3219bd6519443128etturney return std::make_tuple(NULL, sl4n_error_codes::kPassInt); 415e8c39c7d328ff0534d040c3219bd6519443128etturney} 425e8c39c7d328ff0534d040c3219bd6519443128etturney 435e8c39c7d328ff0534d040c3219bd6519443128etturneystd::tuple<std::string, int> TestFacade::TestStringEmptyReturn() { 445e8c39c7d328ff0534d040c3219bd6519443128etturney return std::make_tuple("", sl4n_error_codes::kPassInt); 455e8c39c7d328ff0534d040c3219bd6519443128etturney} 465e8c39c7d328ff0534d040c3219bd6519443128etturney 475e8c39c7d328ff0534d040c3219bd6519443128etturneystd::tuple<std::string, int> TestFacade::TestStringMaxReturn( 485e8c39c7d328ff0534d040c3219bd6519443128etturney std::string max_string) { 495e8c39c7d328ff0534d040c3219bd6519443128etturney 505e8c39c7d328ff0534d040c3219bd6519443128etturney return std::make_tuple(max_string, sl4n_error_codes::kPassInt); 515e8c39c7d328ff0534d040c3219bd6519443128etturney} 525e8c39c7d328ff0534d040c3219bd6519443128etturney 535e8c39c7d328ff0534d040c3219bd6519443128etturneystd::tuple<bool, int> TestFacade::TestSpecificParamNaming( 545e8c39c7d328ff0534d040c3219bd6519443128etturney std::string test_string, int test_int) { 555e8c39c7d328ff0534d040c3219bd6519443128etturney 565e8c39c7d328ff0534d040c3219bd6519443128etturney return std::make_tuple(true, sl4n_error_codes::kPassInt); 575e8c39c7d328ff0534d040c3219bd6519443128etturney} 585e8c39c7d328ff0534d040c3219bd6519443128etturney 595e8c39c7d328ff0534d040c3219bd6519443128etturney////////////////// 605e8c39c7d328ff0534d040c3219bd6519443128etturney// wrappers 615e8c39c7d328ff0534d040c3219bd6519443128etturney////////////////// 625e8c39c7d328ff0534d040c3219bd6519443128etturney 635e8c39c7d328ff0534d040c3219bd6519443128etturneystatic TestFacade facade; // triggers registration with CommandReceiver 645e8c39c7d328ff0534d040c3219bd6519443128etturney 655e8c39c7d328ff0534d040c3219bd6519443128etturneyvoid test_bool_true_return_wrapper(rapidjson::Document &doc) { 665e8c39c7d328ff0534d040c3219bd6519443128etturney int expected_param_size = 0; 675e8c39c7d328ff0534d040c3219bd6519443128etturney if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) { 685e8c39c7d328ff0534d040c3219bd6519443128etturney return; 695e8c39c7d328ff0534d040c3219bd6519443128etturney } 705e8c39c7d328ff0534d040c3219bd6519443128etturney bool result; 715e8c39c7d328ff0534d040c3219bd6519443128etturney int error_code; 725e8c39c7d328ff0534d040c3219bd6519443128etturney std::tie(result, error_code) = facade.TestBoolTrueReturn(); 735e8c39c7d328ff0534d040c3219bd6519443128etturney if (error_code == sl4n_error_codes::kFailInt) { 745e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 755e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 765e8c39c7d328ff0534d040c3219bd6519443128etturney } else { 775e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, result, doc.GetAllocator()); 785e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator()); 795e8c39c7d328ff0534d040c3219bd6519443128etturney } 805e8c39c7d328ff0534d040c3219bd6519443128etturney} 815e8c39c7d328ff0534d040c3219bd6519443128etturney 825e8c39c7d328ff0534d040c3219bd6519443128etturneyvoid test_bool_false_return_wrapper(rapidjson::Document &doc) { 835e8c39c7d328ff0534d040c3219bd6519443128etturney int expected_param_size = 0; 845e8c39c7d328ff0534d040c3219bd6519443128etturney if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) { 855e8c39c7d328ff0534d040c3219bd6519443128etturney return; 865e8c39c7d328ff0534d040c3219bd6519443128etturney } 875e8c39c7d328ff0534d040c3219bd6519443128etturney int result; 885e8c39c7d328ff0534d040c3219bd6519443128etturney int error_code; 895e8c39c7d328ff0534d040c3219bd6519443128etturney std::tie(result, error_code) = facade.TestBoolFalseReturn(); 905e8c39c7d328ff0534d040c3219bd6519443128etturney if (error_code == sl4n_error_codes::kFailInt) { 915e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 925e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 935e8c39c7d328ff0534d040c3219bd6519443128etturney } else { 945e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, result, doc.GetAllocator()); 955e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator()); 965e8c39c7d328ff0534d040c3219bd6519443128etturney } 975e8c39c7d328ff0534d040c3219bd6519443128etturney} 985e8c39c7d328ff0534d040c3219bd6519443128etturney 995e8c39c7d328ff0534d040c3219bd6519443128etturneyvoid test_null_return_wrapper(rapidjson::Document &doc) { 1005e8c39c7d328ff0534d040c3219bd6519443128etturney int expected_param_size = 0; 1015e8c39c7d328ff0534d040c3219bd6519443128etturney if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) { 1025e8c39c7d328ff0534d040c3219bd6519443128etturney return; 1035e8c39c7d328ff0534d040c3219bd6519443128etturney } 1045e8c39c7d328ff0534d040c3219bd6519443128etturney int result; 1055e8c39c7d328ff0534d040c3219bd6519443128etturney int error_code; 1065e8c39c7d328ff0534d040c3219bd6519443128etturney std::tie(result, error_code) = facade.TestNullReturn(); 1075e8c39c7d328ff0534d040c3219bd6519443128etturney if (error_code == sl4n_error_codes::kFailInt) { 1085e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 1095e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 1105e8c39c7d328ff0534d040c3219bd6519443128etturney } else { 1115e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, result, doc.GetAllocator()); 1125e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator()); 1135e8c39c7d328ff0534d040c3219bd6519443128etturney } 1145e8c39c7d328ff0534d040c3219bd6519443128etturney} 1155e8c39c7d328ff0534d040c3219bd6519443128etturney 1165e8c39c7d328ff0534d040c3219bd6519443128etturneyvoid test_string_empty_return_wrapper(rapidjson::Document &doc) { 1175e8c39c7d328ff0534d040c3219bd6519443128etturney int expected_param_size = 0; 1185e8c39c7d328ff0534d040c3219bd6519443128etturney if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) { 1195e8c39c7d328ff0534d040c3219bd6519443128etturney return; 1205e8c39c7d328ff0534d040c3219bd6519443128etturney } 1215e8c39c7d328ff0534d040c3219bd6519443128etturney std::string result; 1225e8c39c7d328ff0534d040c3219bd6519443128etturney int error_code; 1235e8c39c7d328ff0534d040c3219bd6519443128etturney std::tie(result, error_code) = facade.TestStringEmptyReturn(); 1245e8c39c7d328ff0534d040c3219bd6519443128etturney if (error_code == sl4n_error_codes::kFailInt) { 1255e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 1265e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 1275e8c39c7d328ff0534d040c3219bd6519443128etturney } else { 1285e8c39c7d328ff0534d040c3219bd6519443128etturney rapidjson::Value tmp; 1295e8c39c7d328ff0534d040c3219bd6519443128etturney tmp.SetString(result.c_str(), doc.GetAllocator()); 1305e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, tmp, doc.GetAllocator()); 1315e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator()); 1325e8c39c7d328ff0534d040c3219bd6519443128etturney } 1335e8c39c7d328ff0534d040c3219bd6519443128etturney} 1345e8c39c7d328ff0534d040c3219bd6519443128etturney 1355e8c39c7d328ff0534d040c3219bd6519443128etturneyvoid test_string_max_return_wrapper(rapidjson::Document &doc) { 1365e8c39c7d328ff0534d040c3219bd6519443128etturney int expected_param_size = 1; 1375e8c39c7d328ff0534d040c3219bd6519443128etturney if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) { 1385e8c39c7d328ff0534d040c3219bd6519443128etturney return; 1395e8c39c7d328ff0534d040c3219bd6519443128etturney } 1405e8c39c7d328ff0534d040c3219bd6519443128etturney std::string max_string; 1415e8c39c7d328ff0534d040c3219bd6519443128etturney if (!doc[sl4n::kParamsStr][0].IsString()) { 1425e8c39c7d328ff0534d040c3219bd6519443128etturney LOG(ERROR) << sl4n::kTagStr << ": Expected String input for name"; 1435e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 1445e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 1455e8c39c7d328ff0534d040c3219bd6519443128etturney return; 1465e8c39c7d328ff0534d040c3219bd6519443128etturney } else { 1475e8c39c7d328ff0534d040c3219bd6519443128etturney max_string = doc[sl4n::kParamsStr][0].GetString(); 1485e8c39c7d328ff0534d040c3219bd6519443128etturney } 1495e8c39c7d328ff0534d040c3219bd6519443128etturney std::string result; 1505e8c39c7d328ff0534d040c3219bd6519443128etturney int error_code; 1515e8c39c7d328ff0534d040c3219bd6519443128etturney std::tie(result, error_code) = facade.TestStringMaxReturn(max_string); 1525e8c39c7d328ff0534d040c3219bd6519443128etturney if (error_code == sl4n_error_codes::kFailInt) { 1535e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 1545e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 1555e8c39c7d328ff0534d040c3219bd6519443128etturney } else { 1565e8c39c7d328ff0534d040c3219bd6519443128etturney rapidjson::Value tmp; 1575e8c39c7d328ff0534d040c3219bd6519443128etturney tmp.SetString(result.c_str(), doc.GetAllocator()); 1585e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, tmp, doc.GetAllocator()); 1595e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator()); 1605e8c39c7d328ff0534d040c3219bd6519443128etturney } 1615e8c39c7d328ff0534d040c3219bd6519443128etturney} 1625e8c39c7d328ff0534d040c3219bd6519443128etturney 1635e8c39c7d328ff0534d040c3219bd6519443128etturneyvoid test_specific_param_naming_wrapper(rapidjson::Document &doc) { 1645e8c39c7d328ff0534d040c3219bd6519443128etturney int expected_param_size = 1; 1655e8c39c7d328ff0534d040c3219bd6519443128etturney if (!CommonUtils::IsParamLengthMatching(doc, expected_param_size)) { 1665e8c39c7d328ff0534d040c3219bd6519443128etturney return; 1675e8c39c7d328ff0534d040c3219bd6519443128etturney } 1685e8c39c7d328ff0534d040c3219bd6519443128etturney std::string string_test; 1695e8c39c7d328ff0534d040c3219bd6519443128etturney int int_test; 1705e8c39c7d328ff0534d040c3219bd6519443128etturney std::string string_member = "string_test"; 1715e8c39c7d328ff0534d040c3219bd6519443128etturney std::string int_member = "int_test"; 1725e8c39c7d328ff0534d040c3219bd6519443128etturney if (!doc[sl4n::kParamsStr][0][0].HasMember(string_member.c_str())) { 1735e8c39c7d328ff0534d040c3219bd6519443128etturney LOG(ERROR) << sl4n::kTagStr << ": Expected member " << string_member; 1745e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 1755e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 1765e8c39c7d328ff0534d040c3219bd6519443128etturney return; 1775e8c39c7d328ff0534d040c3219bd6519443128etturney } else { 1785e8c39c7d328ff0534d040c3219bd6519443128etturney if (!doc[sl4n::kParamsStr][0][0][string_member.c_str()].IsString()) { 1795e8c39c7d328ff0534d040c3219bd6519443128etturney LOG(ERROR) << sl4n::kTagStr << ": Expected String input for " 1805e8c39c7d328ff0534d040c3219bd6519443128etturney << string_member; 1815e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 1825e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 1835e8c39c7d328ff0534d040c3219bd6519443128etturney return; 1845e8c39c7d328ff0534d040c3219bd6519443128etturney } 1855e8c39c7d328ff0534d040c3219bd6519443128etturney string_test = doc[sl4n::kParamsStr][0][0][string_member.c_str()].GetString(); 1865e8c39c7d328ff0534d040c3219bd6519443128etturney } 1875e8c39c7d328ff0534d040c3219bd6519443128etturney if (!doc[sl4n::kParamsStr][0][0].HasMember(int_member.c_str())) { 1885e8c39c7d328ff0534d040c3219bd6519443128etturney LOG(ERROR) << sl4n::kTagStr << ": Expected member " << int_member; 1895e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 1905e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 1915e8c39c7d328ff0534d040c3219bd6519443128etturney return; 1925e8c39c7d328ff0534d040c3219bd6519443128etturney } else { 1935e8c39c7d328ff0534d040c3219bd6519443128etturney if (!doc[sl4n::kParamsStr][0][0][int_member.c_str()].IsInt()) { 1945e8c39c7d328ff0534d040c3219bd6519443128etturney LOG(ERROR) << sl4n::kTagStr << ": Expected Int input for " 1955e8c39c7d328ff0534d040c3219bd6519443128etturney << int_member; 1965e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 1975e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 1985e8c39c7d328ff0534d040c3219bd6519443128etturney return; 1995e8c39c7d328ff0534d040c3219bd6519443128etturney } 2005e8c39c7d328ff0534d040c3219bd6519443128etturney int_test = doc[sl4n::kParamsStr][0][0][int_member.c_str()].GetInt(); 2015e8c39c7d328ff0534d040c3219bd6519443128etturney } 2025e8c39c7d328ff0534d040c3219bd6519443128etturney bool result; 2035e8c39c7d328ff0534d040c3219bd6519443128etturney int error_code; 2045e8c39c7d328ff0534d040c3219bd6519443128etturney std::tie(result, error_code) = facade.TestSpecificParamNaming( 2055e8c39c7d328ff0534d040c3219bd6519443128etturney string_test, int_test); 2065e8c39c7d328ff0534d040c3219bd6519443128etturney if (error_code == sl4n_error_codes::kFailInt) { 2075e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, false, doc.GetAllocator()); 2085e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, sl4n::kFailStr, doc.GetAllocator()); 2095e8c39c7d328ff0534d040c3219bd6519443128etturney } else { 2105e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kResultStr, result, doc.GetAllocator()); 2115e8c39c7d328ff0534d040c3219bd6519443128etturney doc.AddMember(sl4n::kErrorStr, NULL, doc.GetAllocator()); 2125e8c39c7d328ff0534d040c3219bd6519443128etturney } 2135e8c39c7d328ff0534d040c3219bd6519443128etturney} 2145e8c39c7d328ff0534d040c3219bd6519443128etturney 2155e8c39c7d328ff0534d040c3219bd6519443128etturney//////////////// 2165e8c39c7d328ff0534d040c3219bd6519443128etturney// constructor 2175e8c39c7d328ff0534d040c3219bd6519443128etturney//////////////// 2185e8c39c7d328ff0534d040c3219bd6519443128etturney 2195e8c39c7d328ff0534d040c3219bd6519443128etturneyTestFacade::TestFacade() { 2205e8c39c7d328ff0534d040c3219bd6519443128etturney 2215e8c39c7d328ff0534d040c3219bd6519443128etturney CommandReceiver::RegisterCommand("TestBoolTrueReturn", 2225e8c39c7d328ff0534d040c3219bd6519443128etturney &test_bool_true_return_wrapper); 2235e8c39c7d328ff0534d040c3219bd6519443128etturney CommandReceiver::RegisterCommand("TestBoolFalseReturn", 2245e8c39c7d328ff0534d040c3219bd6519443128etturney &test_bool_false_return_wrapper); 2255e8c39c7d328ff0534d040c3219bd6519443128etturney CommandReceiver::RegisterCommand("TestNullReturn", 2265e8c39c7d328ff0534d040c3219bd6519443128etturney &test_null_return_wrapper); 2275e8c39c7d328ff0534d040c3219bd6519443128etturney CommandReceiver::RegisterCommand("TestStringEmptyReturn", 2285e8c39c7d328ff0534d040c3219bd6519443128etturney &test_string_empty_return_wrapper); 2295e8c39c7d328ff0534d040c3219bd6519443128etturney CommandReceiver::RegisterCommand("TestStringMaxReturn", 2305e8c39c7d328ff0534d040c3219bd6519443128etturney &test_string_max_return_wrapper); 2315e8c39c7d328ff0534d040c3219bd6519443128etturney CommandReceiver::RegisterCommand("TestSpecificParamNaming", 2325e8c39c7d328ff0534d040c3219bd6519443128etturney &test_specific_param_naming_wrapper); 2335e8c39c7d328ff0534d040c3219bd6519443128etturney} 2345e8c39c7d328ff0534d040c3219bd6519443128etturney 235