Make tests
This commit is contained in:
@@ -18,8 +18,7 @@ HEADERS += \
|
|||||||
src/Loop.h \
|
src/Loop.h \
|
||||||
src/App.h \
|
src/App.h \
|
||||||
src/HttpSocket.h \
|
src/HttpSocket.h \
|
||||||
src/HttpParser.h \
|
src/HttpParser.h
|
||||||
src/Tests.h
|
|
||||||
|
|
||||||
INCLUDEPATH += uSockets/src src
|
INCLUDEPATH += uSockets/src src
|
||||||
#QMAKE_CXXFLAGS += -fsanitize=address
|
#QMAKE_CXXFLAGS += -fsanitize=address
|
||||||
|
|||||||
@@ -1,4 +1,10 @@
|
|||||||
default:
|
default:
|
||||||
|
rm *.o
|
||||||
clang -flto -O3 -c -IuSockets/src uSockets/src/*.c uSockets/src/eventing/*.c
|
clang -flto -O3 -c -IuSockets/src uSockets/src/*.c uSockets/src/eventing/*.c
|
||||||
clang++ -flto -O3 -c -std=c++17 -Isrc -IuSockets/src main.cpp
|
clang++ -flto -O3 -c -std=c++17 -Isrc -IuSockets/src main.cpp
|
||||||
clang++ -flto -O3 -s *.o -o uWS_test -lssl -lcrypto
|
clang++ -flto -O3 -s *.o -o uWS_main -lssl -lcrypto
|
||||||
|
tests:
|
||||||
|
rm *.o
|
||||||
|
clang -flto -O3 -c -IuSockets/src uSockets/src/*.c uSockets/src/eventing/*.c
|
||||||
|
clang++ -flto -O3 -c -std=c++17 -Isrc -IuSockets/src tests.cpp
|
||||||
|
clang++ -flto -O3 -s *.o -o uWS_tests -lssl -lcrypto
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
#include "uWS.h"
|
#include "uWS.h"
|
||||||
|
|
||||||
#include "Tests.h"
|
|
||||||
|
|
||||||
std::string buffer;
|
std::string buffer;
|
||||||
|
|
||||||
//#define USE_SSL
|
//#define USE_SSL
|
||||||
@@ -18,9 +16,6 @@ int main(int argc, char **argv) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// first of all we run a couple of benchmarks
|
|
||||||
testHttpParserPerformance();
|
|
||||||
|
|
||||||
//uWS::init();
|
//uWS::init();
|
||||||
//uWS::Loop loop();
|
//uWS::Loop loop();
|
||||||
|
|
||||||
|
|||||||
@@ -88,6 +88,10 @@ protected:
|
|||||||
|
|
||||||
// onHttpRequest should probably be hard-coded to HttpRouter
|
// onHttpRequest should probably be hard-coded to HttpRouter
|
||||||
((HttpSocket<SSL> *) s)->onData(data, length, appData->onHttpRequest);
|
((HttpSocket<SSL> *) s)->onData(data, length, appData->onHttpRequest);
|
||||||
|
|
||||||
|
// compared to routing directly
|
||||||
|
//typename Data::UserData user = {(HttpSocket<SSL> *) s, nullptr};
|
||||||
|
//appData->r.route("GET", 3, "/", 1, &user);
|
||||||
});
|
});
|
||||||
|
|
||||||
static_dispatch(us_ssl_socket_context_on_writable, us_socket_context_on_writable)(httpServerContext, [](auto *s) {
|
static_dispatch(us_ssl_socket_context_on_writable, us_socket_context_on_writable)(httpServerContext, [](auto *s) {
|
||||||
|
|||||||
+3
-1
@@ -168,7 +168,9 @@ struct HttpSocket {
|
|||||||
httpData->httpParser.consumePostPadded(data, length, this, [&onHttpRequest](void *user, HttpRequest *httpRequest) {
|
httpData->httpParser.consumePostPadded(data, length, this, [&onHttpRequest](void *user, HttpRequest *httpRequest) {
|
||||||
onHttpRequest((HttpSocket<SSL> *) user, httpRequest);
|
onHttpRequest((HttpSocket<SSL> *) user, httpRequest);
|
||||||
}, [httpData](void *user, std::string_view data) {
|
}, [httpData](void *user, std::string_view data) {
|
||||||
httpData->inStream(data);
|
if (httpData->inStream) {
|
||||||
|
httpData->inStream(data);
|
||||||
|
}
|
||||||
}, [](void *user) {
|
}, [](void *user) {
|
||||||
std::cout << "INVALID HTTP!" << std::endl;
|
std::cout << "INVALID HTTP!" << std::endl;
|
||||||
});
|
});
|
||||||
|
|||||||
-94
@@ -1,94 +0,0 @@
|
|||||||
#ifndef TESTS_H
|
|
||||||
#define TESTS_H
|
|
||||||
|
|
||||||
#include "HttpParser.h"
|
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
|
|
||||||
// todo: random test of chunked http parsing of randomly generated requests
|
|
||||||
void testHttpParserPerformance() {
|
|
||||||
|
|
||||||
char headers[] = "GET /hello.htm HTTP/1.1\r\n"
|
|
||||||
"User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)\r\n"
|
|
||||||
"Host: www.tutorialspoint.com\r\n"
|
|
||||||
"Accept-Language: en-us\r\n"
|
|
||||||
"Accept-Encoding: gzip, deflate\r\n"
|
|
||||||
"Connection: Keep-Alive\r\n"
|
|
||||||
"Content-length: 1048576\r\n\r\n";
|
|
||||||
|
|
||||||
const int requestLength = sizeof(headers) - 1 + 1048576;
|
|
||||||
char *request = (char *) malloc(requestLength + 32);
|
|
||||||
memset(request, 0, requestLength);
|
|
||||||
memcpy(request, headers, sizeof(headers) - 1);
|
|
||||||
|
|
||||||
char *data = (char *) malloc(requestLength * 10);
|
|
||||||
int length = requestLength * 10;
|
|
||||||
|
|
||||||
int maxChunkSize = 10000;
|
|
||||||
char *paddedBuffer = (char *) malloc(maxChunkSize + 32);
|
|
||||||
|
|
||||||
// dela upp dessa 10 i 5 segment
|
|
||||||
HttpParser httpParser;
|
|
||||||
int validRequests = 0, numDataEmits = 0, numChunks = 0;
|
|
||||||
size_t dataBytes = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < 10; i++) {
|
|
||||||
memcpy(data + requestLength * i, request, requestLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int j = 0; j < 1000; j++) {
|
|
||||||
for (int currentOffset = 0; currentOffset != length; ) {
|
|
||||||
|
|
||||||
int chunkSize = rand() % 10000;
|
|
||||||
if (currentOffset + chunkSize > length) {
|
|
||||||
chunkSize = length - currentOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(paddedBuffer, data + currentOffset, chunkSize);
|
|
||||||
|
|
||||||
httpParser.consumePostPadded(paddedBuffer, chunkSize, nullptr, [&validRequests](void *user, HttpRequest *req) {
|
|
||||||
validRequests++;
|
|
||||||
|
|
||||||
if (req->getUrl() != "/hello.htm") {
|
|
||||||
std::cout << "WRONG URL!" << std::endl;
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
}, [&dataBytes, &numDataEmits](void *, std::string_view data) {
|
|
||||||
numDataEmits++;
|
|
||||||
dataBytes += data.length();
|
|
||||||
}, [](void *) {
|
|
||||||
|
|
||||||
std::cout << "Error!" << std::endl;
|
|
||||||
return;
|
|
||||||
});
|
|
||||||
|
|
||||||
numChunks++;
|
|
||||||
|
|
||||||
currentOffset += chunkSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "validRequests: " << validRequests << std::endl;
|
|
||||||
std::cout << "Data bytes: " << dataBytes << std::endl;
|
|
||||||
std::cout << "Data emits: " << numDataEmits << std::endl;
|
|
||||||
std::cout << "Chunks parsed: " << numChunks << std::endl;
|
|
||||||
|
|
||||||
validRequests = 0;
|
|
||||||
|
|
||||||
auto start = std::chrono::high_resolution_clock::now();
|
|
||||||
for (int i = 0; i < 10000000; i++) {
|
|
||||||
httpParser.consumePostPadded(request, requestLength, nullptr, [&validRequests](void *user, HttpRequest *req) {
|
|
||||||
validRequests++;
|
|
||||||
}, [](void *, std::string_view data) {
|
|
||||||
|
|
||||||
}, [](void *) {
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
auto stop = std::chrono::high_resolution_clock::now();
|
|
||||||
|
|
||||||
std::cout << "Parsed " << validRequests << " in " << std::chrono::duration_cast<std::chrono::milliseconds>(stop - start).count() << "ms" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // TESTS_H
|
|
||||||
Reference in New Issue
Block a user