blob: 4208bb8663c3f19f5ac733991256f72c40aceebd [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// Echo server test program for testing sockets.
//
// VMOptions=
// VMOptions=--short_socket_read
// VMOptions=--short_socket_write
// VMOptions=--short_socket_read --short_socket_write
library ServerTest;
import "dart:io";
import "dart:isolate";
part "testing_server.dart";
class EchoServerTest {
static void testMain() {
EchoServerGame echoServerGame = new EchoServerGame.start();
}
}
class EchoServerGame {
static const MSGSIZE = 10;
static const MESSAGES = 100;
static const FIRSTCHAR = 65;
EchoServerGame.start()
: _receivePort = new ReceivePort(),
_sendPort = null,
_buffer = new List<int>.fixedLength(MSGSIZE),
_messages = 0 {
for (int i = 0; i < MSGSIZE; i++) {
_buffer[i] = FIRSTCHAR + i;
}
_sendPort = spawnFunction(startEchoServer);
initialize();
}
void sendData() {
Socket _socket;
void messageHandler() {
List<int> bufferReceived = new List<int>.fixedLength(MSGSIZE);
int bytesRead = 0;
void handleRead() {
bytesRead += _socket.readList(
bufferReceived, bytesRead, MSGSIZE - bytesRead);
if (bytesRead < MSGSIZE) {
// We check every time the whole buffer to verify data integrity.
for (int i = 0; i < bytesRead; i++) {
Expect.equals(FIRSTCHAR + i, bufferReceived[i]);
}
_socket.onData = handleRead;
} else {
// We check every time the whole buffer to verify data integrity.
for (int i = 0; i < MSGSIZE; i++) {
Expect.equals(FIRSTCHAR + i, bufferReceived[i]);
}
_messages++;
_socket.close();
if (_messages < MESSAGES) {
sendData();
} else {
shutdown();
}
}
}
handleRead();
}
void errorHandler(Exception e) {
Expect.fail("Socket error $e");
}
void connectHandler() {
void writeMessage() {
int bytesWritten = 0;
void handleWrite() {
bytesWritten += _socket.writeList(
_buffer, bytesWritten, MSGSIZE - bytesWritten);
if (bytesWritten < MSGSIZE) {
_socket.onWrite = handleWrite;
}
}
handleWrite();
}
_socket.onData = messageHandler;
_socket.onError = errorHandler;
writeMessage();
}
_socket = new Socket(TestingServer.HOST, _port);
if (_socket != null) {
_socket.onConnect = connectHandler;
} else {
Expect.fail("Socket creation failed");
}
}
void initialize() {
_receivePort.receive((var message, SendPort replyTo) {
_port = message;
sendData();
});
_sendPort.send(TestingServer.INIT, _receivePort.toSendPort());
}
void shutdown() {
_sendPort.send(TestingServer.SHUTDOWN, _receivePort.toSendPort());
_receivePort.close();
}
int _port;
ReceivePort _receivePort;
SendPort _sendPort;
List<int> _buffer;
int _messages;
}
void startEchoServer() {
var server = new EchoServer();
port.receive(server.dispatch);
}
class EchoServer extends TestingServer {
static const msgSize = EchoServerGame.MSGSIZE;
void onConnection(Socket connection) {
void messageHandler() {
List<int> buffer = new List<int>.fixedLength(msgSize);
int bytesRead = 0;
void handleRead() {
int read = connection.readList(buffer, bytesRead, msgSize - bytesRead);
if (read > 0) {
bytesRead += read;
if (bytesRead < msgSize) {
// We check every time the whole buffer to verify data integrity.
for (int i = 0; i < bytesRead; i++) {
Expect.equals(EchoServerGame.FIRSTCHAR + i, buffer[i]);
}
connection.onData = handleRead;
} else {
// We check every time the whole buffer to verify data integrity.
for (int i = 0; i < msgSize; i++) {
Expect.equals(EchoServerGame.FIRSTCHAR + i, buffer[i]);
}
void writeMessage() {
int bytesWritten = 0;
void handleWrite() {
int written = connection.writeList(
buffer, bytesWritten, msgSize - bytesWritten);
bytesWritten += written;
if (bytesWritten < msgSize) {
connection.onWrite = handleWrite;
} else {
connection.close(true);
}
}
handleWrite();
}
writeMessage();
}
}
}
handleRead();
}
void closeHandler() {
connection.close();
}
void errorHandler(Exception e) {
Expect.fail("Socket error $e");
}
connection.onData = messageHandler;
connection.onClosed = closeHandler;
connection.onError = errorHandler;
}
}
main() {
EchoServerTest.testMain();
}