blob: 8d012eb842ca8b3955f2d7f006e1956184c4f98f [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));
});
});
});
}