blob: 04abec1195fa43d10598e7869b196c6031cb2bd9 [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 'package:http2/src/frames/frame_defragmenter.dart';
import 'package:http2/src/frames/frames.dart';
import 'package:test/test.dart';
import '../error_matchers.dart';
void main() {
group('frames', () {
group('frame-defragmenter', () {
UnknownFrame unknownFrame() {
return UnknownFrame(FrameHeader(0, 0, 0, 1), []);
}
HeadersFrame headersFrame(List<int> data,
{bool fragmented = false, int streamId = 1}) {
var flags = fragmented ? 0 : HeadersFrame.FLAG_END_HEADERS;
var header =
FrameHeader(data.length, FrameType.HEADERS, flags, streamId);
return HeadersFrame(header, 0, false, null, null, data);
}
PushPromiseFrame pushPromiseFrame(List<int> data,
{bool fragmented = false, int streamId = 1}) {
var flags = fragmented ? 0 : HeadersFrame.FLAG_END_HEADERS;
var header =
FrameHeader(data.length, FrameType.PUSH_PROMISE, flags, streamId);
return PushPromiseFrame(header, 0, 44, data);
}
ContinuationFrame continuationFrame(List<int> data,
{bool fragmented = false, int streamId = 1}) {
var flags = fragmented ? 0 : ContinuationFrame.FLAG_END_HEADERS;
var header =
FrameHeader(data.length, FrameType.CONTINUATION, flags, streamId);
return ContinuationFrame(header, data);
}
test('unknown-frame', () {
var defrag = FrameDefragmenter();
expect(defrag.tryDefragmentFrame(unknownFrame()) is UnknownFrame, true);
});
test('fragmented-headers-frame', () {
var defrag = FrameDefragmenter();
var f1 = headersFrame([1, 2, 3], fragmented: true);
var f2 = continuationFrame([4, 5, 6], fragmented: true);
var f3 = continuationFrame([7, 8, 9], fragmented: false);
expect(defrag.tryDefragmentFrame(f1), isNull);
expect(defrag.tryDefragmentFrame(f2), isNull);
var h = defrag.tryDefragmentFrame(f3) as HeadersFrame;
expect(h.hasEndHeadersFlag, isTrue);
expect(h.hasEndStreamFlag, isFalse);
expect(h.hasPaddedFlag, isFalse);
expect(h.padLength, 0);
expect(h.headerBlockFragment, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
});
test('fragmented-push-promise-frame', () {
var defrag = FrameDefragmenter();
var f1 = pushPromiseFrame([1, 2, 3], fragmented: true);
var f2 = continuationFrame([4, 5, 6], fragmented: true);
var f3 = continuationFrame([7, 8, 9], fragmented: false);
expect(defrag.tryDefragmentFrame(f1), isNull);
expect(defrag.tryDefragmentFrame(f2), isNull);
var h = defrag.tryDefragmentFrame(f3) as PushPromiseFrame;
expect(h.hasEndHeadersFlag, isTrue);
expect(h.hasPaddedFlag, isFalse);
expect(h.padLength, 0);
expect(h.headerBlockFragment, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
});
test('fragmented-headers-frame--wrong-id', () {
var defrag = FrameDefragmenter();
var f1 = headersFrame([1, 2, 3], fragmented: true, streamId: 1);
var f2 = continuationFrame([4, 5, 6], fragmented: true, streamId: 2);
expect(defrag.tryDefragmentFrame(f1), isNull);
expect(
() => defrag.tryDefragmentFrame(f2), throwsA(isProtocolException));
});
test('fragmented-push-promise-frame', () {
var defrag = FrameDefragmenter();
var f1 = pushPromiseFrame([1, 2, 3], fragmented: true, streamId: 1);
var f2 = continuationFrame([4, 5, 6], fragmented: true, streamId: 2);
expect(defrag.tryDefragmentFrame(f1), isNull);
expect(
() => defrag.tryDefragmentFrame(f2), throwsA(isProtocolException));
});
test('fragmented-headers-frame--no-continuation-frame', () {
var defrag = FrameDefragmenter();
var f1 = headersFrame([1, 2, 3], fragmented: true);
var f2 = unknownFrame();
expect(defrag.tryDefragmentFrame(f1), isNull);
expect(
() => defrag.tryDefragmentFrame(f2), throwsA(isProtocolException));
});
test('fragmented-push-promise-no-continuation-frame', () {
var defrag = FrameDefragmenter();
var f1 = pushPromiseFrame([1, 2, 3], fragmented: true);
var f2 = unknownFrame();
expect(defrag.tryDefragmentFrame(f1), isNull);
expect(
() => defrag.tryDefragmentFrame(f2), throwsA(isProtocolException));
});
test('push-without-headres-or-push-promise-frame', () {
var defrag = FrameDefragmenter();
var f1 = continuationFrame([4, 5, 6], fragmented: true, streamId: 1);
expect(defrag.tryDefragmentFrame(f1), equals(f1));
});
});
});
}