blob: 6bfa49c495bc7735ffa71e42ce414ddca5385a01 [file] [log] [blame]
// Copyright (c) 2015, 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.
import 'dart:async';
import 'package:http2/transport.dart';
import 'package:test/test.dart';
import 'helper.dart';
void main() {
group('streams', () {
streamTest('single-header-request--empty-response',
(ClientTransportConnection client,
ServerTransportConnection server) async {
var expectedHeaders = [Header.ascii('key', 'value')];
server.incomingStreams.listen(expectAsync1((TransportStream sStream) {
sStream.incomingMessages.listen(expectAsync1((StreamMessage msg) {
expect(msg, isA<HeadersStreamMessage>());
var headersMsg = msg as HeadersStreamMessage;
expectHeadersEqual(headersMsg.headers, expectedHeaders);
}), onDone: expectAsync0(() {}));
sStream.outgoingMessages.close();
}));
TransportStream cStream =
client.makeRequest(expectedHeaders, endStream: true);
expectEmptyStream(cStream.incomingMessages);
});
streamTest('multi-header-request--empty-response',
(ClientTransportConnection client,
ServerTransportConnection server) async {
var expectedHeaders = [Header.ascii('key', 'value')];
server.incomingStreams.listen(expectAsync1((TransportStream sStream) {
sStream.incomingMessages.listen(
expectAsync1((StreamMessage msg) {
expect(msg, isA<HeadersStreamMessage>());
var headersMsg = msg as HeadersStreamMessage;
expectHeadersEqual(headersMsg.headers, expectedHeaders);
}, count: 3),
onDone: expectAsync0(() {}));
sStream.outgoingMessages.close();
}));
TransportStream cStream = client.makeRequest(expectedHeaders);
cStream.sendHeaders(expectedHeaders);
cStream.sendHeaders(expectedHeaders, endStream: true);
expectEmptyStream(cStream.incomingMessages);
});
streamTest('multi-data-request--empty-response',
(ClientTransportConnection client,
ServerTransportConnection server) async {
var expectedHeaders = [Header.ascii('key', 'value')];
var chunks = [
[1],
[2],
[3]
];
server.incomingStreams
.listen(expectAsync1((TransportStream sStream) async {
var isFirst = true;
var receivedChunks = <List<int>>[];
sStream.incomingMessages.listen(
expectAsync1((StreamMessage msg) {
if (isFirst) {
isFirst = false;
expect(msg, isA<HeadersStreamMessage>());
var headersMsg = msg as HeadersStreamMessage;
expectHeadersEqual(headersMsg.headers, expectedHeaders);
} else {
expect(msg, isA<DataStreamMessage>());
var dataMsg = msg as DataStreamMessage;
receivedChunks.add(dataMsg.bytes);
}
}, count: 1 + chunks.length), onDone: expectAsync0(() {
expect(receivedChunks, chunks);
}));
unawaited(sStream.outgoingMessages.close());
}));
TransportStream cStream = client.makeRequest(expectedHeaders);
chunks.forEach(cStream.sendData);
unawaited(cStream.outgoingMessages.close());
expectEmptyStream(cStream.incomingMessages);
});
streamTest('single-header-request--single-headers-response',
(ClientTransportConnection client,
ServerTransportConnection server) async {
var expectedHeaders = [Header.ascii('key', 'value')];
server.incomingStreams.listen(expectAsync1((TransportStream sStream) {
sStream.incomingMessages.listen(expectAsync1((StreamMessage msg) {
expect(msg, isA<HeadersStreamMessage>());
var headersMsg = msg as HeadersStreamMessage;
expectHeadersEqual(headersMsg.headers, expectedHeaders);
}), onDone: expectAsync0(() {}));
sStream.sendHeaders(expectedHeaders, endStream: true);
}));
TransportStream cStream =
client.makeRequest(expectedHeaders, endStream: true);
cStream.incomingMessages.listen(expectAsync1((StreamMessage msg) {
expect(msg, isA<HeadersStreamMessage>());
var headersMsg = msg as HeadersStreamMessage;
expectHeadersEqual(headersMsg.headers, expectedHeaders);
}), onDone: expectAsync0(() {}));
});
streamTest('single-header-request--multi-headers-response',
(ClientTransportConnection client,
ServerTransportConnection server) async {
var expectedHeaders = [Header.ascii('key', 'value')];
server.incomingStreams.listen(expectAsync1((TransportStream sStream) {
sStream.incomingMessages.listen(expectAsync1((StreamMessage msg) {
expect(msg, isA<HeadersStreamMessage>());
var headersMsg = msg as HeadersStreamMessage;
expectHeadersEqual(headersMsg.headers, expectedHeaders);
}), onDone: expectAsync0(() {}));
sStream.sendHeaders(expectedHeaders);
sStream.sendHeaders(expectedHeaders);
sStream.sendHeaders(expectedHeaders, endStream: true);
}));
TransportStream cStream =
client.makeRequest(expectedHeaders, endStream: true);
cStream.incomingMessages.listen(expectAsync1((StreamMessage msg) {
expect(msg, isA<HeadersStreamMessage>());
var headersMsg = msg as HeadersStreamMessage;
expectHeadersEqual(headersMsg.headers, expectedHeaders);
}, count: 3));
});
streamTest('single-header-request--multi-data-response',
(ClientTransportConnection client,
ServerTransportConnection server) async {
var expectedHeaders = [Header.ascii('key', 'value')];
var chunks = [
[1],
[2],
[3]
];
server.incomingStreams.listen(expectAsync1((TransportStream sStream) {
sStream.incomingMessages.listen(expectAsync1((StreamMessage msg) {
expect(msg, isA<HeadersStreamMessage>());
var headersMsg = msg as HeadersStreamMessage;
expectHeadersEqual(headersMsg.headers, expectedHeaders);
}), onDone: expectAsync0(() {}));
chunks.forEach(sStream.sendData);
sStream.outgoingMessages.close();
}));
TransportStream cStream = client.makeRequest(expectedHeaders);
unawaited(cStream.outgoingMessages.close());
var i = 0;
cStream.incomingMessages.listen(expectAsync1((StreamMessage msg) {
expect(
msg,
isA<DataStreamMessage>()
.having((m) => m.bytes, 'bytes', chunks[i++]));
}, count: chunks.length));
});
});
streamTest('single-data-request--data-trailer-response',
(ClientTransportConnection client,
ServerTransportConnection server) async {
var expectedHeaders = [Header.ascii('key', 'value')];
var chunk = [1];
server.incomingStreams.listen(expectAsync1((TransportStream sStream) async {
var isFirst = true;
List<int>? receivedChunk;
sStream.incomingMessages.listen(
expectAsync1((StreamMessage msg) {
if (isFirst) {
isFirst = false;
expect(msg, isA<HeadersStreamMessage>());
expect(msg.endStream, false);
var headersMsg = msg as HeadersStreamMessage;
expectHeadersEqual(headersMsg.headers, expectedHeaders);
} else {
expect(msg, isA<DataStreamMessage>());
expect(msg.endStream, true);
expect(receivedChunk, null);
var dataMsg = msg as DataStreamMessage;
receivedChunk = dataMsg.bytes;
}
}, count: 2), onDone: expectAsync0(() {
expect(receivedChunk, chunk);
sStream.sendData([2]);
sStream.sendHeaders(expectedHeaders, endStream: true);
}));
}));
TransportStream cStream = client.makeRequest(expectedHeaders);
cStream.sendData(chunk, endStream: true);
var isFirst = true;
cStream.incomingMessages.listen(expectAsync1((StreamMessage msg) {
if (isFirst) {
expect(msg, const TypeMatcher<DataStreamMessage>());
final data = msg as DataStreamMessage;
expect(data.bytes, [2]);
isFirst = false;
} else {
expect(msg, const TypeMatcher<HeadersStreamMessage>());
final trailer = msg as HeadersStreamMessage;
expect(trailer.endStream, true);
expectHeadersEqual(trailer.headers, expectedHeaders);
}
}, count: 2));
});
}