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