Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
bf329741
Unverified
Commit
bf329741
authored
Feb 14, 2020
by
Zachary Anderson
Committed by
GitHub
Feb 14, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[flutter_tools] Handle asynchronous errors writing to stdio (#50779)
parent
0b43647a
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
46 additions
and
5 deletions
+46
-5
io.dart
packages/flutter_tools/lib/src/base/io.dart
+5
-4
logger_test.dart
...es/flutter_tools/test/general.shard/base/logger_test.dart
+41
-1
No files found.
packages/flutter_tools/lib/src/base/io.dart
View file @
bf329741
...
...
@@ -47,6 +47,7 @@ import 'dart:io' as io
import
'package:meta/meta.dart'
;
import
'../globals.dart'
as
globals
;
import
'async_guard.dart'
;
import
'context.dart'
;
import
'process.dart'
;
...
...
@@ -271,15 +272,15 @@ class Stdio {
void
_stdioWrite
(
io
.
IOSink
sink
,
String
message
,
{
void
Function
(
String
,
dynamic
,
StackTrace
)
fallback
,
})
{
try
{
asyncGuard
<
void
>(()
async
{
sink
.
write
(
message
);
}
catch
(
err
,
stack
)
{
}
,
onError:
(
Object
error
,
StackTrace
stackTrace
)
{
if
(
fallback
==
null
)
{
print
(
message
);
}
else
{
fallback
(
message
,
err
,
stack
);
}
fallback
(
message
,
error
,
stackTrace
);
}
});
}
/// Adds [stream] to [stdout].
...
...
packages/flutter_tools/test/general.shard/base/logger_test.dart
View file @
bf329741
...
...
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import
'dart:async'
;
import
'dart:convert'
show
jsonEncode
;
import
'package:platform/platform.dart'
;
...
...
@@ -90,7 +91,7 @@ void main() {
});
});
testWithoutContext
(
'Logger does not throw when stdio write throws'
,
()
async
{
testWithoutContext
(
'Logger does not throw when stdio write throws
synchronously
'
,
()
async
{
final
MockStdout
stdout
=
MockStdout
();
final
MockStdout
stderr
=
MockStdout
();
final
ThrowingStdio
stdio
=
ThrowingStdio
(
stdout
,
stderr
);
...
...
@@ -119,6 +120,45 @@ void main() {
expect
(
stderrThrew
,
true
);
});
testWithoutContext
(
'Logger does not throw when stdio write throws asynchronously'
,
()
async
{
final
MockStdout
stdout
=
MockStdout
();
final
MockStdout
stderr
=
MockStdout
();
final
ThrowingStdio
stdio
=
ThrowingStdio
(
stdout
,
stderr
);
bool
stdoutThrew
=
false
;
bool
stderrThrew
=
false
;
final
Completer
<
void
>
stdoutCompleter
=
Completer
<
void
>();
final
Completer
<
void
>
stderrCompleter
=
Completer
<
void
>();
when
(
stdout
.
write
(
any
)).
thenAnswer
((
_
)
{
Zone
.
current
.
runUnaryGuarded
<
void
>((
_
)
{
stdoutThrew
=
true
;
stdoutCompleter
.
complete
();
throw
'Error'
;
},
null
);
});
when
(
stderr
.
write
(
any
)).
thenAnswer
((
_
)
{
Zone
.
current
.
runUnaryGuarded
<
void
>((
_
)
{
stderrThrew
=
true
;
stderrCompleter
.
complete
();
throw
'Error'
;
},
null
);
});
final
Logger
logger
=
StdoutLogger
(
terminal:
AnsiTerminal
(
stdio:
stdio
,
platform:
_kNoAnsiPlatform
,
),
stdio:
stdio
,
outputPreferences:
OutputPreferences
.
test
(),
timeoutConfiguration:
const
TimeoutConfiguration
(),
);
logger
.
printStatus
(
'message'
);
logger
.
printError
(
'error message'
);
await
stdoutCompleter
.
future
;
await
stderrCompleter
.
future
;
expect
(
stdoutThrew
,
true
);
expect
(
stderrThrew
,
true
);
});
group
(
'Spinners'
,
()
{
mocks
.
MockStdio
mockStdio
;
FakeStopwatch
mockStopwatch
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment