diff --git a/README.md b/README.md index ab9743f..0757137 100644 --- a/README.md +++ b/README.md @@ -123,5 +123,5 @@ This library is licensed under the GNU Lesser General Public License version 3.0 ## Copyright -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net \ No newline at end of file diff --git a/implementations/Crafter.Network-ClientHTTP.cpp b/implementations/Crafter.Network-ClientHTTP.cpp index 22e2224..a470cf6 100644 --- a/implementations/Crafter.Network-ClientHTTP.cpp +++ b/implementations/Crafter.Network-ClientHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/implementations/Crafter.Network-ClientTCP.cpp b/implementations/Crafter.Network-ClientTCP.cpp index 58c517b..a8e51e7 100755 --- a/implementations/Crafter.Network-ClientTCP.cpp +++ b/implementations/Crafter.Network-ClientTCP.cpp @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/implementations/Crafter.Network-ListenerHTTP.cpp b/implementations/Crafter.Network-ListenerHTTP.cpp index 5864bed..3124eef 100644 --- a/implementations/Crafter.Network-ListenerHTTP.cpp +++ b/implementations/Crafter.Network-ListenerHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/implementations/Crafter.Network-ListenerTCP.cpp b/implementations/Crafter.Network-ListenerTCP.cpp index 00b051b..344d94d 100755 --- a/implementations/Crafter.Network-ListenerTCP.cpp +++ b/implementations/Crafter.Network-ListenerTCP.cpp @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network-ClientHTTP.cppm b/interfaces/Crafter.Network-ClientHTTP.cppm index e549723..e4df28e 100644 --- a/interfaces/Crafter.Network-ClientHTTP.cppm +++ b/interfaces/Crafter.Network-ClientHTTP.cppm @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network-ClientTCP.cppm b/interfaces/Crafter.Network-ClientTCP.cppm index 0de1e84..efca771 100755 --- a/interfaces/Crafter.Network-ClientTCP.cppm +++ b/interfaces/Crafter.Network-ClientTCP.cppm @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network-HTTP.cppm b/interfaces/Crafter.Network-HTTP.cppm index b785d32..b6788a5 100644 --- a/interfaces/Crafter.Network-HTTP.cppm +++ b/interfaces/Crafter.Network-HTTP.cppm @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network-ListenerHTTP.cppm b/interfaces/Crafter.Network-ListenerHTTP.cppm index a59cac4..728b7e9 100644 --- a/interfaces/Crafter.Network-ListenerHTTP.cppm +++ b/interfaces/Crafter.Network-ListenerHTTP.cppm @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network-ListenerTCP.cppm b/interfaces/Crafter.Network-ListenerTCP.cppm index e8f3828..007d6e7 100755 --- a/interfaces/Crafter.Network-ListenerTCP.cppm +++ b/interfaces/Crafter.Network-ListenerTCP.cppm @@ -1,6 +1,6 @@ /* Crafter®.Network -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/interfaces/Crafter.Network.cppm b/interfaces/Crafter.Network.cppm index 2648a10..92dec0b 100755 --- a/interfaces/Crafter.Network.cppm +++ b/interfaces/Crafter.Network.cppm @@ -1,6 +1,6 @@ /* Crafter®.Thread -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or diff --git a/project.cpp b/project.cpp new file mode 100644 index 0000000..e8fb41b --- /dev/null +++ b/project.cpp @@ -0,0 +1,71 @@ +import std; +import Crafter.Build; +namespace fs = std::filesystem; +using namespace Crafter; + +extern "C" Configuration CrafterBuildProject(std::span args) { + constexpr std::array networkInterfaces = { + "interfaces/Crafter.Network", + "interfaces/Crafter.Network-ClientTCP", + "interfaces/Crafter.Network-ListenerTCP", + "interfaces/Crafter.Network-ClientHTTP", + "interfaces/Crafter.Network-ListenerHTTP", + "interfaces/Crafter.Network-HTTP", + }; + constexpr std::array networkImplementations = { + "implementations/Crafter.Network-ClientTCP", + "implementations/Crafter.Network-ListenerTCP", + "implementations/Crafter.Network-ClientHTTP", + "implementations/Crafter.Network-ListenerHTTP", + }; + + std::vector depArgs(args.begin(), args.end()); + Configuration* thread = GitProject({ + .source = { .url = "https://forgejo.catcrafts.net/Catcrafts/Crafter.Thread.git" }, + .args = depArgs, + }); + + Configuration cfg; + cfg.path = "./"; + cfg.name = "Crafter.Network"; + cfg.outputName = "Crafter.Network"; + cfg.type = ConfigurationType::LibraryStatic; + ApplyStandardArgs(cfg, args); + cfg.dependencies = { thread }; + { + std::array ifaces; + std::ranges::copy(networkInterfaces, ifaces.begin()); + std::array impls; + std::ranges::copy(networkImplementations, impls.begin()); + cfg.GetInterfacesAndImplementations(ifaces, impls); + } + + auto addTest = [&](std::string name, fs::path implFile) { + Test t; + t.config.path = "./"; + t.config.name = std::move(name); + t.config.outputName = t.config.name; + t.config.target = cfg.target; + t.config.debug = cfg.debug; + t.config.march = cfg.march; + t.config.mtune = cfg.mtune; + t.config.type = ConfigurationType::Executable; + t.config.dependencies = { thread }; + std::array ifaces; + std::ranges::copy(networkInterfaces, ifaces.begin()); + std::array impls; + std::ranges::copy(networkImplementations, impls.begin()); + impls[4] = std::move(implFile); + t.config.GetInterfacesAndImplementations(ifaces, impls); + cfg.tests.push_back(std::move(t)); + }; + + addTest("ShouldCompile", "tests/ShouldCompile"); + addTest("ShouldRecieveHTTP", "tests/ShouldRecieveHTTP"); + addTest("ShouldSendHTTP", "tests/ShouldSendHTTP"); + addTest("ShouldSendRecieveHTTP", "tests/ShouldSendRecieveHTTP"); + addTest("ShouldSendRecieveKeepaliveHTTP", "tests/ShouldSendRecieveKeepaliveHTTP"); + addTest("ShouldSendRecieveLargeHTTP", "tests/ShouldSendRecieveLargeHTTP"); + + return cfg; +} diff --git a/project.json b/project.json deleted file mode 100644 index bc70234..0000000 --- a/project.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "name": "crafter-network", - "configurations": [ - { - "name": "base", - "interfaces": ["interfaces/Crafter.Network-ClientTCP", "interfaces/Crafter.Network-ListenerTCP", "interfaces/Crafter.Network", "interfaces/Crafter.Network-ListenerHTTP", "interfaces/Crafter.Network-ClientHTTP", "interfaces/Crafter.Network-HTTP"], - "implementations": ["implementations/Crafter.Network-ClientTCP", "implementations/Crafter.Network-ListenerTCP", "implementations/Crafter.Network-ListenerHTTP", "implementations/Crafter.Network-ClientHTTP"] - }, - { - "name": "lib", - "extends": ["base"], - "type":"library", - "dependencies": [ - { - "path":"https://forgejo.catcrafts.net/Catcrafts/Crafter.Thread.git", - "configuration":"lib" - } - ] - }, - { - "name": "lib-debug", - "extends": ["lib"], - "debug": true - }, - { - "name": "lib-shared", - "extends": ["base"], - "type":"shared-library", - "dependencies": [ - { - "path":"https://forgejo.catcrafts.net/Catcrafts/Crafter.Thread.git", - "configuration":"lib-shared" - } - ] - } - ], - "tests":[ - { - "name": "should-compile", - "implementations": ["tests/ShouldCompile"], - "dependencies": [ - { - "path":"./project.json", - "configuration":"lib-shared" - } - ] - }, - { - "name": "should-recieve-http", - "implementations": ["tests/ShouldRecieveHTTP"], - "dependencies": [ - { - "path":"./project.json", - "configuration":"lib-shared" - } - ] - }, - { - "name": "should-send-http", - "implementations": ["tests/ShouldSendHTTP"], - "dependencies": [ - { - "path":"./project.json", - "configuration":"lib-shared" - } - ] - }, - { - "name": "should-send-recieve-http", - "implementations": ["tests/ShouldSendRecieveHTTP"], - "dependencies": [ - { - "path":"./project.json", - "configuration":"lib-shared" - } - ] - }, - { - "name": "should-send-recieve-keepalive-http", - "implementations": ["tests/ShouldSendRecieveKeepaliveHTTP"], - "dependencies": [ - { - "path":"./project.json", - "configuration":"lib-shared" - } - ] - }, - { - "name": "should-send-recieve-large-http", - "implementations": ["tests/ShouldSendRecieveLargeHTTP"], - "dependencies": [ - { - "path":"./project.json", - "configuration":"lib-shared" - } - ] - } - ] -} diff --git a/tests/ShouldCompile.cpp b/tests/ShouldCompile.cpp index 5da2770..3553b82 100644 --- a/tests/ShouldCompile.cpp +++ b/tests/ShouldCompile.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -20,10 +20,8 @@ import Crafter.Network; import std; using namespace Crafter; -extern "C" { - std::string* RunTest() { - return nullptr; - } +int main() { + return 0; } diff --git a/tests/ShouldRecieveHTTP.cpp b/tests/ShouldRecieveHTTP.cpp index 401d929..d405537 100644 --- a/tests/ShouldRecieveHTTP.cpp +++ b/tests/ShouldRecieveHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -22,23 +22,22 @@ import Crafter.Network; import std; using namespace Crafter; -extern "C" { - std::string* RunTest() { - bool success = false; - ListenerAsyncHTTP listener(8080, {{"/", [&](const HTTPRequest& request) { - success = true; - return CreateResponseHTTP("200 OK", "Hello World!"); - }}}); - try { - system("curl http://localhost:8080 > /dev/null 2>&1"); - std::this_thread::sleep_for(std::chrono::seconds(1)); - if (success) { - return nullptr; - } else { - return new std::string("Did not receive"); - } - } catch(std::exception& e) { - return new std::string(e.what()); +int main() { + bool success = false; + ListenerAsyncHTTP listener(8081, {{"/", [&](const HTTPRequest& request) { + success = true; + return CreateResponseHTTP("200 OK", "Hello World!"); + }}}); + try { + system("curl http://localhost:8081 > /dev/null 2>&1"); + std::this_thread::sleep_for(std::chrono::seconds(1)); + if (success) { + return 0; } + std::println("Did not receive"); + return 1; + } catch (std::exception& e) { + std::println("{}", e.what()); + return 1; } } \ No newline at end of file diff --git a/tests/ShouldSendHTTP.cpp b/tests/ShouldSendHTTP.cpp index 59810b4..51e32b2 100644 --- a/tests/ShouldSendHTTP.cpp +++ b/tests/ShouldSendHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -20,14 +20,12 @@ import Crafter.Network; import std; using namespace Crafter; -extern "C" { - std::string* RunTest() { - ClientHTTP client("httpbin.org", 80); - HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/get", "httpbin.org")); - if(response.status == "200 OK") { - return nullptr; - } else { - return new std::string(response.body); - } +int main() { + ClientHTTP client("httpbin.org", 80); + HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/get", "httpbin.org")); + if (response.status == "200 OK") { + return 0; } + std::println("{}", response.body); + return 1; } \ No newline at end of file diff --git a/tests/ShouldSendRecieveHTTP.cpp b/tests/ShouldSendRecieveHTTP.cpp index 29ecaba..e50ebef 100644 --- a/tests/ShouldSendRecieveHTTP.cpp +++ b/tests/ShouldSendRecieveHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -22,22 +22,20 @@ import Crafter.Network; import std; using namespace Crafter; -extern "C" { - std::string* RunTest() { - bool success = false; - ListenerAsyncHTTP listener(8080, {{"/", [&](const HTTPRequest& request) { - return CreateResponseHTTP("200 OK", "Hello World!"); - }}}); - try { - ClientHTTP client("localhost", 8080); - HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); - if(response.status == "200 OK" && response.body == "Hello World!") { - return nullptr; - } else { - return new std::string(response.status +response.body); - } - } catch(std::exception& e) { - return new std::string(e.what()); +int main() { + ListenerAsyncHTTP listener(8082, {{"/", [&](const HTTPRequest& request) { + return CreateResponseHTTP("200 OK", "Hello World!"); + }}}); + try { + ClientHTTP client("localhost", 8082); + HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); + if (response.status == "200 OK" && response.body == "Hello World!") { + return 0; } + std::println("{}{}", response.status, response.body); + return 1; + } catch (std::exception& e) { + std::println("{}", e.what()); + return 1; } } \ No newline at end of file diff --git a/tests/ShouldSendRecieveKeepaliveHTTP.cpp b/tests/ShouldSendRecieveKeepaliveHTTP.cpp index 9d6edd3..742ef55 100644 --- a/tests/ShouldSendRecieveKeepaliveHTTP.cpp +++ b/tests/ShouldSendRecieveKeepaliveHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -22,28 +22,27 @@ import Crafter.Network; import std; using namespace Crafter; -extern "C" { - std::string* RunTest() { - ListenerAsyncHTTP listener(8080, {{"/", [&](const HTTPRequest& request) { - return CreateResponseHTTP("200 OK", "Hello World!"); - }}}); - try { - ClientHTTP client("localhost", 8080); - HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); - std::this_thread::sleep_for(std::chrono::seconds(1)); - if(response.status == "200 OK" && response.body == "Hello World!") { - response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); - std::this_thread::sleep_for(std::chrono::seconds(1)); - if(response.status == "200 OK" && response.body == "Hello World!") { - return nullptr; - } else { - return new std::string(response.status +response.body); - } - } else { - return new std::string(response.status +response.body); - } - } catch(std::exception& e) { - return new std::string(e.what()); +int main() { + ListenerAsyncHTTP listener(8083, {{"/", [&](const HTTPRequest& request) { + return CreateResponseHTTP("200 OK", "Hello World!"); + }}}); + try { + ClientHTTP client("localhost", 8083); + HTTPResponse response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); + std::this_thread::sleep_for(std::chrono::seconds(1)); + if (response.status != "200 OK" || response.body != "Hello World!") { + std::println("{}{}", response.status, response.body); + return 1; } + response = client.Send(CreateRequestHTTP("GET", "/", "localhost")); + std::this_thread::sleep_for(std::chrono::seconds(1)); + if (response.status != "200 OK" || response.body != "Hello World!") { + std::println("{}{}", response.status, response.body); + return 1; + } + return 0; + } catch (std::exception& e) { + std::println("{}", e.what()); + return 1; } } \ No newline at end of file diff --git a/tests/ShouldSendRecieveLargeHTTP.cpp b/tests/ShouldSendRecieveLargeHTTP.cpp index 6e881ae..7b6f003 100644 --- a/tests/ShouldSendRecieveLargeHTTP.cpp +++ b/tests/ShouldSendRecieveLargeHTTP.cpp @@ -1,6 +1,6 @@ /* Crafter® Build -Copyright (C) 2025 Catcrafts® +Copyright (C) 2026 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or @@ -22,28 +22,27 @@ import Crafter.Network; import std; using namespace Crafter; -extern "C" { - std::string* RunTest() { - ListenerAsyncHTTP listener(8080, {{ "/", [&](const HTTPRequest& request) { - if (request.body.size() > 1'000'000) { - return CreateResponseHTTP("200 OK", "Large request received: " + std::to_string(request.body.size()) + " bytes"); - } - return CreateResponseHTTP("200 OK", "Small request received"); +int main() { + ListenerAsyncHTTP listener(8084, {{ "/", [&](const HTTPRequest& request) { + if (request.body.size() > 1'000'000) { + return CreateResponseHTTP("200 OK", "Large request received: " + std::to_string(request.body.size()) + " bytes"); } - }}); - - try { - ClientHTTP client("localhost", 8080); - std::string large_body(10 * 1024 * 1024, 'A'); - HTTPResponse response = client.Send(CreateRequestHTTP("POST", "/", "localhost", large_body)); - std::this_thread::sleep_for(std::chrono::seconds(1)); - if (response.status == "200 OK" && response.body.find("Large request received") != std::string::npos) { - return nullptr; - } else { - return new std::string("Unexpected response: " + response.status + " " + response.body); - } - } catch (const std::exception& e) { - return new std::string(e.what()); + return CreateResponseHTTP("200 OK", "Small request received"); } + }}); + + try { + ClientHTTP client("localhost", 8084); + std::string large_body(10 * 1024 * 1024, 'A'); + HTTPResponse response = client.Send(CreateRequestHTTP("POST", "/", "localhost", large_body)); + std::this_thread::sleep_for(std::chrono::seconds(1)); + if (response.status == "200 OK" && response.body.find("Large request received") != std::string::npos) { + return 0; + } + std::println("Unexpected response: {} {}", response.status, response.body); + return 1; + } catch (const std::exception& e) { + std::println("{}", e.what()); + return 1; } } \ No newline at end of file