// 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));
  });
}
