Skip to content

Commit 1b91f2f

Browse files
author
Dennis Trautwein
committed
Let connect() method wait until there is an actual connection
1 parent a79e46e commit 1b91f2f

File tree

2 files changed

+51
-10
lines changed

2 files changed

+51
-10
lines changed

lib/src/remote_devtools_middleware.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class RemoteDevToolsMiddleware extends MiddlewareClass {
5555
this._channel = await this._login();
5656
_setStatus(RemoteDevToolsStatus.starting);
5757
this._relay('START');
58+
await this._waitForStart();
5859
this.socket.on(_channel, (String name, dynamic data) {
5960
this.handleEventFromRemote(data as Map<String, dynamic>);
6061
});
@@ -63,6 +64,19 @@ class RemoteDevToolsMiddleware extends MiddlewareClass {
6364
}
6465
}
6566

67+
Future<dynamic> _waitForStart() {
68+
final c = Completer();
69+
this.socket.on(_channel, (String name, dynamic data) {
70+
if (data['type'] == "START") {
71+
_setStatus(RemoteDevToolsStatus.started);
72+
c.complete();
73+
} else {
74+
c.completeError(data);
75+
}
76+
});
77+
return c.future;
78+
}
79+
6680
Future<String> _login() {
6781
Completer<String> c = new Completer<String>();
6882
this.socket.emit('login', 'master', (String name, dynamic error, dynamic data) {

test/remote_devtools_middleware_test.dart

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ void main() {
4242
test('it sends the login message', () async {
4343
when(socket.connect()).thenAnswer((_) => new Future.value());
4444
when(socket.id).thenReturn('testId');
45+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
46+
Function fn = i.positionalArguments[1];
47+
fn("name", {'type': 'START'});
48+
});
4549
when(socket.emit("login", "master", captureAny)).thenAnswer((Invocation i) {
4650
Function fn = i.positionalArguments[2];
4751
fn('testChannel', 'err', 'data');
@@ -55,15 +59,37 @@ void main() {
5559
fn('testChannel', 'err', 'data');
5660
});
5761
when(socket.id).thenReturn('testId');
62+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
63+
Function fn = i.positionalArguments[1];
64+
fn("name", {'type': 'START'});
65+
});
5866
connectResponse = await devtools.connect();
59-
verify(
60-
socket.emit("log", {'type': "START", 'id': 'testId', 'name': 'flutter'}, captureAny));
67+
verify(socket.emit("log", {'type': "START", 'id': 'testId', 'name': 'flutter'}, captureAny));
68+
});
69+
test('it is in STARTED state', () async {
70+
when(socket.connect()).thenAnswer((_) => new Future.value());
71+
when(socket.id).thenReturn('testId');
72+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
73+
Function fn = i.positionalArguments[1];
74+
fn("name", {'type': 'START'});
75+
});
76+
when(socket.emit("login", "master", captureAny))
77+
.thenAnswer((Invocation i) {
78+
Function fn = i.positionalArguments[2];
79+
fn('testChannel', 'err', 'data');
80+
});
81+
await devtools.connect();
82+
expect(devtools.status, RemoteDevToolsStatus.started);
6183
});
6284
test('it sends the state', () async {
6385
when(socket.emit("login", "master", captureAny)).thenAnswer((Invocation i) {
6486
Function fn = i.positionalArguments[2];
6587
fn('testChannel', 'err', 'data');
6688
});
89+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
90+
Function fn = i.positionalArguments[1];
91+
fn("name", {'type': 'START'});
92+
});
6793
when(socket.id).thenReturn('testId');
6894
var store = MockStore();
6995
when(store.state).thenReturn('TEST STATE');
@@ -97,12 +123,17 @@ void main() {
97123
Function fn = i.positionalArguments[2];
98124
fn('testChannel', 'err', 'data');
99125
});
126+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
127+
Function fn = i.positionalArguments[1];
128+
return fn("name", {'type': 'START'});
129+
});
100130
when(socket.id).thenReturn('testId');
101131
when(socket.connect()).thenAnswer((_) => new Future.value());
102132
devtools = RemoteDevToolsMiddleware('example.com', socket: socket);
103133
await devtools.connect();
104134
});
105135
test('nothing sent if status is not started', () {
136+
devtools.status = RemoteDevToolsStatus.starting;
106137
devtools.call(store, TestActions.SomeAction, next.next);
107138
verifyNever(socket.emit(
108139
'log',
@@ -148,20 +179,16 @@ void main() {
148179
Function fn = i.positionalArguments[2];
149180
fn('testChannel', 'err', 'data');
150181
});
182+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
183+
Function fn = i.positionalArguments[1];
184+
return fn("name", {'type': 'START'});
185+
});
151186
when(socket.id).thenReturn('testId');
152187
when(socket.connect()).thenAnswer((_) => new Future.value());
153188
devtools = RemoteDevToolsMiddleware('example.com', socket: socket);
154189
devtools.store = store;
155190
await devtools.connect();
156191
});
157-
test('START response sets status to STARTED', () {
158-
var remoteData = {
159-
'type': 'START',
160-
};
161-
expect(devtools.status, RemoteDevToolsStatus.starting);
162-
devtools.handleEventFromRemote(remoteData);
163-
expect(devtools.status, RemoteDevToolsStatus.started);
164-
});
165192
test('handles time travel', () {
166193
var remoteData = {
167194
'type': 'DISPATCH',

0 commit comments

Comments
 (0)