first commit

This commit is contained in:
sanya
2025-09-01 14:20:39 +00:00
committed by ExternPointer
commit 490fc11f6a
4328 changed files with 1796224 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
include(FetchContent)
FetchContent_Declare(
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v3.3.2
)
FetchContent_MakeAvailable(Catch2)
find_package(Threads REQUIRED)
add_executable(sio_test sio_test.cpp)
target_link_libraries(sio_test PRIVATE Catch2::Catch2WithMain sioclient Threads::Threads)
add_test(sioclient_test sio_test)

View File

@@ -0,0 +1 @@
node_modules

View File

@@ -0,0 +1,37 @@
var port = 3000;
var io = require('socket.io')().listen(port);
console.log("Listening on port " + port);
/* Socket.IO events */
io.on("connection", function(socket){
console.log("new connection");
socket.on('test_text', (...args) => {
console.log("test text event received.", args);
});
socket.on('test_binary', (...args) => {
console.log("test binary event received", args);
if(args[0] instanceof Buffer)
{
console.log("test binary event received,binary length:"+ args[0].length);
}
});
socket.on('test ack',function()
{
var args =Array.prototype.slice.call(arguments);
if('object' == typeof args[0])
{
console.log("test combo received,object:");
console.log(JSON.stringify(args[0]));
}
if(args.length>1 && 'function' == typeof args[args.length - 1])
{
console.log('need ack for test combo');
var fn = args[args.length - 1];
fn('Got bin length:' + args[0].bin.length);//invoke ack callback function.
}
});
});

View File

@@ -0,0 +1,165 @@
{
"name": "echo_server",
"version": "0.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@types/component-emitter": {
"version": "1.2.10",
"resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
"integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg=="
},
"@types/cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg=="
},
"@types/cors": {
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz",
"integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg=="
},
"@types/node": {
"version": "14.14.20",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz",
"integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A=="
},
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
}
},
"base64-arraybuffer": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
"integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI="
},
"base64id": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
"integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
},
"component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
},
"cookie": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
"integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
},
"cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"requires": {
"object-assign": "^4",
"vary": "^1"
}
},
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"engine.io": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.0.6.tgz",
"integrity": "sha512-rf7HAVZpcRrcKEKddgIzYUnwg0g5HE1RvJaTLwkcfJmce4g+po8aMuE6vxzp6JwlK8FEq/vi0KWN6tA585DjaA==",
"requires": {
"accepts": "~1.3.4",
"base64id": "2.0.0",
"cookie": "~0.4.1",
"cors": "~2.8.5",
"debug": "~4.3.1",
"engine.io-parser": "~4.0.0",
"ws": "~7.4.2"
}
},
"engine.io-parser": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz",
"integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==",
"requires": {
"base64-arraybuffer": "0.1.4"
}
},
"mime-db": {
"version": "1.45.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
"integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
},
"mime-types": {
"version": "2.1.28",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
"integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
"requires": {
"mime-db": "1.45.0"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
"socket.io": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.0.5.tgz",
"integrity": "sha512-5yWQ43P/4IttmPCGKDQ3CVocBiJWGpibyhYJxgUhf69EHMzmK8XW0DkmHIoYdLmZaVZJyiEkUqpeC7rSCIqekw==",
"requires": {
"@types/cookie": "^0.4.0",
"@types/cors": "^2.8.8",
"@types/node": "^14.14.10",
"accepts": "~1.3.4",
"base64id": "~2.0.0",
"debug": "~4.3.1",
"engine.io": "~4.0.6",
"socket.io-adapter": "~2.0.3",
"socket.io-parser": "~4.0.3"
}
},
"socket.io-adapter": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.0.3.tgz",
"integrity": "sha512-2wo4EXgxOGSFueqvHAdnmi5JLZzWqMArjuP4nqC26AtLh5PoCPsaRbRdah2xhcwTAMooZfjYiNVNkkmmSMaxOQ=="
},
"socket.io-parser": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.5.tgz",
"integrity": "sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==",
"requires": {
"@types/component-emitter": "^1.2.10",
"component-emitter": "~1.3.0",
"debug": "~4.3.1"
}
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"ws": {
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
}
}
}

View File

@@ -0,0 +1,8 @@
{
"name": "echo_server",
"author": "Melo Yao",
"version": "0.0.0",
"dependencies": {
"socket.io": "^3.0.5"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,236 @@
//
// sio_test_sample.cpp
//
// Created by Melo Yao on 3/24/15.
//
#include <sio_client.h>
#include <internal/sio_packet.h>
#include <functional>
#include <iostream>
#include <thread>
#include <catch2/catch_test_macros.hpp>
#ifndef _WIN32
#include "json.hpp" //nlohmann::json cannot build in MSVC
#endif
using namespace sio;
TEST_CASE( "test_packet_construct_1" )
{
packet p("/nsp",nullptr,1001,true);
CHECK(p.get_frame() == packet::frame_message);
CHECK(p.get_message() == nullptr);
CHECK(p.get_nsp() == std::string("/nsp"));
CHECK(p.get_pack_id() == 1001);
}
TEST_CASE( "test_packet_construct_2" )
{
packet p(packet::frame_ping);
CHECK(p.get_frame() == packet::frame_ping);
CHECK(p.get_message() == nullptr);
CHECK(p.get_nsp() == std::string(""));
CHECK(p.get_pack_id() == 0xFFFFFFFF);
}
TEST_CASE( "test_packet_construct_3" )
{
packet p(packet::type_connect,"/nsp",nullptr);
CHECK(p.get_frame() == packet::frame_message);
CHECK(p.get_type() == packet::type_connect);
CHECK(p.get_message() == nullptr);
CHECK(p.get_nsp() == std::string("/nsp"));
CHECK(p.get_pack_id() == 0xFFFFFFFF);
}
TEST_CASE( "test_packet_accept_1" )
{
packet p(packet::type_connect,"/nsp",nullptr);
std::string payload;
std::vector<std::shared_ptr<const std::string> > buffers;
p.accept(payload,buffers);
CHECK(buffers.size() == 0);
CHECK(payload == "40/nsp");
INFO("outputing payload:" << payload);
}
TEST_CASE( "test_packet_accept_2" )
{
packet p(packet::frame_ping);
std::string payload;
std::vector<std::shared_ptr<const std::string> > buffers;
p.accept(payload,buffers);
CHECK(buffers.size() == 0);
CHECK(payload == "2");
INFO("outputing payload:" << payload);
}
TEST_CASE( "test_packet_accept_3" )
{
message::ptr array = array_message::create();
array->get_vector().push_back(string_message::create("event"));
array->get_vector().push_back(string_message::create("text"));
packet p("/nsp",array,1001,true);
std::string payload;
std::vector<std::shared_ptr<const std::string> > buffers;
p.accept(payload,buffers);
CHECK(p.get_type() == packet::type_ack);
CHECK(buffers.size() == 0);
CHECK(payload == "43/nsp,1001[\"event\",\"text\"]");
INFO("outputing payload:" << payload);
}
#ifndef _WIN32
TEST_CASE( "test_packet_accept_4" )
{
message::ptr binObj = object_message::create();
binObj->get_map()["desc"] = string_message::create("Bin of 100 bytes");
char bin[100];
memset(bin,0,100*sizeof(char));
binObj->get_map()["bin1"] = binary_message::create(std::shared_ptr<const std::string>(new std::string(bin,100)));
char bin2[50];
memset(bin2,1,50*sizeof(char));
binObj->get_map()["bin2"] = binary_message::create(std::make_shared<const std::string>(bin2,50));
packet p("/nsp",binObj,1001,false);
std::string payload;
std::vector<std::shared_ptr<const std::string> > buffers;
p.accept(payload,buffers);
CHECK(p.get_type() == packet::type_binary_event);
REQUIRE(buffers.size() == 2);
size_t json_start = payload.find("{");
REQUIRE(json_start!=std::string::npos);
std::string header = payload.substr(0,json_start);
CHECK(header=="452-/nsp,1001");
INFO("outputing payload:" << payload);
std::string json = payload.substr(json_start);
nlohmann::json j = nlohmann::json::parse(json);
CHECK(j["desc"].get<std::string>() == "Bin of 100 bytes");
INFO("outputing payload desc::" << j["desc"].get<std::string>());
CHECK((bool)j["bin1"]["_placeholder"]);
INFO("outputing payload bin1:" << j["bin1"].dump());
CHECK((bool)j["bin2"]["_placeholder"]);
INFO("outputing payload bin2:" << j["bin2"].dump());
int bin1Num = j["bin1"]["num"].get<int>();
char numchar[] = {0,0};
numchar[0] = bin1Num+'0';
CHECK(buffers[bin1Num]->length()==100);
INFO("outputing payload bin1 num:" << numchar);
CHECK(buffers[bin1Num]->at(50)==0);
CHECK(buffers[bin1Num]->at(0) == 0);
int bin2Num = j["bin2"]["num"].get<int>();
numchar[0] = bin2Num+'0';
CHECK(buffers[bin2Num]->length()==50);
INFO("outputing payload bin2 num:" << numchar);
CHECK(buffers[bin2Num]->at(25)==1);
CHECK(buffers[bin2Num]->at(0) == 1);
}
#endif
TEST_CASE( "test_packet_parse_1" )
{
packet p;
bool hasbin = p.parse("42/nsp,1001[\"event\",\"text\"]");
CHECK(!hasbin);
CHECK(p.get_frame() == packet::frame_message);
CHECK(p.get_type() == packet::type_event);
CHECK(p.get_nsp() == "/nsp");
CHECK(p.get_pack_id() == 1001);
CHECK(p.get_message()->get_flag() == message::flag_array);
REQUIRE(p.get_message()->get_vector()[0]->get_flag() == message::flag_string);
CHECK(p.get_message()->get_vector()[0]->get_string() == "event");
REQUIRE(p.get_message()->get_vector()[1]->get_flag() == message::flag_string);
CHECK(p.get_message()->get_vector()[1]->get_string() == "text");
hasbin = p.parse("431111[\"ack\",{\"count\":5}]");
CHECK(!hasbin);
CHECK(p.get_frame() == packet::frame_message);
CHECK(p.get_type() == packet::type_ack);
CHECK(p.get_pack_id() == 1111);
CHECK(p.get_nsp() == "/");
CHECK(p.get_message()->get_flag() == message::flag_array);
REQUIRE(p.get_message()->get_vector()[0]->get_flag() == message::flag_string);
CHECK(p.get_message()->get_vector()[0]->get_string() == "ack");
REQUIRE(p.get_message()->get_vector()[1]->get_flag() == message::flag_object);
CHECK(p.get_message()->get_vector()[1]->get_map()["count"]->get_int() == 5);
}
TEST_CASE( "test_packet_parse_2" )
{
packet p;
bool hasbin = p.parse("3");
CHECK(!hasbin);
CHECK(p.get_frame() == packet::frame_pong);
CHECK(!p.get_message());
CHECK(p.get_nsp() == "/");
CHECK(p.get_pack_id() == -1);
hasbin = p.parse("2");
CHECK(!hasbin);
CHECK(p.get_frame() == packet::frame_ping);
CHECK(!p.get_message());
CHECK(p.get_nsp() == "/");
CHECK(p.get_pack_id() == -1);
}
TEST_CASE( "test_packet_parse_3" )
{
packet p;
bool hasbin = p.parse("40/nsp");
CHECK(!hasbin);
CHECK(p.get_type() == packet::type_connect);
CHECK(p.get_frame() == packet::frame_message);
CHECK(p.get_nsp() == "/nsp");
CHECK(p.get_pack_id() == -1);
CHECK(!p.get_message());
p.parse("40");
CHECK(p.get_type() == packet::type_connect);
CHECK(p.get_nsp() == "/");
CHECK(p.get_pack_id() == -1);
CHECK(!p.get_message());
p.parse("44\"error\"");
CHECK(p.get_type() == packet::type_error);
CHECK(p.get_nsp() == "/");
CHECK(p.get_pack_id() == -1);
CHECK(p.get_message()->get_flag() == message::flag_string);
p.parse("44/nsp,\"error\"");
CHECK(p.get_type() == packet::type_error);
CHECK(p.get_nsp() == "/nsp");
CHECK(p.get_pack_id() == -1);
CHECK(p.get_message()->get_flag() == message::flag_string);
}
TEST_CASE( "test_packet_parse_4" )
{
packet p;
bool hasbin = p.parse("452-/nsp,101[\"bin_event\",[{\"_placeholder\":true,\"num\":1},{\"_placeholder\":true,\"num\":0},\"text\"]]");
CHECK(hasbin);
char buf[100];
buf[0] = packet::frame_message;
memset(buf + 1,0,99);
std::string bufstr(buf,100);
std::string bufstr2(buf,50);
CHECK(p.parse_buffer(bufstr));
CHECK(!p.parse_buffer(bufstr2));
CHECK(p.get_frame() == packet::frame_message);
CHECK(p.get_nsp() == "/nsp");
CHECK(p.get_pack_id() == 101);
message::ptr msg = p.get_message();
REQUIRE(msg);
REQUIRE(msg->get_flag() == message::flag_array);
CHECK(msg->get_vector()[0]->get_string() == "bin_event");
message::ptr array = msg->get_vector()[1];
REQUIRE(array->get_flag() == message::flag_array);
REQUIRE(array->get_vector()[0]->get_flag() == message::flag_binary);
REQUIRE(array->get_vector()[1]->get_flag() == message::flag_binary);
REQUIRE(array->get_vector()[2]->get_flag() == message::flag_string);
CHECK(array->get_vector()[0]->get_binary()->size() == 50);
CHECK(array->get_vector()[1]->get_binary()->size() == 100);
CHECK(array->get_vector()[2]->get_string() == "text");
}