proto-socket/dart/test/browser_ws_runtime_helper.dart
toki 5df325bf96 feat: Dart Web E2E 테스트 및 크로스 테스트 추가
- Dart Web 브라우저 E2E 테스트 프레임워크 추가
- browser_ws_dart_io_test, browser_ws_kotlin_test 등 브라우저 통합 테스트 추가
- Dart Web 크로스테스트 케이스 추가 (go, kotlin, python, typescript)
- TypeScript 브라우저 웹소켓 클라이언트 개선
- Node.js 웹소켓 서버 클라이언트 업데이트
- 테스트 실행 매트릭스 스킬 및 스크립트 업데이트
- README.md 문서 업데이트
2026-05-25 00:30:37 +09:00

79 lines
2.5 KiB
Dart

@TestOn('browser')
import 'dart:async';
import 'package:test/test.dart';
import 'package:proto_socket/proto_socket.dart';
const _host = '127.0.0.1';
const _wsPath = '/';
const _heartbeatIntervalSeconds = 30;
const _heartbeatWaitSeconds = 10;
class _BrowserWsClient extends WsProtobufClient {
_BrowserWsClient(dynamic ws)
: super(ws, _heartbeatIntervalSeconds, _heartbeatWaitSeconds, {
TestData.getDefault().info_.qualifiedMessageName: TestData.fromBuffer,
});
}
void registerBrowserWsTests({
required String serverLabel,
required int port,
required String serverPushMessage,
}) {
group('Dart Web WsProtobufClient talks to $serverLabel WS server', () {
test('send-push: fire-and-forget and receive push', () async {
final ws = await WsProtobufClient.connect(_host, port, path: _wsPath);
final client = _BrowserWsClient(ws);
final pushCompleter = Completer<TestData>();
client.addListener<TestData>((data) {
if (!pushCompleter.isCompleted) {
pushCompleter.complete(data);
}
});
await client.send(TestData()
..index = 101
..message = 'fire from dart web client');
final push =
await pushCompleter.future.timeout(const Duration(seconds: 5));
expect(push.index, equals(200));
expect(push.message, equals(serverPushMessage));
await client.close();
});
test('request-response: single and concurrent requests', () async {
final ws = await WsProtobufClient.connect(_host, port, path: _wsPath);
final client = _BrowserWsClient(ws);
final single = await client
.sendRequest<TestData, TestData>(TestData()
..index = 21
..message = 'single request from dart web')
.timeout(const Duration(seconds: 5));
expect(single.index, equals(42));
expect(single.message, equals('echo: single request from dart web'));
final futures = <Future<void>>[];
for (var i = 0; i < 5; i++) {
futures.add(() async {
final index = 30 + i;
final message = 'multi request $i from dart web';
final res = await client
.sendRequest<TestData, TestData>(TestData()
..index = index
..message = message)
.timeout(const Duration(seconds: 5));
expect(res.index, equals(index * 2));
expect(res.message, equals('echo: $message'));
}());
}
await Future.wait(futures);
await client.close();
});
});
}