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
5a34e798
Unverified
Commit
5a34e798
authored
Jul 18, 2019
by
Emmanuel Garcia
Committed by
GitHub
Jul 18, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Catch exceptions thrown by runChecked* when possible (#36109)
parent
7b0cc505
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
243 additions
and
52 deletions
+243
-52
android_device.dart
packages/flutter_tools/lib/src/android/android_device.dart
+34
-13
application_package.dart
packages/flutter_tools/lib/src/application_package.dart
+15
-10
upgrade.dart
packages/flutter_tools/lib/src/commands/upgrade.dart
+20
-7
version.dart
packages/flutter_tools/lib/src/commands/version.dart
+14
-4
code_signing.dart
packages/flutter_tools/lib/src/ios/code_signing.dart
+20
-5
xcodeproj.dart
packages/flutter_tools/lib/src/ios/xcodeproj.dart
+14
-9
android_device_test.dart
...tools/test/general.shard/android/android_device_test.dart
+34
-4
application_package_test.dart
...er_tools/test/general.shard/application_package_test.dart
+9
-0
version_test.dart
...utter_tools/test/general.shard/commands/version_test.dart
+21
-0
code_signing_test.dart
...utter_tools/test/general.shard/ios/code_signing_test.dart
+56
-0
xcodeproj_test.dart
.../flutter_tools/test/general.shard/ios/xcodeproj_test.dart
+6
-0
No files found.
packages/flutter_tools/lib/src/android/android_device.dart
View file @
5a34e798
...
...
@@ -378,10 +378,14 @@ class AndroidDevice extends Device {
printError
(
'
$installResult
'
);
return
false
;
}
try
{
await
runAdbCheckedAsync
(<
String
>[
'shell'
,
'echo'
,
'-n'
,
_getSourceSha1
(
app
),
'>'
,
_getDeviceSha1Path
(
app
),
]);
}
on
ProcessException
catch
(
error
)
{
printError
(
'adb shell failed to write the SHA hash:
$error
.'
);
return
false
;
}
return
true
;
}
...
...
@@ -390,7 +394,13 @@ class AndroidDevice extends Device {
if
(!
await
_checkForSupportedAdbVersion
()
||
!
await
_checkForSupportedAndroidVersion
())
return
false
;
final
String
uninstallOut
=
(
await
runCheckedAsync
(
adbCommandForDevice
(<
String
>[
'uninstall'
,
app
.
id
]))).
stdout
;
String
uninstallOut
;
try
{
uninstallOut
=
(
await
runCheckedAsync
(
adbCommandForDevice
(<
String
>[
'uninstall'
,
app
.
id
]))).
stdout
;
}
catch
(
error
)
{
printError
(
'adb uninstall failed:
$error
'
);
return
false
;
}
final
RegExp
failureExp
=
RegExp
(
r'^Failure.*$'
,
multiLine:
true
);
final
String
failure
=
failureExp
.
stringMatch
(
uninstallOut
);
if
(
failure
!=
null
)
{
...
...
@@ -615,13 +625,18 @@ class AndroidDevice extends Device {
static
final
RegExp
_timeRegExp
=
RegExp
(
r'^\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}'
,
multiLine:
true
);
/// Return the most recent timestamp in the Android log or
null
if there is
/// Return the most recent timestamp in the Android log or
[null]
if there is
/// no available timestamp. The format can be passed to logcat's -T option.
String
get
lastLogcatTimestamp
{
final
String
output
=
runAdbCheckedSync
(<
String
>[
String
output
;
try
{
output
=
runAdbCheckedSync
(<
String
>[
'shell'
,
'-x'
,
'logcat'
,
'-v'
,
'time'
,
'-t'
,
'1'
,
]);
}
catch
(
error
)
{
printError
(
'Failed to extract the most recent timestamp from the Android log:
$error
.'
);
return
null
;
}
final
Match
timeMatch
=
_timeRegExp
.
firstMatch
(
output
);
return
timeMatch
?.
group
(
0
);
}
...
...
@@ -940,9 +955,15 @@ class _AndroidDevicePortForwarder extends DevicePortForwarder {
List
<
ForwardedPort
>
get
forwardedPorts
{
final
List
<
ForwardedPort
>
ports
=
<
ForwardedPort
>[];
final
String
stdout
=
runCheckedSync
(
device
.
adbCommandForDevice
(
String
stdout
;
try
{
stdout
=
runCheckedSync
(
device
.
adbCommandForDevice
(
<
String
>[
'forward'
,
'--list'
]
));
}
catch
(
error
)
{
printError
(
'Failed to list forwarded ports:
$error
.'
);
return
ports
;
}
final
List
<
String
>
lines
=
LineSplitter
.
split
(
stdout
).
toList
();
for
(
String
line
in
lines
)
{
...
...
packages/flutter_tools/lib/src/application_package.dart
View file @
5a34e798
...
...
@@ -114,16 +114,21 @@ class AndroidApk extends ApplicationPackage {
return
null
;
}
final
List
<
String
>
aaptArgs
=
<
String
>[
String
apptStdout
;
try
{
apptStdout
=
runCheckedSync
(<
String
>[
aaptPath
,
'dump'
,
'xmltree'
,
apk
.
path
,
'AndroidManifest.xml'
,
];
]);
}
catch
(
error
)
{
printError
(
'Failed to extract manifest from APK:
$error
.'
);
return
null
;
}
final
ApkManifestData
data
=
ApkManifestData
.
parseFromXmlDump
(
runCheckedSync
(
aaptArgs
));
final
ApkManifestData
data
=
ApkManifestData
.
parseFromXmlDump
(
apptStdout
);
if
(
data
==
null
)
{
printError
(
'Unable to read manifest info from
${apk.path}
.'
);
...
...
packages/flutter_tools/lib/src/commands/upgrade.dart
View file @
5a34e798
...
...
@@ -8,6 +8,7 @@ import 'package:meta/meta.dart';
import
'../base/common.dart'
;
import
'../base/file_system.dart'
;
import
'../base/io.dart'
;
import
'../base/os.dart'
;
import
'../base/process.dart'
;
import
'../cache.dart'
;
...
...
@@ -98,8 +99,14 @@ class UpgradeCommandRunner {
'git'
,
'status'
,
'-s'
],
workingDirectory:
Cache
.
flutterRoot
);
return
result
.
stdout
.
trim
().
isNotEmpty
;
}
catch
(
e
)
{
throwToolExit
(
'git status failed:
$e
'
);
}
on
ProcessException
catch
(
error
)
{
throwToolExit
(
'The tool could not verify the status of the current flutter checkout. '
'This might be due to git not being installed or an internal error.'
'If it is okay to ignore potential local changes, then re-run this'
'command with --force.'
'
\n
Error:
$error
.'
);
}
return
false
;
}
...
...
@@ -132,11 +139,17 @@ class UpgradeCommandRunner {
}
else
{
tag
=
'v
${gitTagVersion.x}
.
${gitTagVersion.y}
.
${gitTagVersion.z}
'
;
}
final
RunResult
runResult
=
await
runCheckedAsync
(<
String
>[
try
{
await
runCheckedAsync
(<
String
>[
'git'
,
'reset'
,
'--hard'
,
tag
,
],
workingDirectory:
Cache
.
flutterRoot
);
if
(
runResult
.
exitCode
!=
0
)
{
throwToolExit
(
'Failed to restore branch from hotfix.'
);
}
on
ProcessException
catch
(
error
)
{
throwToolExit
(
'Unable to upgrade Flutter: The tool could not update to the version
$tag
. '
'This may be due to git not being installed or an internal error.'
'Please ensure that git is installed on your computer and retry again.'
'
\n
Error:
$error
.'
);
}
}
...
...
packages/flutter_tools/lib/src/commands/version.dart
View file @
5a34e798
...
...
@@ -6,6 +6,7 @@ import 'dart:async';
import
'../base/common.dart'
;
import
'../base/file_system.dart'
;
import
'../base/io.dart'
;
import
'../base/os.dart'
;
import
'../base/process.dart'
;
import
'../base/version.dart'
;
...
...
@@ -34,10 +35,19 @@ class VersionCommand extends FlutterCommand {
Version
minSupportedVersion
=
Version
.
parse
(
'1.2.1'
);
Future
<
List
<
String
>>
getTags
()
async
{
final
RunResult
runResult
=
await
runCheckedAsync
(
RunResult
runResult
;
try
{
runResult
=
await
runCheckedAsync
(
<
String
>[
'git'
,
'tag'
,
'-l'
,
'v*'
,
'--sort=-creatordate'
],
workingDirectory:
Cache
.
flutterRoot
,
);
}
on
ProcessException
catch
(
error
)
{
throwToolExit
(
'Unable to get the tags. '
'This might be due to git not being installed or an internal error'
'
\n
Error:
$error
.'
);
}
return
runResult
.
toString
().
split
(
'
\n
'
);
}
...
...
packages/flutter_tools/lib/src/ios/code_signing.dart
View file @
5a34e798
...
...
@@ -120,7 +120,16 @@ Future<Map<String, String>> getCodeSigningIdentityDevelopmentTeam({
const
List
<
String
>
findIdentityCommand
=
<
String
>[
'security'
,
'find-identity'
,
'-p'
,
'codesigning'
,
'-v'
];
final
List
<
String
>
validCodeSigningIdentities
=
runCheckedSync
(
findIdentityCommand
)
String
findIdentityStdout
;
try
{
findIdentityStdout
=
runCheckedSync
(
findIdentityCommand
);
}
catch
(
error
)
{
printTrace
(
'Unexpected failure from find-identity:
$error
.'
);
return
null
;
}
final
List
<
String
>
validCodeSigningIdentities
=
findIdentityStdout
.
split
(
'
\n
'
)
.
map
<
String
>((
String
outputLine
)
{
return
_securityFindIdentityDeveloperIdentityExtractionPattern
...
...
@@ -148,12 +157,18 @@ Future<Map<String, String>> getCodeSigningIdentityDevelopmentTeam({
if
(
signingCertificateId
==
null
)
return
null
;
final
String
signingCertificate
=
runCheckedSync
(
String
signingCertificateStdout
;
try
{
signingCertificateStdout
=
runCheckedSync
(
<
String
>[
'security'
,
'find-certificate'
,
'-c'
,
signingCertificateId
,
'-p'
]
);
}
catch
(
error
)
{
printTrace
(
'Couldn
\'
t find the certificate:
$error
.'
);
return
null
;
}
final
Process
opensslProcess
=
await
runCommand
(
const
<
String
>[
'openssl'
,
'x509'
,
'-subject'
]);
await
(
opensslProcess
.
stdin
..
write
(
signingCertificate
)).
close
();
await
(
opensslProcess
.
stdin
..
write
(
signingCertificate
Stdout
)).
close
();
final
String
opensslOutput
=
await
utf8
.
decodeStream
(
opensslProcess
.
stdout
);
// Fire and forget discard of the stderr stream so we don't hold onto resources.
...
...
packages/flutter_tools/lib/src/ios/xcodeproj.dart
View file @
5a34e798
...
...
@@ -174,6 +174,7 @@ class XcodeProjectInterpreter {
}
Map
<
String
,
String
>
getBuildSettings
(
String
projectPath
,
String
target
)
{
try
{
final
String
out
=
runCheckedSync
(<
String
>[
_executable
,
'-project'
,
...
...
@@ -183,6 +184,10 @@ class XcodeProjectInterpreter {
'-showBuildSettings'
,
],
workingDirectory:
projectPath
);
return
parseXcodeBuildSettings
(
out
);
}
catch
(
error
)
{
printTrace
(
'Unexpected failure to get the build settings:
$error
.'
);
return
const
<
String
,
String
>{};
}
}
Future
<
XcodeProjectInfo
>
getInfo
(
String
projectPath
)
async
{
...
...
packages/flutter_tools/test/general.shard/android/android_device_test.dart
View file @
5a34e798
...
...
@@ -10,6 +10,7 @@ import 'package:file/memory.dart';
import
'package:flutter_tools/src/android/android_console.dart'
;
import
'package:flutter_tools/src/android/android_device.dart'
;
import
'package:flutter_tools/src/android/android_sdk.dart'
;
import
'package:flutter_tools/src/application_package.dart'
;
import
'package:flutter_tools/src/base/config.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/io.dart'
;
...
...
@@ -398,6 +399,28 @@ flutter:
},
overrides:
<
Type
,
Generator
>{
ProcessManager:
()
=>
mockProcessManager
,
});
testUsingContext
(
'forwardedPorts returns empty list when forward failed'
,
()
{
when
(
mockProcessManager
.
runSync
(
argThat
(
contains
(
'forward'
))))
.
thenReturn
(
ProcessResult
(
0
,
1
,
''
,
''
));
expect
(
forwarder
.
forwardedPorts
,
equals
(
const
<
ForwardedPort
>[]));
},
overrides:
<
Type
,
Generator
>{
ProcessManager:
()
=>
mockProcessManager
,
});
});
group
(
'lastLogcatTimestamp'
,
()
{
final
ProcessManager
mockProcessManager
=
MockProcessManager
();
final
AndroidDevice
device
=
AndroidDevice
(
'1234'
);
testUsingContext
(
'returns null if shell command failed'
,
()
async
{
when
(
mockProcessManager
.
runSync
(
argThat
(
contains
(
'logcat'
))))
.
thenReturn
(
ProcessResult
(
0
,
1
,
''
,
''
));
expect
(
device
.
lastLogcatTimestamp
,
isNull
);
},
overrides:
<
Type
,
Generator
>{
ProcessManager:
()
=>
mockProcessManager
,
});
});
}
...
...
@@ -601,3 +624,10 @@ class MockUnresponsiveAndroidConsoleSocket extends Mock implements Socket {
@override
void
add
(
List
<
int
>
data
)
{}
}
class
AndroidPackageTest
extends
ApplicationPackage
{
AndroidPackageTest
()
:
super
(
id:
'app-id'
);
@override
String
get
name
=>
'app-package'
;
}
packages/flutter_tools/test/general.shard/application_package_test.dart
View file @
5a34e798
...
...
@@ -129,6 +129,15 @@ void main() {
),
);
},
overrides:
overrides
);
testUsingContext
(
'returns null when failed to extract manifest'
,
()
async
{
final
AndroidSdkVersion
sdkVersion
=
MockitoAndroidSdkVersion
();
when
(
sdk
.
latestVersion
).
thenReturn
(
sdkVersion
);
when
(
mockProcessManager
.
runSync
(
argThat
(
contains
(
'logcat'
))))
.
thenReturn
(
ProcessResult
(
0
,
1
,
''
,
''
));
expect
(
AndroidApk
.
fromApk
(
null
),
isNull
);
},
overrides:
overrides
);
});
group
(
'ApkManifestData'
,
()
{
...
...
packages/flutter_tools/test/general.shard/commands/version_test.dart
View file @
5a34e798
...
...
@@ -6,6 +6,7 @@ import 'dart:async';
import
'dart:convert'
;
import
'dart:io'
;
import
'package:flutter_tools/src/base/common.dart'
;
import
'package:flutter_tools/src/base/io.dart'
;
import
'package:flutter_tools/src/cache.dart'
;
import
'package:flutter_tools/src/commands/version.dart'
;
...
...
@@ -59,12 +60,29 @@ void main() {
},
overrides:
<
Type
,
Generator
>{
ProcessManager:
()
=>
MockProcessManager
(),
});
testUsingContext
(
'exit tool if can
\'
t get the tags'
,
()
async
{
final
VersionCommand
command
=
VersionCommand
();
try
{
await
command
.
getTags
();
fail
(
'ToolExit expected'
);
}
catch
(
e
)
{
expect
(
e
,
isInstanceOf
<
ToolExit
>());
}
},
overrides:
<
Type
,
Generator
>{
ProcessManager:
()
=>
MockProcessManager
(
failGitTag:
true
),
});
});
}
class
MockProcessManager
extends
Mock
implements
ProcessManager
{
MockProcessManager
({
this
.
failGitTag
=
false
});
String
version
=
''
;
bool
failGitTag
;
@override
Future
<
ProcessResult
>
run
(
List
<
dynamic
>
command
,
{
...
...
@@ -76,6 +94,9 @@ class MockProcessManager extends Mock implements ProcessManager {
Encoding
stderrEncoding
=
systemEncoding
,
})
async
{
if
(
command
[
0
]
==
'git'
&&
command
[
1
]
==
'tag'
)
{
if
(
failGitTag
)
{
return
ProcessResult
(
0
,
1
,
''
,
''
);
}
return
ProcessResult
(
0
,
0
,
'v10.0.0
\r\n
v20.0.0'
,
''
);
}
if
(
command
[
0
]
==
'git'
&&
command
[
1
]
==
'checkout'
)
{
...
...
packages/flutter_tools/test/general.shard/ios/code_signing_test.dart
View file @
5a34e798
...
...
@@ -440,6 +440,62 @@ void main() {
Config:
()
=>
mockConfig
,
AnsiTerminal:
()
=>
testTerminal
,
});
testUsingContext
(
'find-identity failure'
,
()
async
{
when
(
mockProcessManager
.
runSync
(<
String
>[
'which'
,
'security'
]))
.
thenReturn
(
exitsHappy
);
when
(
mockProcessManager
.
runSync
(<
String
>[
'which'
,
'openssl'
]))
.
thenReturn
(
exitsHappy
);
when
(
mockProcessManager
.
runSync
(
argThat
(
contains
(
'find-identity'
)),
environment:
anyNamed
(
'environment'
),
workingDirectory:
anyNamed
(
'workingDirectory'
),
)).
thenReturn
(
ProcessResult
(
0
,
1
,
''
,
''
));
final
Map
<
String
,
String
>
signingConfigs
=
await
getCodeSigningIdentityDevelopmentTeam
(
iosApp:
app
);
expect
(
signingConfigs
,
isNull
);
},
overrides:
<
Type
,
Generator
>{
ProcessManager:
()
=>
mockProcessManager
,
Config:
()
=>
mockConfig
,
AnsiTerminal:
()
=>
testTerminal
,
});
testUsingContext
(
'find-certificate failure'
,
()
async
{
when
(
mockProcessManager
.
runSync
(<
String
>[
'which'
,
'security'
]))
.
thenReturn
(
exitsHappy
);
when
(
mockProcessManager
.
runSync
(<
String
>[
'which'
,
'openssl'
]))
.
thenReturn
(
exitsHappy
);
when
(
mockProcessManager
.
runSync
(
argThat
(
contains
(
'find-identity'
)),
environment:
anyNamed
(
'environment'
),
workingDirectory:
anyNamed
(
'workingDirectory'
),
)).
thenReturn
(
ProcessResult
(
1
,
// pid
0
,
// exitCode
'''
1) 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 "iPhone Developer: Profile 1 (1111AAAA11)"
2) da4b9237bacccdf19c0760cab7aec4a8359010b0 "iPhone Developer: Profile 2 (2222BBBB22)"
3) 5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 "iPhone Developer: Profile 3 (3333CCCC33)"
3 valid identities found'''
,
''
,
));
mockTerminalStdInStream
=
Stream
<
String
>.
fromFuture
(
Future
<
String
>.
value
(
'3'
));
when
(
mockProcessManager
.
runSync
(
<
String
>[
'security'
,
'find-certificate'
,
'-c'
,
'3333CCCC33'
,
'-p'
],
environment:
anyNamed
(
'environment'
),
workingDirectory:
anyNamed
(
'workingDirectory'
),
)).
thenReturn
(
ProcessResult
(
1
,
1
,
''
,
''
));
final
Map
<
String
,
String
>
signingConfigs
=
await
getCodeSigningIdentityDevelopmentTeam
(
iosApp:
app
);
expect
(
signingConfigs
,
isNull
);
},
overrides:
<
Type
,
Generator
>{
ProcessManager:
()
=>
mockProcessManager
,
Config:
()
=>
mockConfig
,
AnsiTerminal:
()
=>
testTerminal
,
});
});
}
...
...
packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart
View file @
5a34e798
...
...
@@ -143,6 +143,12 @@ void main() {
.
thenReturn
(
ProcessResult
(
1
,
0
,
'Xcode 8.3.3
\n
Build version 8E3004b'
,
''
));
expect
(
xcodeProjectInterpreter
.
isInstalled
,
isTrue
);
});
testUsingOsxContext
(
'build settings is empty when xcodebuild failed to get the build settings'
,
()
{
when
(
mockProcessManager
.
runSync
(
argThat
(
contains
(
xcodebuild
))))
.
thenReturn
(
ProcessResult
(
0
,
1
,
''
,
''
));
expect
(
xcodeProjectInterpreter
.
getBuildSettings
(
''
,
''
),
const
<
String
,
String
>{});
});
});
group
(
'Xcode project properties'
,
()
{
test
(
'properties from default project can be parsed'
,
()
{
...
...
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