summaryrefslogtreecommitdiff
path: root/libs/tdlib/td/benchmark/bench_http.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/tdlib/td/benchmark/bench_http.cpp')
-rw-r--r--libs/tdlib/td/benchmark/bench_http.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/libs/tdlib/td/benchmark/bench_http.cpp b/libs/tdlib/td/benchmark/bench_http.cpp
new file mode 100644
index 0000000000..6958a5b313
--- /dev/null
+++ b/libs/tdlib/td/benchmark/bench_http.cpp
@@ -0,0 +1,78 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+//
+// 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/actor/actor.h"
+
+#include "td/net/HttpOutboundConnection.h"
+#include "td/net/HttpQuery.h"
+
+#include "td/utils/buffer.h"
+#include "td/utils/logging.h"
+#include "td/utils/port/IPAddress.h"
+#include "td/utils/port/SocketFd.h"
+#include "td/utils/Status.h"
+
+#include <atomic>
+#include <limits>
+
+namespace td {
+
+std::atomic<int> counter;
+class HttpClient : public HttpOutboundConnection::Callback {
+ void start_up() override {
+ IPAddress addr;
+ addr.init_ipv4_port("127.0.0.1", 8082).ensure();
+ auto fd = SocketFd::open(addr);
+ CHECK(fd.is_ok()) << fd.error();
+ connection_ =
+ create_actor<HttpOutboundConnection>("Connect", fd.move_as_ok(), std::numeric_limits<size_t>::max(), 0, 0,
+ ActorOwn<HttpOutboundConnection::Callback>(actor_id(this)));
+ yield();
+ cnt_ = 100000;
+ counter++;
+ }
+ void tear_down() override {
+ if (--counter == 0) {
+ Scheduler::instance()->finish();
+ }
+ }
+ void loop() override {
+ if (cnt_-- < 0) {
+ return stop();
+ }
+ send_closure(connection_, &HttpOutboundConnection::write_next, BufferSlice("GET / HTTP/1.1\r\n\r\n"));
+ send_closure(connection_, &HttpOutboundConnection::write_ok);
+ LOG(INFO) << "SEND";
+ }
+ void handle(HttpQueryPtr result) override {
+ loop();
+ }
+ void on_connection_error(Status error) override {
+ LOG(ERROR) << "ERROR: " << error;
+ }
+
+ ActorOwn<HttpOutboundConnection> connection_;
+ int cnt_;
+};
+
+int main() {
+ SET_VERBOSITY_LEVEL(VERBOSITY_NAME(ERROR));
+ auto scheduler = make_unique<ConcurrentScheduler>();
+ scheduler->init(0);
+ scheduler->create_actor_unsafe<HttpClient>(0, "Client1").release();
+ scheduler->create_actor_unsafe<HttpClient>(0, "Client2").release();
+ scheduler->start();
+ while (scheduler->run_main(10)) {
+ // empty
+ }
+ scheduler->finish();
+ return 0;
+}
+} // namespace td
+
+int main() {
+ return td::main();
+}