Skip to content

Commit 4c0e6ef

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

File tree

2 files changed

+58
-13
lines changed

2 files changed

+58
-13
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: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,28 +42,58 @@ 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.emit("login", "master", captureAny)).thenAnswer((Invocation i) {
45+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
46+
Function fn = i.positionalArguments[1];
47+
fn("name", {'type': 'START'});
48+
});
49+
when(socket.emit("login", "master", captureAny))
50+
.thenAnswer((Invocation i) {
4651
Function fn = i.positionalArguments[2];
4752
fn('testChannel', 'err', 'data');
4853
});
4954
await devtools.connect();
5055
verify(socket.emit("login", "master", captureAny));
5156
});
5257
test('it sends the start message message', () async {
53-
when(socket.emit("login", "master", captureAny)).thenAnswer((Invocation i) {
58+
when(socket.emit("login", "master", captureAny))
59+
.thenAnswer((Invocation i) {
5460
Function fn = i.positionalArguments[2];
5561
fn('testChannel', 'err', 'data');
5662
});
5763
when(socket.id).thenReturn('testId');
64+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
65+
Function fn = i.positionalArguments[1];
66+
fn("name", {'type': 'START'});
67+
});
5868
connectResponse = await devtools.connect();
59-
verify(
60-
socket.emit("log", {'type': "START", 'id': 'testId', 'name': 'flutter'}, captureAny));
69+
verify(socket.emit("log",
70+
{'type': "START", 'id': 'testId', 'name': 'flutter'}, captureAny));
71+
});
72+
test('it is in STARTED state', () async {
73+
when(socket.connect()).thenAnswer((_) => new Future.value());
74+
when(socket.id).thenReturn('testId');
75+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
76+
Function fn = i.positionalArguments[1];
77+
fn("name", {'type': 'START'});
78+
});
79+
when(socket.emit("login", "master", captureAny))
80+
.thenAnswer((Invocation i) {
81+
Function fn = i.positionalArguments[2];
82+
fn('testChannel', 'err', 'data');
83+
});
84+
await devtools.connect();
85+
expect(devtools.status, RemoteDevToolsStatus.started);
6186
});
6287
test('it sends the state', () async {
63-
when(socket.emit("login", "master", captureAny)).thenAnswer((Invocation i) {
88+
when(socket.emit("login", "master", captureAny))
89+
.thenAnswer((Invocation i) {
6490
Function fn = i.positionalArguments[2];
6591
fn('testChannel', 'err', 'data');
6692
});
93+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
94+
Function fn = i.positionalArguments[1];
95+
fn("name", {'type': 'START'});
96+
});
6797
when(socket.id).thenReturn('testId');
6898
var store = MockStore();
6999
when(store.state).thenReturn('TEST STATE');
@@ -97,12 +127,17 @@ void main() {
97127
Function fn = i.positionalArguments[2];
98128
fn('testChannel', 'err', 'data');
99129
});
130+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
131+
Function fn = i.positionalArguments[1];
132+
return fn("name", {'type': 'START'});
133+
});
100134
when(socket.id).thenReturn('testId');
101135
when(socket.connect()).thenAnswer((_) => new Future.value());
102136
devtools = RemoteDevToolsMiddleware('example.com', socket: socket);
103137
await devtools.connect();
104138
});
105139
test('nothing sent if status is not started', () {
140+
devtools.status = RemoteDevToolsStatus.starting;
106141
devtools.call(store, TestActions.SomeAction, next.next);
107142
verifyNever(socket.emit(
108143
'log',
@@ -148,20 +183,16 @@ void main() {
148183
Function fn = i.positionalArguments[2];
149184
fn('testChannel', 'err', 'data');
150185
});
186+
when(socket.on("data", captureAny)).thenAnswer((Invocation i) {
187+
Function fn = i.positionalArguments[1];
188+
return fn("name", {'type': 'START'});
189+
});
151190
when(socket.id).thenReturn('testId');
152191
when(socket.connect()).thenAnswer((_) => new Future.value());
153192
devtools = RemoteDevToolsMiddleware('example.com', socket: socket);
154193
devtools.store = store;
155194
await devtools.connect();
156195
});
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-
});
165196
test('handles time travel', () {
166197
var remoteData = {
167198
'type': 'DISPATCH',

0 commit comments

Comments
 (0)