1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-02-12 11:12:16 +00:00
ton/tdnet/test/net-test.cpp
neodix42 e0a320f715
Improve TON build scripts and some tests (#855)
* fix macOS github actions

* fix android tonlib GH action;

* fixing wasm GH action

* strip binaries

* fix randomly failing ubuntu and wasm GH actions

* fix randomly failing ubuntu and wasm GH actions

* revert some changes

* adding more nix scripts and automated native build scripts;
debug static ton compilation

* minor fix

* do not use pkg_config if path specified

* move wasm script, run with sudo action script

* weird, fixing - cp: missing destination file operand after 'assembly/native/build-ubuntu-20.04-shared.sh'

* weird, fixing - cp: missing destination file operand after 'assembly/native/build-ubuntu-20.04-shared.sh'

* ok

* some adjustments for android and win builds

* some adjustments for android and win builds

* moving stripping inside the build script

* access rights handling; adding simple binaries' tests

* make lite-client-common, fift-lib and smc-envelope deliberately static;
add -a (artifacts) flag to build scripts;

* minor wasm build fix;
create separate tonlib android build script;
remove outdated __has_trivial_copy(T)

* add windows build - WIP

* adjust android build;
improve win build;

* adjust sodium paths for android build; use proper compiler for windows build;

* add github windows build auxiliary file

* adjust wasm build

* add portable ubuntu build

* exclude some unstable tests for some time

* compile portable binaries on ubuntu-20.04

* exclude some unstable tests

* include static gsl

* restart builds

* restart builds

* restart builds

* remove libreadline, gsl and blas dependencies in linux build

* add macos build script

* install missing autoconf in macos builds

* enable all tests and see what fails

* enable win tests and restart others

* enable win tests and fix test-smartcont.cpp

* enable win tests

* use clang-16 on mac builds, add blockchain-explorer for ubuntu builds, add portable macos build

* move sudo part outside a build scripts

* move sudo part outside a build scripts

* run llvm install with sudo

* remove libgnutls28-dev before ubuntu static compilation, include blockchain-explorer into artifacts;
remove warning: definition of implicit copy constructor for 'Stat' is deprecated because it has a user-declared copy assignment operator [-Wdeprecated-copy]

* rework wrong decision, put back system gnutls, but compile libmicrohttpd with --disable-https

* add jenkins pipeline sceleton

* WIP jenkins pipeline sceleton

* WIP jenkins pipeline changes

* WIP jenkins pipeline: add stage timout, zip and group artifacts

* WIP jenkins pipeline: macos portable build fix

* WIP jenkins pipeline: wording

* WIP jenkins pipeline: add android tonlib

* WIP jenkins pipeline: add was binaries

* WIP jenkins pipeline: add TOTAL_MEMORY 1.5gb to funcfiftlib wasm linking

* WIP jenkins pipeline: add nix build on linux aarch64

* WIP jenkins pipeline: funcfiftlib compilation fails that 16mb mem is not enough, increase to 32mb

* WIP jenkins pipeline: enable test in nix build

* WIP jenkins pipeline: add linux x86-64 nix build

* WIP jenkins pipeline: include libs in nix build

* WIP jenkins pipeline: include libs in nix build

* WIP jenkins pipeline: include mac nix build

* WIP jenkins pipeline: include mac nix build

* WIP jenkins pipeline: include mac nix build

* WIP jenkins pipeline: include mac nix build

* WIP jenkins pipeline: include mac nix build

* WIP jenkins pipeline: include mac nix build

* WIP jenkins pipeline: nix linux arm64 with openssl 1.1 for now

* WIP jenkins pipeline: working ubuntu arm64 libtonjson

* WIP jenkins pipeline: working ubuntu arm64 libtonjson + minor fix

* WIP jenkins pipeline: working ubuntu arm64 libtonjson + minor fix 2

* WIP jenkins pipeline: merry christmas

* WIP jenkins pipeline: merry christmas 2

* WIP jenkins pipeline: remove native static builds

* WIP jenkins pipeline: enable more tests

* WIP jenkins pipeline: zip artifacts better

* WIP jenkins pipeline: get rid of path in the final zip

* WIP jenkins pipeline: minor fix, include lib and smartcont folders

* WIP jenkins pipeline: minor fix, include lib and smartcont folders into nix artifacts also

* WIP jenkins pipeline: minor fix

* WIP jenkins pipeline: minor fix

* adjust github actions for new nix builds

* cleanup

* cleanup

* cleanup

* cleanup

* rename libtonlibjson.so.0.5 to libtonlibjson.so

* Add TON build instructions to README.md

* simplify

* fix test-tonlib-offline

* set timeout per test of 300 sec

* set timeout per test of 600 sec for non nix builds

* increase test timeout to 900 sec; minor changes

* use MS VS 2022 for win TON compilation; update README.md

* use MS VS 2022 for win TON compilation; update README.md

* change path to MSVC in github workflow

* change path to MSVC in groovy pipeline

* compile ton on win, with msvc 2022 community and enterprise versions

* minor fixes

* improve network tests

* remove TON compilation against macos-11 github runner

* add `choco feature enable -n allowEmptyChecksums` since pkg-config-lite-0.28-1 does not have a checksum

* abort win compilation if 3pp can't be downloaded

* increase test timeout to 30 min

* improving test-catchain
2024-01-15 23:48:04 +03:00

169 lines
5 KiB
C++

/*
This file is part of TON Blockchain Library.
TON Blockchain Library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
TON Blockchain Library 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with TON Blockchain Library. If not, see <http://www.gnu.org/licenses/>.
Copyright 2017-2020 Telegram Systems LLP
*/
#include "td/actor/actor.h"
#include "td/net/UdpServer.h"
#include "td/utils/tests.h"
class PingPong : public td::actor::Actor {
public:
PingPong(int port, td::IPAddress dest, bool use_tcp, bool is_first)
: port_(port), dest_(std::move(dest)), use_tcp_(use_tcp) {
if (is_first) {
state_ = Send;
to_send_cnt_ = 5;
to_send_cnt_ = 1;
}
}
private:
int port_;
td::actor::ActorOwn<td::UdpServer> udp_server_;
td::IPAddress dest_;
bool is_closing_{false};
bool is_closing_delayed_{false};
bool use_tcp_{false};
enum State { Send, Receive } state_{State::Receive};
int cnt_{0};
int to_send_cnt_{0};
void start_up() override {
class Callback : public td::UdpServer::Callback {
public:
Callback(td::actor::ActorShared<PingPong> ping_pong) : ping_pong_(std::move(ping_pong)) {
}
private:
td::actor::ActorShared<PingPong> ping_pong_;
void on_udp_message(td::UdpMessage udp_message) override {
send_closure(ping_pong_, &PingPong::on_udp_message, std::move(udp_message));
}
};
if (use_tcp_) {
udp_server_ = td::UdpServer::create_via_tcp(PSLICE() << "UdpServer(via tcp) " << td::tag("port", port_), port_,
std::make_unique<Callback>(actor_shared(this)))
.move_as_ok();
} else {
udp_server_ = td::UdpServer::create(PSLICE() << "UdpServer " << td::tag("port", port_), port_,
std::make_unique<Callback>(actor_shared(this)))
.move_as_ok();
}
alarm_timestamp() = td::Timestamp::in(0.1);
}
void on_udp_message(td::UdpMessage message) {
if (is_closing_) {
return;
}
if (message.error.is_error()) {
LOG(ERROR) << "Got error " << message.error << " from " << message.address;
return;
}
auto data_slice = message.data.as_slice();
LOG(INFO) << "Got query " << td::format::escaped(data_slice) << " from " << message.address;
CHECK(state_ == State::Receive);
if (data_slice.size() < 5) {
CHECK(data_slice == "stop");
close();
}
if (data_slice[5] == 'i') {
state_ = State::Send;
to_send_cnt_ = td::Random::fast(1, 4);
to_send_cnt_ = 1;
send_closure_later(actor_id(this), &PingPong::loop);
}
}
void loop() override {
if (state_ != State::Send || is_closing_) {
return;
}
to_send_cnt_--;
td::Slice msg;
if (to_send_cnt_ <= 0) {
state_ = State::Receive;
cnt_++;
if (cnt_ >= 1000) {
msg = "stop";
} else {
msg = "makgpingping";
}
} else {
msg = "magkpongpong";
}
LOG(INFO) << "Send query: " << msg;
send_closure_later(actor_id(this), &PingPong::loop);
send_closure(udp_server_, &td::UdpServer::send, td::UdpMessage{dest_, td::BufferSlice(msg), {}});
if (msg.size() == 4) {
close_delayed();
}
}
void alarm() override {
if (is_closing_delayed_) {
close();
return;
}
send_closure_later(actor_id(this), &PingPong::loop);
}
void close_delayed() {
// Temporary hack to avoid ECONNRESET error
is_closing_ = true;
is_closing_delayed_ = true;
alarm_timestamp() = td::Timestamp::in(0.1);
}
void close() {
is_closing_ = true;
udp_server_.reset();
}
void hangup_shared() override {
// udp_server_ was_closed
stop();
}
void tear_down() override {
td::actor::SchedulerContext::get()->stop();
}
};
void run_server(int from_port, int to_port, bool is_first, bool use_tcp) {
td::IPAddress to_ip;
to_ip.init_host_port("localhost", to_port).ensure();
td::actor::Scheduler scheduler({1});
scheduler.run_in_context([&] {
td::actor::create_actor<PingPong>(td::actor::ActorOptions().with_name("PingPong"), from_port, to_ip, use_tcp,
is_first)
.release();
});
scheduler.run();
}
TEST(Net, PingPong) {
SET_VERBOSITY_LEVEL(VERBOSITY_NAME(ERROR));
int port1 = td::Random::fast(10000, 10999);
int port2 = td::Random::fast(11000, 11999);
for (auto use_tcp : {false, true}) {
auto a = td::thread([=] { run_server(port1, port2, true, use_tcp); });
auto b = td::thread([=] { run_server(port2, port1, false, use_tcp); });
a.join();
b.join();
}
}