diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 269aea0c60..8c1396062e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1 +1,10 @@ add_subdirectory(unit) + +add_executable(client client.cpp) +target_link_libraries(client ntcore ${CMAKE_THREAD_LIBS_INIT}) +add_executable(server server.cpp) +target_link_libraries(server ntcore ${CMAKE_THREAD_LIBS_INIT}) +add_executable(rpc_local rpc_local.cpp) +target_link_libraries(rpc_local ntcore ${CMAKE_THREAD_LIBS_INIT}) +add_executable(rpc_speed rpc_speed.cpp) +target_link_libraries(rpc_speed ntcore ${CMAKE_THREAD_LIBS_INIT}) diff --git a/test/client.cpp b/test/client.cpp new file mode 100644 index 0000000000..8473d2d0a5 --- /dev/null +++ b/test/client.cpp @@ -0,0 +1,25 @@ +#include +#include +#include + +#include "ntcore.h" + +int main() { + nt::SetLogger( + [](unsigned int level, const char* file, unsigned int line, + const char* msg) { + std::fputs(msg, stderr); + std::fputc('\n', stderr); + }, + 0); + nt::StartClient("127.0.0.1", 10000); + std::this_thread::sleep_for(std::chrono::seconds(2)); + auto foo = nt::GetEntryValue("foo"); + if (foo && foo->IsDouble()) printf("Got foo: %g\n", foo->GetDouble()); + nt::SetEntryValue("bar", nt::Value::MakeBoolean(false)); + nt::SetEntryFlags("bar", NT_PERSISTENT); + nt::SetEntryValue("bar2", nt::Value::MakeBoolean(true)); + nt::SetEntryValue("bar2", nt::Value::MakeBoolean(false)); + nt::SetEntryValue("bar2", nt::Value::MakeBoolean(true)); + std::this_thread::sleep_for(std::chrono::seconds(10)); +} diff --git a/test/rpc_local.cpp b/test/rpc_local.cpp new file mode 100644 index 0000000000..20e776ede4 --- /dev/null +++ b/test/rpc_local.cpp @@ -0,0 +1,47 @@ +#include +#include +#include + +#include "ntcore.h" + +std::string callback1(nt::StringRef name, nt::StringRef params_str) { + auto params = nt::UnpackRpcValues(params_str, NT_DOUBLE); + if (params.empty()) { + std::fputs("empty params?\n", stderr); + return ""; + } + std::fprintf(stderr, "called with %g\n", params[0]->GetDouble()); + + return nt::PackRpcValues(nt::Value::MakeDouble(params[0]->GetDouble() + 1.2)); +} + +int main() { + nt::SetLogger( + [](unsigned int level, const char* file, unsigned int line, + const char* msg) { + std::fputs(msg, stderr); + std::fputc('\n', stderr); + }, + 0); + + nt::RpcDefinition def; + def.version = 1; + def.name = "myfunc1"; + def.params.emplace_back("param1", nt::Value::MakeDouble(0.0)); + def.results.emplace_back("result1", NT_DOUBLE); + nt::CreateRpc("func1", nt::PackRpcDefinition(def), callback1); + std::fputs("calling rpc\n", stderr); + unsigned int call1_uid = + nt::CallRpc("func1", nt::PackRpcValues(nt::Value::MakeDouble(2.0))); + std::string call1_result_str; + std::fputs("waiting for rpc result\n", stderr); + nt::GetRpcResult(true, call1_uid, &call1_result_str); + auto call1_result = nt::UnpackRpcValues(call1_result_str, NT_DOUBLE); + if (call1_result.empty()) { + std::fputs("empty result?\n", stderr); + return 1; + } + std::fprintf(stderr, "got %g\n", call1_result[0]->GetDouble()); + + return 0; +} diff --git a/test/rpc_speed.cpp b/test/rpc_speed.cpp new file mode 100644 index 0000000000..923df3d462 --- /dev/null +++ b/test/rpc_speed.cpp @@ -0,0 +1,49 @@ +#include +#include +#include +#include + +#include "ntcore.h" + +std::string callback1(nt::StringRef name, nt::StringRef params_str) { + auto params = nt::UnpackRpcValues(params_str, NT_DOUBLE); + if (params.empty()) { + std::fputs("empty params?\n", stderr); + return ""; + } + return nt::PackRpcValues(nt::Value::MakeDouble(params[0]->GetDouble() + 1.2)); +} + +int main() { + nt::RpcDefinition def; + def.version = 1; + def.name = "myfunc1"; + def.params.emplace_back("param1", nt::Value::MakeDouble(0.0)); + def.results.emplace_back("result1", NT_DOUBLE); + nt::CreateRpc("func1", nt::PackRpcDefinition(def), callback1); + std::string call1_result_str; + + auto start2 = std::chrono::high_resolution_clock::now(); + auto start = nt::Now(); + for (int i=0; i<10000; ++i) { + unsigned int call1_uid = + nt::CallRpc("func1", nt::PackRpcValues(nt::Value::MakeDouble(i))); + nt::GetRpcResult(true, call1_uid, &call1_result_str); + auto call1_result = nt::UnpackRpcValues(call1_result_str, NT_DOUBLE); + if (call1_result.empty()) { + std::fputs("empty result?\n", stderr); + return 1; + } + } + auto end2 = std::chrono::high_resolution_clock::now(); + auto end = nt::Now(); + std::cerr << "nt::Now start=" << start << " end=" << end << '\n'; + std::cerr << "std::chrono start=" << + std::chrono::duration_cast(start2.time_since_epoch()).count() << " end=" << + std::chrono::duration_cast(end2.time_since_epoch()).count() << '\n'; + std::fprintf(stderr, "time/call = %g us\n", (end-start) / 10.0 / 10000.0); + std::chrono::duration diff = end2-start2; + std::cerr << "time/call = " << (diff.count() / 10000.0) << " us\n"; + + return 0; +} diff --git a/test/server.cpp b/test/server.cpp new file mode 100644 index 0000000000..6979470ec0 --- /dev/null +++ b/test/server.cpp @@ -0,0 +1,24 @@ +#include +#include +#include + +#include "ntcore.h" + +int main() { + nt::SetLogger( + [](unsigned int level, const char* file, unsigned int line, + const char* msg) { + std::fputs(msg, stderr); + std::fputc('\n', stderr); + }, + 0); + nt::StartServer("persistent.ini", "", 10000); + std::this_thread::sleep_for(std::chrono::seconds(1)); + nt::SetEntryValue("foo", nt::Value::MakeDouble(0.5)); + nt::SetEntryFlags("foo", NT_PERSISTENT); + nt::SetEntryValue("foo2", nt::Value::MakeDouble(0.5)); + nt::SetEntryValue("foo2", nt::Value::MakeDouble(0.7)); + nt::SetEntryValue("foo2", nt::Value::MakeDouble(0.6)); + nt::SetEntryValue("foo2", nt::Value::MakeDouble(0.5)); + std::this_thread::sleep_for(std::chrono::seconds(10)); +}