diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt index ef2963f7..5167bb07 100644 --- a/benchmark/CMakeLists.txt +++ b/benchmark/CMakeLists.txt @@ -40,6 +40,9 @@ target_link_libraries(bench_tddb PRIVATE tdcore tddb tdutils) add_executable(bench_misc bench_misc.cpp) target_link_libraries(bench_misc PRIVATE tdcore tdutils) +add_executable(check_proxy check_proxy.cpp) +target_link_libraries(check_proxy PRIVATE tdclient tdcore) + add_executable(check_tls check_tls.cpp) target_link_libraries(check_tls PRIVATE tdutils) diff --git a/benchmark/check_proxy.cpp b/benchmark/check_proxy.cpp new file mode 100644 index 00000000..5f54e850 --- /dev/null +++ b/benchmark/check_proxy.cpp @@ -0,0 +1,91 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2019 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#include "td/telegram/Client.h" + +#include "td/utils/common.h" +#include "td/utils/logging.h" +#include "td/utils/misc.h" + +#include + +static void usage() { + td::TsCerr() << "Tests specified MTProto-proxy; exits with code 0 on success.\n"; + td::TsCerr() << "Usage:\n"; + td::TsCerr() << "check_proxy [-v] [-h] server:port:secret\n"; + std::exit(2); +} + +int main(int argc, char **argv) { + int new_verbosity_level = VERBOSITY_NAME(FATAL); + td::string server; + td::int32 port = 0; + td::string secret; + + for (int i = 1; i < argc; i++) { + td::string arg(argv[i]); + if (arg.substr(0, 2) == "-v") { + if (arg.size() == 2 && i + 1 < argc) { + arg = argv[++i]; + } else { + arg = arg.substr(2); + } + int new_verbosity = 1; + while (arg[0] == 'v') { + new_verbosity++; + arg = arg.substr(1); + } + if (!arg.empty()) { + new_verbosity += td::to_integer(arg) - (new_verbosity == 1); + } + new_verbosity_level = VERBOSITY_NAME(FATAL) + new_verbosity; + } else if (arg == "-h" || arg == "--help") { + usage(); + } else { + auto secret_pos = arg.rfind(':'); + if (secret_pos == td::string::npos) { + td::TsCerr() << (PSLICE() << "Error: failed to find proxy port and secret in \"" << arg << "\"\n"); + usage(); + } + secret = arg.substr(secret_pos + 1); + auto port_pos = arg.substr(0, secret_pos).rfind(':'); + if (port_pos == td::string::npos) { + td::TsCerr() << (PSLICE() << "Error: failed to find proxy secret in \"" << arg << "\"\n"); + usage(); + } + auto r_port = td::to_integer_safe(arg.substr(port_pos + 1, secret_pos - port_pos - 1)); + if (r_port.is_error()) { + td::TsCerr() << (PSLICE() << "Error: failed to parse proxy port in \"" << arg << "\"\n"); + usage(); + } + port = r_port.move_as_ok(); + server = arg.substr(0, port_pos); + } + } + + if (server.empty() || port <= 0 || port > 65536 || secret.empty()) { + td::TsCerr() << "Error: proxy address to check is not specified\n"; + usage(); + } + + SET_VERBOSITY_LEVEL(new_verbosity_level); + + td::Client client; + client.send({1, td::td_api::make_object( + server, port, td::td_api::make_object(secret))}); + while (true) { + auto response = client.receive(100.0); + if (response.id == 1) { + if (response.object->get_id() == td::td_api::error::ID) { + LOG(ERROR) << to_string(response.object); + return 1; + } else { + LOG(ERROR) << "Success!"; + return 0; + } + } + } +}