diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-02-04 18:40:27 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-02-04 18:40:27 -0800 |
commit | 4d92685fcbb75db54a5f1a090c31a8fd67b8b1f7 (patch) | |
tree | f96cf9f6644485380cf19cf4387da943d1b9ba04 | |
parent | 85e298313f68f41e63634166854a81ae1b250c62 (diff) | |
parent | 76772b4ed707fa017747bfcb4e63a8ffdb3fc18f (diff) |
Merge pull request #821 from caiiiycuk/recv_test
Test for recv (partial)
-rwxr-xr-x | tests/runner.py | 27 | ||||
-rw-r--r-- | tests/websockets_partial.c | 124 |
2 files changed, 151 insertions, 0 deletions
diff --git a/tests/runner.py b/tests/runner.py index 02ec11c8..62600830 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -10590,6 +10590,33 @@ elif 'browser' in str(sys.argv): finally: self.clean_pids() + def test_websockets_partial(self): + def partial(q): + import socket + + q.put(None) # No sub-process to start + ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + ssock.bind(("127.0.0.1", 8990)) + ssock.listen(2) + while True: + csock, addr = ssock.accept() + print "Connection from %s" % repr(addr) + csock.send("\x09\x01\x02\x03\x04\x05\x06\x07\x08\x09") + csock.send("\x08\x01\x02\x03\x04\x05\x06\x07\x08") + csock.send("\x07\x01\x02\x03\x04\x05\x06\x07") + csock.send("\x06\x01\x02\x03\x04\x05\x06") + csock.send("\x05\x01\x02\x03\x04\x05") + csock.send("\x04\x01\x02\x03\x04") + csock.send("\x03\x01\x02\x03") + csock.send("\x02\x01\x02") + csock.send("\x01\x01") + + try: + with self.WebsockHarness(8990, partial): + self.btest('websockets_partial.c', expected='165') + finally: + self.clean_pids() + def make_relay_server(self, port1, port2): def relay_server(q): print >> sys.stderr, 'creating relay server on ports %d,%d' % (port1, port2) diff --git a/tests/websockets_partial.c b/tests/websockets_partial.c new file mode 100644 index 00000000..deacdb6b --- /dev/null +++ b/tests/websockets_partial.c @@ -0,0 +1,124 @@ +#include <errno.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <assert.h> +#if EMSCRIPTEN +#include <emscripten.h> +#endif + +int SocketFD; +int done = 0; +int sum = 0; + +void iter(void *arg) { + char buffer[1024]; + char packetLength; + int n; + int i; + + if (done) { + return; + } + + n = recv(SocketFD, buffer, 1, 0); + + if (n == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return; //try again + } + + fprintf(stderr, "unexcepted end of data"); + exit(EXIT_FAILURE); + } + + if (n != 1) { + fprintf(stderr, "should read 1 byte"); + exit(EXIT_FAILURE); + } + + packetLength = buffer[0]; + n = recv(SocketFD, buffer, packetLength, 0); + + if (n != packetLength) { + fprintf(stderr, "lost packet data, expected: %d readed: %d", packetLength, n); + exit(EXIT_FAILURE); + } + + for (i = 0; i < packetLength; ++i) { + if (buffer[i] != i+1) { + fprintf(stderr, "packet corrupted, expected: %d, actual: %d", i+1, buffer[i]); + exit(EXIT_FAILURE); + } + + sum += buffer[i]; + } + + if (packetLength == buffer[0]) { // \x01\x01 - end marker + shutdown(SocketFD, SHUT_RDWR); + close(SocketFD); + done = 1; + + #if EMSCRIPTEN + int result = sum; + REPORT_RESULT(); + #endif + } +} + +int main(void) +{ + struct sockaddr_in stSockAddr; + int Res; + SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + + if (-1 == SocketFD) + { + perror("cannot create socket"); + exit(EXIT_FAILURE); + } + + memset(&stSockAddr, 0, sizeof(stSockAddr)); + + stSockAddr.sin_family = AF_INET; + stSockAddr.sin_port = htons( +#if EMSCRIPTEN + 8991 +#else + 8990 +#endif + ); + Res = inet_pton(AF_INET, "127.0.0.1", &stSockAddr.sin_addr); + + if (0 > Res) { + perror("error: first parameter is not a valid address family"); + close(SocketFD); + exit(EXIT_FAILURE); + } else if (0 == Res) { + perror("char string (second parameter does not contain valid ipaddress)"); + close(SocketFD); + exit(EXIT_FAILURE); + } + + if (-1 == connect(SocketFD, (struct sockaddr *)&stSockAddr, sizeof(stSockAddr))) { + perror("connect failed"); + close(SocketFD); + exit(EXIT_FAILURE); + + } + +#if EMSCRIPTEN + emscripten_set_main_loop(iter, 0, 0); +#else + while (!done) iter(NULL); +#endif + + return EXIT_SUCCESS; +} + |