Skip to content

Commit 65a17b2

Browse files
author
Mad Sheogorath
committed
v1.0.0 preparations.
1 parent 4dfeaa9 commit 65a17b2

File tree

9 files changed

+271
-3
lines changed

9 files changed

+271
-3
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,4 +495,4 @@ Future<void> main() async {
495495
It's available for Dart only. Currently there are no plans to implement it for any other language. However if developers will find this package useful then it may be implemented for Node.JS and C++ in the future.
496496

497497
## P.S.
498-
I really hope you enjoy it ;)
498+
I hope you enjoy it ;)

lib/core/console.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
part of serveme;
22

3+
final Stream<List<int>> stdinStream = stdin.asBroadcastStream();
4+
35
class CommandHandler {
46
CommandHandler({required this.function, this.validator, this.usage});
57

@@ -12,7 +14,7 @@ class Console {
1214
Console(this._server) {
1315
stdin.echoMode = false;
1416
stdin.lineMode = false;
15-
_listener = stdin.listen(_key);
17+
_listener = stdinStream.listen(_key);
1618
}
1719

1820
final ServeMe<ServeMeClient> _server;

lib/serveme.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,10 @@ class ServeMe<C extends ServeMeClient> {
188188
return _running;
189189
}
190190

191+
Future<void> stop() async {
192+
await _shutdown(ProcessSignal.sigquit, 100500);
193+
}
194+
191195
Future<void> _shutdown(ProcessSignal event, [int code = 100500]) async {
192196
await log('Server shutdown initiated: $event');
193197
await _events.dispatch(StopEvent(event, code));
@@ -207,6 +211,6 @@ class ServeMe<C extends ServeMeClient> {
207211
await log('Server stopped');
208212
await console.dispose();
209213
await _logger.dispose();
210-
exit(code);
214+
if (code != 100500) exit(code);
211215
}
212216
}

pubspec.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ dependencies:
1212
yaml: ^3.1.0
1313
connectme: ^1.1.1
1414
packme: ^1.1.5
15+
dev_dependencies:
16+
test: ^1.17.11

test/config_test.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
port: 31337
2+
3+
debug: true
4+
debug_log: test/debug_test.log
5+
error_log: test/error_test.log
6+
7+
modules:
8+
- test

test/generated/test.generated.dart

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import 'package:packme/packme.dart';
2+
3+
class TestResponse extends PackMeMessage {
4+
TestResponse({
5+
required this.responseParam,
6+
});
7+
TestResponse.$empty();
8+
9+
late double responseParam;
10+
11+
@override
12+
int $estimate() {
13+
$reset();
14+
int bytes = 16;
15+
return bytes;
16+
}
17+
18+
@override
19+
void $pack() {
20+
$initPack(216725115);
21+
$packDouble(responseParam);
22+
}
23+
24+
@override
25+
void $unpack() {
26+
$initUnpack();
27+
responseParam = $unpackDouble();
28+
}
29+
30+
@override
31+
String toString() {
32+
return 'TestResponse\x1b[0m(responseParam: ${PackMe.dye(responseParam)})';
33+
}
34+
}
35+
36+
class TestRequest extends PackMeMessage {
37+
TestRequest({
38+
required this.requestParam,
39+
});
40+
TestRequest.$empty();
41+
42+
late double requestParam;
43+
44+
TestResponse $response({
45+
required double responseParam,
46+
}) {
47+
final TestResponse message = TestResponse(responseParam: responseParam);
48+
message.$request = this;
49+
return message;
50+
}
51+
52+
@override
53+
int $estimate() {
54+
$reset();
55+
int bytes = 16;
56+
return bytes;
57+
}
58+
59+
@override
60+
void $pack() {
61+
$initPack(764832169);
62+
$packDouble(requestParam);
63+
}
64+
65+
@override
66+
void $unpack() {
67+
$initUnpack();
68+
requestParam = $unpackDouble();
69+
}
70+
71+
@override
72+
String toString() {
73+
return 'TestRequest\x1b[0m(requestParam: ${PackMe.dye(requestParam)})';
74+
}
75+
}
76+
77+
final Map<int, PackMeMessage Function()> testMessageFactory = <int, PackMeMessage Function()>{
78+
216725115: () => TestResponse.$empty(),
79+
764832169: () => TestRequest.$empty(),
80+
};

test/modules/test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import 'package:serveme/serveme.dart';
2+
3+
class TestModule extends Module<ServeMeClient> {
4+
@override
5+
Future<void> init() async {
6+
}
7+
8+
@override
9+
void run() {
10+
}
11+
12+
@override
13+
Future<void> dispose() async {
14+
}
15+
}

test/packme/test.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"test": [
3+
{
4+
"request_param": "double"
5+
},
6+
{
7+
"response_param": "double"
8+
}
9+
]
10+
}

test/serveme_test.dart

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
import 'dart:async';
2+
import 'dart:io';
3+
import 'dart:typed_data';
4+
import 'package:connectme/connectme.dart';
5+
import 'package:serveme/serveme.dart';
6+
import 'package:test/test.dart';
7+
import 'generated/test.generated.dart';
8+
import 'modules/test.dart';
9+
10+
void main() {
11+
late ServeMe<ServeMeClient> server;
12+
late ConnectMeClient client;
13+
late Timer timer;
14+
late TestModule module;
15+
16+
group('Connection tests', () {
17+
test('ServeMe.run() and ConnectMe.connect()', () async {
18+
timer = Timer(const Duration(seconds: 2), () => fail('Operation timed out'));
19+
server = ServeMe<ServeMeClient>(
20+
configFile: 'test/config_test.yaml',
21+
modules: <String, Module<ServeMeClient>>{
22+
'test': module = TestModule(),
23+
},
24+
);
25+
await server.run();
26+
module.events.listen<ConnectEvent<ServeMeClient>>(expectAsync1<Future<void>, dynamic>((dynamic event) async {
27+
expect(event.client, isA<ServeMeClient>());
28+
}));
29+
module.events.listen<DisconnectEvent<ServeMeClient>>(expectAsync1<Future<void>, dynamic>((dynamic event) async {
30+
expect(event.client, isA<ServeMeClient>());
31+
}));
32+
client = await ConnectMe.connect('ws://127.0.0.1:31337',
33+
onConnect: expectAsync0<void>(() {}),
34+
);
35+
await client.close();
36+
await server.stop();
37+
timer.cancel();
38+
});
39+
});
40+
41+
group('ServeMe data exchange tests', () {
42+
setUp(() async {
43+
timer = Timer(const Duration(seconds: 2), () => fail('Operation timed out'));
44+
server = ServeMe<ServeMeClient>(
45+
configFile: 'test/config_test.yaml',
46+
modules: <String, Module<ServeMeClient>>{
47+
'test': module = TestModule(),
48+
},
49+
);
50+
await server.run();
51+
client = await ConnectMe.connect('ws://127.0.0.1:31337');
52+
});
53+
54+
tearDown(() async {
55+
await client.close();
56+
await server.stop();
57+
timer.cancel();
58+
});
59+
60+
test('Client sends String to server', () async {
61+
final Completer<String> completer = Completer<String>();
62+
server.listen<String>((String message, ConnectMeClient client) async {
63+
completer.complete(message);
64+
});
65+
client.send('Test message from client');
66+
expect(await completer.future, 'Test message from client');
67+
});
68+
69+
test('Server broadcasts String to clients', () async {
70+
final Completer<String> completer = Completer<String>();
71+
client.listen<String>((String message) {
72+
completer.complete(message);
73+
});
74+
server.broadcast('Test message from server');
75+
expect(await completer.future, 'Test message from server');
76+
});
77+
78+
test('Client sends Uint8List to server', () async {
79+
final Completer<Uint8List> completer = Completer<Uint8List>();
80+
server.listen<Uint8List>((Uint8List message, ConnectMeClient client) async {
81+
completer.complete(message);
82+
});
83+
client.send(Uint8List.fromList(<int>[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]));
84+
expect(await completer.future, Uint8List.fromList(<int>[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]));
85+
});
86+
87+
test('Server broadcasts Uint8List to clients', () async {
88+
final Completer<Uint8List> completer = Completer<Uint8List>();
89+
client.listen<Uint8List>((Uint8List message) {
90+
completer.complete(message);
91+
});
92+
server.broadcast(Uint8List.fromList(<int>[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]));
93+
expect(await completer.future, Uint8List.fromList(<int>[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]));
94+
});
95+
96+
test('Client sends TestResponse query to server', () async {
97+
server.register(testMessageFactory);
98+
server.listen<TestRequest>((TestRequest request, ConnectMeClient client) async {
99+
client.send(request.$response(responseParam: request.requestParam));
100+
});
101+
client.register(testMessageFactory);
102+
final TestResponse response = await client.query<TestResponse>(TestRequest(requestParam: 3.1415926535));
103+
expect(response.responseParam, 3.1415926535);
104+
});
105+
106+
test('Server sends TestResponse query to client', () async {
107+
client.register(testMessageFactory);
108+
client.listen<TestRequest>((TestRequest request) {
109+
client.send(request.$response(responseParam: request.requestParam));
110+
});
111+
server.register(testMessageFactory);
112+
final TestResponse response = await server.clients.first.query<TestResponse>(TestRequest(requestParam: 3.1415926535));
113+
expect(response.responseParam, 3.1415926535);
114+
});
115+
});
116+
117+
group('ServeMe API tests', () {
118+
setUp(() async {
119+
timer = Timer(const Duration(seconds: 2), () => fail('Operation timed out'));
120+
server = ServeMe<ServeMeClient>(
121+
configFile: 'test/config_test.yaml',
122+
modules: <String, Module<ServeMeClient>>{
123+
'test': module = TestModule(),
124+
},
125+
);
126+
await server.run();
127+
});
128+
129+
tearDown(() async {
130+
await server.stop();
131+
timer.cancel();
132+
});
133+
134+
test('TickEvent dispatch and handle', () async {
135+
module.events.listen<TickEvent>(expectAsync1<Future<void>, dynamic>((dynamic event) async {
136+
expect(event, isA<TickEvent>());
137+
}));
138+
});
139+
140+
test('Scheduler', () async {
141+
final Task task = Task(DateTime.now(), expectAsync1<Future<void>, dynamic>((dynamic time) async {
142+
expect(time, isA<DateTime>());
143+
}));
144+
module.scheduler.schedule(task);
145+
});
146+
});
147+
}

0 commit comments

Comments
 (0)