Fuchsia sockets:

- Remove CheckConnect.
  - Enable NODELAY.
  - Add testSimpleReadWriteClose to hello_fuchsia_test.

Add stub implementation of OS::MaxRSS so Observatory can load without crashing the target VM.

R=asiva@google.com

Review URL: https://codereview.chromium.org/2523133002 .
This commit is contained in:
Ryan Macnak 2016-11-22 16:52:21 -08:00
parent 05a6045674
commit 171da0489f
3 changed files with 150 additions and 40 deletions

View file

@ -95,39 +95,11 @@ static intptr_t Create(const RawAddr& addr) {
}
static intptr_t CheckConnect(intptr_t fd) {
int val;
socklen_t vallen = sizeof(val);
LOG_INFO("CheckConnect: calling getsockopt(%ld)\n", fd);
intptr_t result = getsockopt(fd, SOL_SOCKET, SO_ERROR, &val, &vallen);
if (result != 0) {
FATAL1("CheckConnect: getsockopt(%ld) failed\n", fd);
} else if (vallen != sizeof(val)) {
FATAL1("CheckConnect: getsockopt(%ld) vallen != sizeof(val)!?!?\n", fd);
} else if (val != 0) {
LOG_ERR("CheckConnect: getsockopt(%ld) val = %d\n", fd, val);
return val;
}
LOG_INFO("CheckConnect: getsockopt(%ld) connected\n", fd);
return 0;
}
static intptr_t Connect(intptr_t fd, const RawAddr& addr) {
LOG_INFO("Connect: calling connect(%ld)\n", fd);
intptr_t result = NO_RETRY_EXPECTED(
connect(fd, &addr.addr, SocketAddress::GetAddrLength(addr)));
if ((result == 0) || (errno == EINPROGRESS)) {
LOG_INFO("Connect: connect(%ld) succeeded\n", fd);
intptr_t error = 0;
// TODO(US-87): When the issue is resolved this check is no longer needed.
while ((error = CheckConnect(fd)) != 0) {
if (error != EINPROGRESS) {
errno = error;
FDUtils::SaveErrorAndClose(fd);
return -1;
}
}
return fd;
}
LOG_ERR("Connect: connect(%ld) failed\n", fd);
@ -489,15 +461,10 @@ bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
// TODO(US-94): Enable.
#if 0
int on = enabled ? 1 : 0;
return NO_RETRY_EXPECTED(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY,
reinterpret_cast<char*>(&on),
sizeof(on))) == 0;
#else
return true;
#endif
}

View file

@ -45,7 +45,145 @@ testSimpleConnect() async {
await socket.close();
}
testSimpleReadWrite({bool dropReads}) async {
testSimpleReadWriteClose() async {
// This test creates a server and a client connects. The client then
// writes and the server echos. When the client finishes fully reading the
// echo, it closes the socket. When the server receives the close event, it
// closes its end of the socket too.
const messageSize = 1000;
int serverReadCount = 0;
int clientReadCount = 0;
List<int> createTestData() {
return new List<int>.generate(messageSize, (index) => index & 0xff);
}
void verifyTestData(List<int> data) {
assert(messageSize == data.length);
List<int> expected = createTestData();
for (int i = 0; i < messageSize; i++) {
assert(expected[i] == data[i]);
}
}
var server = await RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0);
server.listen((client) {
int bytesRead = 0;
int bytesWritten = 0;
bool closedEventReceived = false;
List<int> data = new List<int>(messageSize);
bool doneReading = false;
client.writeEventsEnabled = false;
client.listen((event) {
switch (event) {
case RawSocketEvent.READ:
if (doneReading) {
break;
}
print("client READ event bytesRead = $bytesRead");
assert(bytesWritten == 0);
assert(client.available() > 0);
var buffer = client.read(200);
print("client READ event: read ${buffer.length} more bytes");
data.setRange(bytesRead, bytesRead + buffer.length, buffer);
bytesRead += buffer.length;
if (bytesRead == data.length) {
verifyTestData(data);
print("client READ event. Done reading, enabling writes");
client.writeEventsEnabled = true;
doneReading = true;
}
break;
case RawSocketEvent.WRITE:
assert(!client.writeEventsEnabled);
bytesWritten += client.write(
data, bytesWritten, data.length - bytesWritten);
print("client WRITE event: $bytesWritten written");
if (bytesWritten < data.length) {
client.writeEventsEnabled = true;
}
if (bytesWritten == data.length) {
print("client WRITE event: done writing.");
}
break;
case RawSocketEvent.READ_CLOSED:
print("client READ_CLOSED event");
client.close();
server.close();
break;
case RawSocketEvent.CLOSED:
assert(!closedEventReceived);
print("client CLOSED event");
closedEventReceived = true;
break;
default: throw "Unexpected event $event";
}
},
onError: (e) { print("client ERROR $e"); },
onDone: () {assert(closedEventReceived);});
});
{
var completer = new Completer();
var socket = await RawSocket.connect("127.0.0.1", server.port);
int bytesRead = 0;
int bytesWritten = 0;
bool closedEventReceived = false;
List<int> data = createTestData();
socket.listen((event) {
switch (event) {
case RawSocketEvent.READ:
assert(socket.available() > 0);
print("server READ event: ${bytesRead} read");
var buffer = socket.read();
print("server READ event: read ${buffer.length} more bytes");
data.setRange(bytesRead, bytesRead + buffer.length, buffer);
bytesRead += buffer.length;
if (bytesRead == messageSize) {
print("server READ event: done reading");
socket.close();
}
break;
case RawSocketEvent.WRITE:
assert(bytesRead == 0);
assert(!socket.writeEventsEnabled);
bytesWritten += socket.write(
data, bytesWritten, data.length - bytesWritten);
print("server WRITE event: ${bytesWritten} written");
if (bytesWritten < data.length) {
socket.writeEventsEnabled = true;
} else {
print("server WRITE event: done writing");
data = new List<int>(messageSize);
}
break;
case RawSocketEvent.READ_CLOSED:
print("server READ_CLOSED event");
verifyTestData(data);
socket.close();
break;
case RawSocketEvent.CLOSED:
assert(!closedEventReceived);
print("server CLOSED event");
closedEventReceived = true;
break;
default: throw "Unexpected event $event";
}
},
onError: (e) { print("server ERROR $e"); },
onDone: () {
assert(closedEventReceived);
completer.complete(null);
});
return completer.future;
}
}
testSimpleReadWriteShutdown({bool dropReads}) async {
// This test creates a server and a client connects. The client then
// writes and the server echos. When the server has finished its
// echo it half-closes. When the client gets the close event is
@ -199,8 +337,9 @@ Future testGoogleUrl(SecurityContext context, String outcome) async {
// built-in root certificate authority.
try {
// First, check if the lookup works.
await InternetAddress.lookup('www.google.com');
var request = await client.getUrl(Uri.parse('http://www.google.com'));
var address = await InternetAddress.lookup('www.google.com');
print(address);
var request = await client.getUrl(Uri.parse('http://www.google.com/'));
request.followRedirects = false;
var response = await request.close();
assert('pass' == outcome);
@ -230,10 +369,14 @@ main() async {
await testSimpleConnect();
print("testSimpleConnect done");
print("testSimpleReadWriteClose");
await testSimpleReadWriteClose();
print("testSimpleReadWriteClose done");
// TODO(US-81): Enable.
// print("testSimpleReadWrite");
// await testSimpleReadWrite(dropReads: false);
// print("testSimpleReadWrite done");
// print("testSimpleReadWriteShutdown");
// await testSimpleReadWriteShutdown(dropReads: false);
// print("testSimpleReadWriteShutdown done");
print("testGoogleUrl");
await testGoogleUrl(null, 'pass');

View file

@ -157,7 +157,7 @@ int OS::NumberOfAvailableProcessors() {
uintptr_t OS::MaxRSS() {
UNIMPLEMENTED();
// TODO(US-95): Implement.
return 0;
}