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
53fee1be
Unverified
Commit
53fee1be
authored
Sep 22, 2020
by
Dan Field
Committed by
GitHub
Sep 22, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Revert "Stream logging from attached debugger on iOS (#66092)" (#66359)
This reverts commit
5c858036
.
parent
511367aa
Changes
7
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
245 additions
and
838 deletions
+245
-838
devices.dart
packages/flutter_tools/lib/src/ios/devices.dart
+9
-63
fallback_discovery.dart
packages/flutter_tools/lib/src/ios/fallback_discovery.dart
+17
-17
ios_deploy.dart
packages/flutter_tools/lib/src/ios/ios_deploy.dart
+15
-229
protocol_discovery.dart
packages/flutter_tools/lib/src/protocol_discovery.dart
+4
-7
ios_deploy_test.dart
...flutter_tools/test/general.shard/ios/ios_deploy_test.dart
+42
-227
ios_device_logger_test.dart
..._tools/test/general.shard/ios/ios_device_logger_test.dart
+127
-260
ios_device_start_prebuilt_test.dart
...est/general.shard/ios/ios_device_start_prebuilt_test.dart
+31
-35
No files found.
packages/flutter_tools/lib/src/ios/devices.dart
View file @
53fee1be
...
@@ -212,9 +212,6 @@ class IOSDevice extends Device {
...
@@ -212,9 +212,6 @@ class IOSDevice extends Device {
DevicePortForwarder
_portForwarder
;
DevicePortForwarder
_portForwarder
;
@visibleForTesting
IOSDeployDebugger
iosDeployDebugger
;
@override
@override
Future
<
bool
>
get
isLocalEmulator
async
=>
false
;
Future
<
bool
>
get
isLocalEmulator
async
=>
false
;
...
@@ -398,38 +395,23 @@ class IOSDevice extends Device {
...
@@ -398,38 +395,23 @@ class IOSDevice extends Device {
timeout:
timeoutConfiguration
.
slowOperation
);
timeout:
timeoutConfiguration
.
slowOperation
);
try
{
try
{
ProtocolDiscovery
observatoryDiscovery
;
ProtocolDiscovery
observatoryDiscovery
;
int
installationResult
=
1
;
if
(
debuggingOptions
.
debuggingEnabled
)
{
if
(
debuggingOptions
.
debuggingEnabled
)
{
_logger
.
printTrace
(
'Debugging is enabled, connecting to observatory'
);
_logger
.
printTrace
(
'Debugging is enabled, connecting to observatory'
);
iosDeployDebugger
=
_iosDeploy
.
prepareDebuggerForLaunch
(
deviceId:
id
,
bundlePath:
bundle
.
path
,
launchArguments:
launchArguments
,
interfaceType:
interfaceType
,
);
final
DeviceLogReader
deviceLogReader
=
getLogReader
(
app:
package
);
if
(
deviceLogReader
is
IOSDeviceLogReader
)
{
deviceLogReader
.
debuggerStream
=
iosDeployDebugger
;
}
observatoryDiscovery
=
ProtocolDiscovery
.
observatory
(
observatoryDiscovery
=
ProtocolDiscovery
.
observatory
(
deviceLogReader
,
getLogReader
(
app:
package
)
,
portForwarder:
portForwarder
,
portForwarder:
portForwarder
,
throttleDuration:
fallbackPollingDelay
,
throttleTimeout:
fallbackThrottleTimeout
??
const
Duration
(
seconds:
5
),
hostPort:
debuggingOptions
.
hostVmServicePort
,
hostPort:
debuggingOptions
.
hostVmServicePort
,
devicePort:
debuggingOptions
.
deviceVmServicePort
,
devicePort:
debuggingOptions
.
deviceVmServicePort
,
ipv6:
ipv6
,
ipv6:
ipv6
,
throttleTimeout:
fallbackThrottleTimeout
??
const
Duration
(
seconds:
1
),
);
);
installationResult
=
await
iosDeployDebugger
.
launchAndAttach
()
?
0
:
1
;
}
}
else
{
final
int
installationResult
=
await
_iosDeploy
.
runApp
(
installationResult
=
await
_iosDeploy
.
launchApp
(
deviceId:
id
,
deviceId:
id
,
bundlePath:
bundle
.
path
,
bundlePath:
bundle
.
path
,
launchArguments:
launchArguments
,
launchArguments:
launchArguments
,
interfaceType:
interfaceType
,
interfaceType:
interfaceType
,
);
);
}
if
(
installationResult
!=
0
)
{
if
(
installationResult
!=
0
)
{
_logger
.
printError
(
'Could not run
${bundle.path}
on
$id
.'
);
_logger
.
printError
(
'Could not run
${bundle.path}
on
$id
.'
);
_logger
.
printError
(
'Try launching Xcode and selecting "Product > Run" to fix the problem:'
);
_logger
.
printError
(
'Try launching Xcode and selecting "Product > Run" to fix the problem:'
);
...
@@ -483,11 +465,7 @@ class IOSDevice extends Device {
...
@@ -483,11 +465,7 @@ class IOSDevice extends Device {
IOSApp
app
,
{
IOSApp
app
,
{
String
userIdentifier
,
String
userIdentifier
,
})
async
{
})
async
{
// If the debugger is not attached, killing the ios-deploy process won't stop the app.
// Currently we don't have a way to stop an app running on iOS.
if
(
iosDeployDebugger
!=
null
&&
iosDeployDebugger
.
debuggerAttached
)
{
// Avoid null.
return
iosDeployDebugger
?.
exit
()
==
true
;
}
return
false
;
return
false
;
}
}
...
@@ -677,13 +655,6 @@ class IOSDeviceLogReader extends DeviceLogReader {
...
@@ -677,13 +655,6 @@ class IOSDeviceLogReader extends DeviceLogReader {
// Matches a syslog line from any app.
// Matches a syslog line from any app.
RegExp
_anyLineRegex
;
RegExp
_anyLineRegex
;
// Logging from native code/Flutter engine is prefixed by timestamp and process metadata:
// 2020-09-15 19:15:10.931434-0700 Runner[541:226276] Did finish launching.
// 2020-09-15 19:15:10.931434-0700 Runner[541:226276] [Category] Did finish launching.
//
// Logging from the dart code has no prefixing metadata.
final
RegExp
_debuggerLoggingRegex
=
RegExp
(
r'^\S* \S* \S*\[[0-9:]*] (.*)'
);
StreamController
<
String
>
_linesController
;
StreamController
<
String
>
_linesController
;
List
<
StreamSubscription
<
void
>>
_loggingSubscriptions
;
List
<
StreamSubscription
<
void
>>
_loggingSubscriptions
;
...
@@ -716,10 +687,6 @@ class IOSDeviceLogReader extends DeviceLogReader {
...
@@ -716,10 +687,6 @@ class IOSDeviceLogReader extends DeviceLogReader {
}
}
void
logMessage
(
vm_service
.
Event
event
)
{
void
logMessage
(
vm_service
.
Event
event
)
{
if
(
_iosDeployDebugger
!=
null
&&
_iosDeployDebugger
.
debuggerAttached
)
{
// Prefer the more complete logs from the attached debugger.
return
;
}
final
String
message
=
processVmServiceMessage
(
event
);
final
String
message
=
processVmServiceMessage
(
event
);
if
(
message
.
isNotEmpty
)
{
if
(
message
.
isNotEmpty
)
{
_linesController
.
add
(
message
);
_linesController
.
add
(
message
);
...
@@ -732,26 +699,6 @@ class IOSDeviceLogReader extends DeviceLogReader {
...
@@ -732,26 +699,6 @@ class IOSDeviceLogReader extends DeviceLogReader {
]);
]);
}
}
/// Log reader will listen to [debugger.logLines] and will detach debugger on dispose.
set
debuggerStream
(
IOSDeployDebugger
debugger
)
{
// Logging is gathered from syslog on iOS 13 and earlier.
if
(
_majorSdkVersion
<
_minimumUniversalLoggingSdkVersion
)
{
return
;
}
_iosDeployDebugger
=
debugger
;
// Add the debugger logs to the controller created on initialization.
_loggingSubscriptions
.
add
(
debugger
.
logLines
.
listen
(
(
String
line
)
=>
_linesController
.
add
(
_debuggerLineHandler
(
line
)),
onError:
_linesController
.
addError
,
onDone:
_linesController
.
close
,
cancelOnError:
true
,
));
}
IOSDeployDebugger
_iosDeployDebugger
;
// Strip off the logging metadata (leave the category), or just echo the line.
String
_debuggerLineHandler
(
String
line
)
=>
_debuggerLoggingRegex
?.
firstMatch
(
line
)?.
group
(
1
)
??
line
;
void
_listenToSysLog
()
{
void
_listenToSysLog
()
{
// syslog is not written on iOS 13+.
// syslog is not written on iOS 13+.
if
(
_majorSdkVersion
>=
_minimumUniversalLoggingSdkVersion
)
{
if
(
_majorSdkVersion
>=
_minimumUniversalLoggingSdkVersion
)
{
...
@@ -811,7 +758,6 @@ class IOSDeviceLogReader extends DeviceLogReader {
...
@@ -811,7 +758,6 @@ class IOSDeviceLogReader extends DeviceLogReader {
loggingSubscription
.
cancel
();
loggingSubscription
.
cancel
();
}
}
_idevicesyslogProcess
?.
kill
();
_idevicesyslogProcess
?.
kill
();
_iosDeployDebugger
?.
detach
();
}
}
}
}
...
...
packages/flutter_tools/lib/src/ios/fallback_discovery.dart
View file @
53fee1be
...
@@ -82,50 +82,50 @@ class FallbackDiscovery {
...
@@ -82,50 +82,50 @@ class FallbackDiscovery {
}
}
try
{
try
{
final
Uri
result
=
await
_protocolDiscovery
.
uri
;
final
Uri
result
=
await
_mDnsObservatoryDiscovery
.
getObservatoryUri
(
packageId
,
device
,
usesIpv6:
usesIpv6
,
hostVmservicePort:
hostVmservicePort
,
);
if
(
result
!=
null
)
{
if
(
result
!=
null
)
{
UsageEvent
(
UsageEvent
(
_kEventName
,
_kEventName
,
'
log
-success'
,
'
mdns
-success'
,
flutterUsage:
_flutterUsage
,
flutterUsage:
_flutterUsage
,
).
send
();
).
send
();
return
result
;
return
result
;
}
}
}
on
ArgumentError
{
// In the event of an invalid InternetAddress, this code attempts to catch
// an ArgumentError from protocol_discovery.dart
}
on
Exception
catch
(
err
)
{
}
on
Exception
catch
(
err
)
{
_logger
.
printTrace
(
err
.
toString
());
_logger
.
printTrace
(
err
.
toString
());
}
}
_logger
.
printTrace
(
'Failed to connect with
log scanning, falling back to mDNS
'
);
_logger
.
printTrace
(
'Failed to connect with
mDNS, falling back to log scanning
'
);
UsageEvent
(
UsageEvent
(
_kEventName
,
_kEventName
,
'
log
-failure'
,
'
mdns
-failure'
,
flutterUsage:
_flutterUsage
,
flutterUsage:
_flutterUsage
,
).
send
();
).
send
();
try
{
try
{
final
Uri
result
=
await
_mDnsObservatoryDiscovery
.
getObservatoryUri
(
final
Uri
result
=
await
_protocolDiscovery
.
uri
;
packageId
,
device
,
usesIpv6:
usesIpv6
,
hostVmservicePort:
hostVmservicePort
,
);
if
(
result
!=
null
)
{
if
(
result
!=
null
)
{
UsageEvent
(
UsageEvent
(
_kEventName
,
_kEventName
,
'
mdns
-success'
,
'
fallback
-success'
,
flutterUsage:
_flutterUsage
,
flutterUsage:
_flutterUsage
,
).
send
();
).
send
();
return
result
;
return
result
;
}
}
}
on
ArgumentError
{
// In the event of an invalid InternetAddress, this code attempts to catch
// an ArgumentError from protocol_discovery.dart
}
on
Exception
catch
(
err
)
{
}
on
Exception
catch
(
err
)
{
_logger
.
printTrace
(
err
.
toString
());
_logger
.
printTrace
(
err
.
toString
());
}
}
_logger
.
printTrace
(
'Failed to connect with
mDNS
'
);
_logger
.
printTrace
(
'Failed to connect with
log scanning
'
);
UsageEvent
(
UsageEvent
(
_kEventName
,
_kEventName
,
'
mdns
-failure'
,
'
fallback
-failure'
,
flutterUsage:
_flutterUsage
,
flutterUsage:
_flutterUsage
,
).
send
();
).
send
();
return
null
;
return
null
;
...
@@ -148,7 +148,7 @@ class FallbackDiscovery {
...
@@ -148,7 +148,7 @@ class FallbackDiscovery {
assumedWsUri
=
Uri
.
parse
(
'ws://localhost:
$hostPort
/ws'
);
assumedWsUri
=
Uri
.
parse
(
'ws://localhost:
$hostPort
/ws'
);
}
on
Exception
catch
(
err
)
{
}
on
Exception
catch
(
err
)
{
_logger
.
printTrace
(
err
.
toString
());
_logger
.
printTrace
(
err
.
toString
());
_logger
.
printTrace
(
'Failed to connect directly, falling back to
log scanning
'
);
_logger
.
printTrace
(
'Failed to connect directly, falling back to
mDNS
'
);
_sendFailureEvent
(
err
,
assumedDevicePort
);
_sendFailureEvent
(
err
,
assumedDevicePort
);
return
null
;
return
null
;
}
}
...
...
packages/flutter_tools/lib/src/ios/ios_deploy.dart
View file @
53fee1be
This diff is collapsed.
Click to expand it.
packages/flutter_tools/lib/src/protocol_discovery.dart
View file @
53fee1be
...
@@ -34,7 +34,7 @@ class ProtocolDiscovery {
...
@@ -34,7 +34,7 @@ class ProtocolDiscovery {
factory
ProtocolDiscovery
.
observatory
(
factory
ProtocolDiscovery
.
observatory
(
DeviceLogReader
logReader
,
{
DeviceLogReader
logReader
,
{
DevicePortForwarder
portForwarder
,
DevicePortForwarder
portForwarder
,
Duration
throttleDuration
,
Duration
throttleDuration
=
const
Duration
(
milliseconds:
200
)
,
Duration
throttleTimeout
,
Duration
throttleTimeout
,
@required
int
hostPort
,
@required
int
hostPort
,
@required
int
devicePort
,
@required
int
devicePort
,
...
@@ -45,7 +45,7 @@ class ProtocolDiscovery {
...
@@ -45,7 +45,7 @@ class ProtocolDiscovery {
logReader
,
logReader
,
kObservatoryService
,
kObservatoryService
,
portForwarder:
portForwarder
,
portForwarder:
portForwarder
,
throttleDuration:
throttleDuration
??
const
Duration
(
milliseconds:
200
)
,
throttleDuration:
throttleDuration
,
throttleTimeout:
throttleTimeout
,
throttleTimeout:
throttleTimeout
,
hostPort:
hostPort
,
hostPort:
hostPort
,
devicePort:
devicePort
,
devicePort:
devicePort
,
...
@@ -225,7 +225,7 @@ class _BufferedStreamController<T> {
...
@@ -225,7 +225,7 @@ class _BufferedStreamController<T> {
///
///
/// For example, consider a `waitDuration` of `10ms`, and list of event names
/// For example, consider a `waitDuration` of `10ms`, and list of event names
/// and arrival times: `a (0ms), b (5ms), c (11ms), d (21ms)`.
/// and arrival times: `a (0ms), b (5ms), c (11ms), d (21ms)`.
/// The events `
a`, `c`,
and `d` will be produced as a result.
/// The events `
c`
and `d` will be produced as a result.
StreamTransformer
<
S
,
S
>
_throttle
<
S
>({
StreamTransformer
<
S
,
S
>
_throttle
<
S
>({
@required
Duration
waitDuration
,
@required
Duration
waitDuration
,
})
{
})
{
...
@@ -240,13 +240,10 @@ StreamTransformer<S, S> _throttle<S>({
...
@@ -240,13 +240,10 @@ StreamTransformer<S, S> _throttle<S>({
handleData:
(
S
value
,
EventSink
<
S
>
sink
)
{
handleData:
(
S
value
,
EventSink
<
S
>
sink
)
{
latestLine
=
value
;
latestLine
=
value
;
final
bool
isFirstMessage
=
lastExecution
==
null
;
final
int
currentTime
=
DateTime
.
now
().
millisecondsSinceEpoch
;
final
int
currentTime
=
DateTime
.
now
().
millisecondsSinceEpoch
;
lastExecution
??=
currentTime
;
lastExecution
??=
currentTime
;
final
int
remainingTime
=
currentTime
-
lastExecution
;
final
int
remainingTime
=
currentTime
-
lastExecution
;
final
int
nextExecutionTime
=
remainingTime
>
waitDuration
.
inMilliseconds
// Always send the first event immediately.
final
int
nextExecutionTime
=
isFirstMessage
||
remainingTime
>
waitDuration
.
inMilliseconds
?
0
?
0
:
waitDuration
.
inMilliseconds
-
remainingTime
;
:
waitDuration
.
inMilliseconds
-
remainingTime
;
...
...
packages/flutter_tools/test/general.shard/ios/ios_deploy_test.dart
View file @
53fee1be
...
@@ -2,15 +2,10 @@
...
@@ -2,15 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// found in the LICENSE file.
import
'dart:async'
;
import
'dart:convert'
;
import
'package:flutter_tools/src/artifacts.dart'
;
import
'package:flutter_tools/src/artifacts.dart'
;
import
'package:flutter_tools/src/base/file_system.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/platform.dart'
;
import
'package:flutter_tools/src/base/platform.dart'
;
import
'package:flutter_tools/src/cache.dart'
;
import
'package:flutter_tools/src/cache.dart'
;
import
'package:flutter_tools/src/ios/devices.dart'
;
import
'package:flutter_tools/src/ios/ios_deploy.dart'
;
import
'package:flutter_tools/src/ios/ios_deploy.dart'
;
import
'package:mockito/mockito.dart'
;
import
'package:mockito/mockito.dart'
;
import
'package:process/process.dart'
;
import
'package:process/process.dart'
;
...
@@ -26,186 +21,7 @@ void main () {
...
@@ -26,186 +21,7 @@ void main () {
expect
(
environment
[
'PATH'
],
startsWith
(
'/usr/bin'
));
expect
(
environment
[
'PATH'
],
startsWith
(
'/usr/bin'
));
});
});
group
(
'IOSDeploy.prepareDebuggerForLaunch'
,
()
{
testWithoutContext
(
'IOSDeploy.uninstallApp calls ios-deploy with correct arguments and returns 0 on success'
,
()
async
{
testWithoutContext
(
'calls ios-deploy with correct arguments and returns when debugger attaches'
,
()
async
{
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
FakeCommand
(
command:
<
String
>[
'script'
,
'-t'
,
'0'
,
'/dev/null'
,
'ios-deploy'
,
'--id'
,
'123'
,
'--bundle'
,
'/'
,
'--debug'
,
'--args'
,
<
String
>[
'--enable-dart-profiling'
,
].
join
(
' '
),
],
environment:
const
<
String
,
String
>{
'PATH'
:
'/usr/bin:/usr/local/bin:/usr/bin'
,
'DYLD_LIBRARY_PATH'
:
'/path/to/libs'
,
},
stdout:
'(lldb) run
\n
success
\n
Did finish launching.'
,
),
]);
final
IOSDeploy
iosDeploy
=
setUpIOSDeploy
(
processManager
);
final
IOSDeployDebugger
iosDeployDebugger
=
iosDeploy
.
prepareDebuggerForLaunch
(
deviceId:
'123'
,
bundlePath:
'/'
,
launchArguments:
<
String
>[
'--enable-dart-profiling'
],
interfaceType:
IOSDeviceInterface
.
network
,
);
expect
(
await
iosDeployDebugger
.
launchAndAttach
(),
isTrue
);
expect
(
await
iosDeployDebugger
.
logLines
.
toList
(),
<
String
>[
'Did finish launching.'
]);
expect
(
processManager
.
hasRemainingExpectations
,
false
);
});
});
group
(
'IOSDeployDebugger'
,
()
{
group
(
'launch'
,
()
{
BufferLogger
logger
;
setUp
(()
{
logger
=
BufferLogger
.
test
();
});
testWithoutContext
(
'debugger attached'
,
()
async
{
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
const
FakeCommand
(
command:
<
String
>[
'ios-deploy'
],
stdout:
'(lldb) run
\r\n
success
\r\n
success
\r\n
Log on attach1
\r\n\r\n
Log on attach2
\r\n\r\n\r\n\r\n
PROCESS_STOPPED
\r\n
Log after process exit'
,
),
]);
final
IOSDeployDebugger
iosDeployDebugger
=
IOSDeployDebugger
.
test
(
processManager:
processManager
,
logger:
logger
,
);
final
List
<
String
>
receivedLogLines
=
<
String
>[];
final
Stream
<
String
>
logLines
=
iosDeployDebugger
.
logLines
..
listen
(
receivedLogLines
.
add
);
expect
(
await
iosDeployDebugger
.
launchAndAttach
(),
isTrue
);
await
logLines
.
toList
();
expect
(
receivedLogLines
,
<
String
>[
'success'
,
// ignore first "success" from lldb, but log subsequent ones from real logging.
'Log on attach1'
,
'Log on attach2'
,
''
,
''
]);
});
testWithoutContext
(
'attach failed'
,
()
async
{
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
const
FakeCommand
(
command:
<
String
>[
'ios-deploy'
],
// A success after an error should never happen, but test that we're handling random "successes" anyway.
stdout:
'(lldb) run
\r\n
error: process launch failed
\r\n
success
\r\n
Log on attach1'
,
),
]);
final
IOSDeployDebugger
iosDeployDebugger
=
IOSDeployDebugger
.
test
(
processManager:
processManager
,
logger:
logger
,
);
final
List
<
String
>
receivedLogLines
=
<
String
>[];
final
Stream
<
String
>
logLines
=
iosDeployDebugger
.
logLines
..
listen
(
receivedLogLines
.
add
);
expect
(
await
iosDeployDebugger
.
launchAndAttach
(),
isFalse
);
await
logLines
.
toList
();
// Debugger lines are double spaced, separated by an extra \r\n. Skip the extra lines.
// Still include empty lines other than the extra added newlines.
expect
(
receivedLogLines
,
isEmpty
);
});
testWithoutContext
(
'no provisioning profile 1, stdout'
,
()
async
{
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
const
FakeCommand
(
command:
<
String
>[
'ios-deploy'
],
stdout:
'Error 0xe8008015'
,
),
]);
final
IOSDeployDebugger
iosDeployDebugger
=
IOSDeployDebugger
.
test
(
processManager:
processManager
,
logger:
logger
,
);
await
iosDeployDebugger
.
launchAndAttach
();
expect
(
logger
.
errorText
,
contains
(
'No Provisioning Profile was found'
));
});
testWithoutContext
(
'no provisioning profile 2, stderr'
,
()
async
{
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
const
FakeCommand
(
command:
<
String
>[
'ios-deploy'
],
stderr:
'Error 0xe8000067'
,
),
]);
final
IOSDeployDebugger
iosDeployDebugger
=
IOSDeployDebugger
.
test
(
processManager:
processManager
,
logger:
logger
,
);
await
iosDeployDebugger
.
launchAndAttach
();
expect
(
logger
.
errorText
,
contains
(
'No Provisioning Profile was found'
));
});
testWithoutContext
(
'device locked'
,
()
async
{
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
const
FakeCommand
(
command:
<
String
>[
'ios-deploy'
],
stdout:
'e80000e2'
,
),
]);
final
IOSDeployDebugger
iosDeployDebugger
=
IOSDeployDebugger
.
test
(
processManager:
processManager
,
logger:
logger
,
);
await
iosDeployDebugger
.
launchAndAttach
();
expect
(
logger
.
errorText
,
contains
(
'Your device is locked.'
));
});
testWithoutContext
(
'device locked'
,
()
async
{
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
const
FakeCommand
(
command:
<
String
>[
'ios-deploy'
],
stdout:
'Error 0xe8000022'
,
),
]);
final
IOSDeployDebugger
iosDeployDebugger
=
IOSDeployDebugger
.
test
(
processManager:
processManager
,
logger:
logger
,
);
await
iosDeployDebugger
.
launchAndAttach
();
expect
(
logger
.
errorText
,
contains
(
'Try launching from within Xcode'
));
});
});
testWithoutContext
(
'detach'
,
()
async
{
final
StreamController
<
List
<
int
>>
stdin
=
StreamController
<
List
<
int
>>();
final
Stream
<
String
>
stdinStream
=
stdin
.
stream
.
transform
<
String
>(
const
Utf8Decoder
());
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
FakeCommand
(
command:
const
<
String
>[
'ios-deploy'
,
],
stdout:
'(lldb) run
\n
success'
,
stdin:
IOSink
(
stdin
.
sink
),
),
]);
final
IOSDeployDebugger
iosDeployDebugger
=
IOSDeployDebugger
.
test
(
processManager:
processManager
,
);
await
iosDeployDebugger
.
launchAndAttach
();
iosDeployDebugger
.
detach
();
expect
(
await
stdinStream
.
first
,
'process detach'
);
});
});
group
(
'IOSDeploy.uninstallApp'
,
()
{
testWithoutContext
(
'calls ios-deploy with correct arguments and returns 0 on success'
,
()
async
{
const
String
deviceId
=
'123'
;
const
String
deviceId
=
'123'
;
const
String
bundleId
=
'com.example.app'
;
const
String
bundleId
=
'com.example.app'
;
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
...
@@ -228,7 +44,7 @@ void main () {
...
@@ -228,7 +44,7 @@ void main () {
expect
(
processManager
.
hasRemainingExpectations
,
false
);
expect
(
processManager
.
hasRemainingExpectations
,
false
);
});
});
testWithoutContext
(
'
returns non-zero exit code when ios-deploy does the same'
,
()
async
{
testWithoutContext
(
'IOSDeploy.uninstallApp
returns non-zero exit code when ios-deploy does the same'
,
()
async
{
const
String
deviceId
=
'123'
;
const
String
deviceId
=
'123'
;
const
String
bundleId
=
'com.example.app'
;
const
String
bundleId
=
'com.example.app'
;
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
...
@@ -250,7 +66,6 @@ void main () {
...
@@ -250,7 +66,6 @@ void main () {
expect
(
exitCode
,
1
);
expect
(
exitCode
,
1
);
expect
(
processManager
.
hasRemainingExpectations
,
false
);
expect
(
processManager
.
hasRemainingExpectations
,
false
);
});
});
});
}
}
IOSDeploy
setUpIOSDeploy
(
ProcessManager
processManager
)
{
IOSDeploy
setUpIOSDeploy
(
ProcessManager
processManager
)
{
...
...
packages/flutter_tools/test/general.shard/ios/ios_device_logger_test.dart
View file @
53fee1be
...
@@ -10,7 +10,6 @@ import 'package:flutter_tools/src/build_info.dart';
...
@@ -10,7 +10,6 @@ import 'package:flutter_tools/src/build_info.dart';
import
'package:flutter_tools/src/convert.dart'
;
import
'package:flutter_tools/src/convert.dart'
;
import
'package:flutter_tools/src/device.dart'
;
import
'package:flutter_tools/src/device.dart'
;
import
'package:flutter_tools/src/ios/devices.dart'
;
import
'package:flutter_tools/src/ios/devices.dart'
;
import
'package:flutter_tools/src/ios/ios_deploy.dart'
;
import
'package:flutter_tools/src/ios/mac.dart'
;
import
'package:flutter_tools/src/ios/mac.dart'
;
import
'package:mockito/mockito.dart'
;
import
'package:mockito/mockito.dart'
;
import
'package:vm_service/vm_service.dart'
;
import
'package:vm_service/vm_service.dart'
;
...
@@ -34,7 +33,6 @@ void main() {
...
@@ -34,7 +33,6 @@ void main() {
.
thenReturn
(
'idevice-syslog'
);
.
thenReturn
(
'idevice-syslog'
);
});
});
group
(
'syslog stream'
,
()
{
testWithoutContext
(
'decodeSyslog decodes a syslog-encoded line'
,
()
{
testWithoutContext
(
'decodeSyslog decodes a syslog-encoded line'
,
()
{
final
String
decoded
=
decodeSyslog
(
final
String
decoded
=
decodeSyslog
(
r'I \M-b\M^]\M-$\M-o\M-8\M^O syslog \M-B\M-/\'
r'I \M-b\M^]\M-$\M-o\M-8\M^O syslog \M-B\M-/\'
...
@@ -143,9 +141,7 @@ Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt
...
@@ -143,9 +141,7 @@ Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt
' with a non-Flutter log message following it.'
,
' with a non-Flutter log message following it.'
,
]);
]);
});
});
});
group
(
'VM service'
,
()
{
testWithoutContext
(
'IOSDeviceLogReader can listen to VM Service logs'
,
()
async
{
testWithoutContext
(
'IOSDeviceLogReader can listen to VM Service logs'
,
()
async
{
final
MockVmService
vmService
=
MockVmService
();
final
MockVmService
vmService
=
MockVmService
();
final
DeviceLogReader
logReader
=
IOSDeviceLogReader
.
test
(
final
DeviceLogReader
logReader
=
IOSDeviceLogReader
.
test
(
...
@@ -194,136 +190,7 @@ Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt
...
@@ -194,136 +190,7 @@ Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt
equals
(
' And this is an error '
),
equals
(
' And this is an error '
),
]));
]));
});
});
testWithoutContext
(
'IOSDeviceLogReader ignores VM Service logs when attached to debugger'
,
()
async
{
final
MockVmService
vmService
=
MockVmService
();
final
IOSDeviceLogReader
logReader
=
IOSDeviceLogReader
.
test
(
useSyslog:
false
,
iMobileDevice:
IMobileDevice
(
artifacts:
artifacts
,
processManager:
processManager
,
cache:
fakeCache
,
logger:
logger
,
),
);
final
StreamController
<
Event
>
stdoutController
=
StreamController
<
Event
>();
final
StreamController
<
Event
>
stderController
=
StreamController
<
Event
>();
final
Completer
<
Success
>
stdoutCompleter
=
Completer
<
Success
>();
final
Completer
<
Success
>
stderrCompleter
=
Completer
<
Success
>();
when
(
vmService
.
streamListen
(
'Stdout'
)).
thenAnswer
((
Invocation
invocation
)
{
return
stdoutCompleter
.
future
;
});
when
(
vmService
.
streamListen
(
'Stderr'
)).
thenAnswer
((
Invocation
invocation
)
{
return
stderrCompleter
.
future
;
});
when
(
vmService
.
onStdoutEvent
).
thenAnswer
((
Invocation
invocation
)
{
return
stdoutController
.
stream
;
});
when
(
vmService
.
onStderrEvent
).
thenAnswer
((
Invocation
invocation
)
{
return
stderController
.
stream
;
});
logReader
.
connectedVMService
=
vmService
;
stdoutCompleter
.
complete
(
Success
());
stderrCompleter
.
complete
(
Success
());
stdoutController
.
add
(
Event
(
kind:
'Stdout'
,
timestamp:
0
,
bytes:
base64
.
encode
(
utf8
.
encode
(
' This is a message '
)),
));
stderController
.
add
(
Event
(
kind:
'Stderr'
,
timestamp:
0
,
bytes:
base64
.
encode
(
utf8
.
encode
(
' And this is an error '
)),
));
final
MockIOSDeployDebugger
iosDeployDebugger
=
MockIOSDeployDebugger
();
when
(
iosDeployDebugger
.
debuggerAttached
).
thenReturn
(
true
);
final
Stream
<
String
>
debuggingLogs
=
Stream
<
String
>.
fromIterable
(<
String
>[
'Message from debugger'
]);
when
(
iosDeployDebugger
.
logLines
).
thenAnswer
((
Invocation
invocation
)
=>
debuggingLogs
);
logReader
.
debuggerStream
=
iosDeployDebugger
;
// Wait for stream listeners to fire.
await
expectLater
(
logReader
.
logLines
,
emitsInAnyOrder
(<
Matcher
>[
equals
(
'Message from debugger'
),
]));
});
});
group
(
'debugger stream'
,
()
{
testWithoutContext
(
'IOSDeviceLogReader removes metadata prefix from lldb output'
,
()
async
{
final
Stream
<
String
>
debuggingLogs
=
Stream
<
String
>.
fromIterable
(<
String
>[
'2020-09-15 19:15:10.931434-0700 Runner[541:226276] Did finish launching.'
,
'2020-09-15 19:15:10.931434-0700 Runner[541:226276] [Category] Did finish launching from logging category.'
,
'stderr from dart'
,
''
,
]);
final
IOSDeviceLogReader
logReader
=
IOSDeviceLogReader
.
test
(
iMobileDevice:
IMobileDevice
(
artifacts:
artifacts
,
processManager:
processManager
,
cache:
fakeCache
,
logger:
logger
,
),
useSyslog:
false
,
);
final
MockIOSDeployDebugger
iosDeployDebugger
=
MockIOSDeployDebugger
();
when
(
iosDeployDebugger
.
logLines
).
thenAnswer
((
Invocation
invocation
)
=>
debuggingLogs
);
logReader
.
debuggerStream
=
iosDeployDebugger
;
final
Future
<
List
<
String
>>
logLines
=
logReader
.
logLines
.
toList
();
expect
(
await
logLines
,
<
String
>[
'Did finish launching.'
,
'[Category] Did finish launching from logging category.'
,
'stderr from dart'
,
''
,
]);
});
testWithoutContext
(
'errors on debugger stream closes log stream'
,
()
async
{
final
Stream
<
String
>
debuggingLogs
=
Stream
<
String
>.
error
(
'ios-deploy error'
);
final
IOSDeviceLogReader
logReader
=
IOSDeviceLogReader
.
test
(
iMobileDevice:
IMobileDevice
(
artifacts:
artifacts
,
processManager:
processManager
,
cache:
fakeCache
,
logger:
logger
,
),
useSyslog:
false
,
);
final
Completer
<
void
>
streamComplete
=
Completer
<
void
>();
final
MockIOSDeployDebugger
iosDeployDebugger
=
MockIOSDeployDebugger
();
when
(
iosDeployDebugger
.
logLines
).
thenAnswer
((
Invocation
invocation
)
=>
debuggingLogs
);
logReader
.
logLines
.
listen
(
null
,
onError:
(
Object
error
)
=>
streamComplete
.
complete
());
logReader
.
debuggerStream
=
iosDeployDebugger
;
await
streamComplete
.
future
;
});
testWithoutContext
(
'detaches debugger'
,
()
async
{
final
IOSDeviceLogReader
logReader
=
IOSDeviceLogReader
.
test
(
iMobileDevice:
IMobileDevice
(
artifacts:
artifacts
,
processManager:
processManager
,
cache:
fakeCache
,
logger:
logger
,
),
useSyslog:
false
,
);
final
MockIOSDeployDebugger
iosDeployDebugger
=
MockIOSDeployDebugger
();
when
(
iosDeployDebugger
.
logLines
).
thenAnswer
((
Invocation
invocation
)
=>
const
Stream
<
String
>.
empty
());
logReader
.
debuggerStream
=
iosDeployDebugger
;
logReader
.
dispose
();
verify
(
iosDeployDebugger
.
detach
());
});
});
}
}
class
MockArtifacts
extends
Mock
implements
Artifacts
{}
class
MockArtifacts
extends
Mock
implements
Artifacts
{}
class
MockVmService
extends
Mock
implements
VmService
{}
class
MockVmService
extends
Mock
implements
VmService
{}
class
MockIOSDeployDebugger
extends
Mock
implements
IOSDeployDebugger
{}
packages/flutter_tools/test/general.shard/ios/ios_device_start_prebuilt_test.dart
View file @
53fee1be
...
@@ -67,25 +67,19 @@ const FakeCommand kLaunchReleaseCommand = FakeCommand(
...
@@ -67,25 +67,19 @@ const FakeCommand kLaunchReleaseCommand = FakeCommand(
// The command used to actually launch the app with args in debug.
// The command used to actually launch the app with args in debug.
const
FakeCommand
kLaunchDebugCommand
=
FakeCommand
(
command:
<
String
>[
const
FakeCommand
kLaunchDebugCommand
=
FakeCommand
(
command:
<
String
>[
'script'
,
'-t'
,
'0'
,
'/dev/null'
,
'ios-deploy'
,
'ios-deploy'
,
'--id'
,
'--id'
,
'123'
,
'123'
,
'--bundle'
,
'--bundle'
,
'/'
,
'/'
,
'--debug'
,
'--no-wifi'
,
'--no-wifi'
,
'--justlaunch'
,
'--args'
,
'--args'
,
'--enable-dart-profiling --enable-service-port-fallback --disable-service-auth-codes --observatory-port=60700 --enable-checked-mode --verify-entry-points'
'--enable-dart-profiling --enable-service-port-fallback --disable-service-auth-codes --observatory-port=60700 --enable-checked-mode --verify-entry-points'
],
environment:
<
String
,
String
>{
],
environment:
<
String
,
String
>{
'PATH'
:
'/usr/bin:null'
,
'PATH'
:
'/usr/bin:null'
,
'DYLD_LIBRARY_PATH'
:
'/path/to/libraries'
,
'DYLD_LIBRARY_PATH'
:
'/path/to/libraries'
,
},
});
stdout:
'(lldb) run
\n
success'
,
);
void
main
(
)
{
void
main
(
)
{
// TODO(jonahwilliams): This test doesn't really belong here but
// TODO(jonahwilliams): This test doesn't really belong here but
...
@@ -108,7 +102,7 @@ void main() {
...
@@ -108,7 +102,7 @@ void main() {
});
});
// Still uses context for analytics and mDNS.
// Still uses context for analytics and mDNS.
testUsingContext
(
'IOSDevice.startApp succeeds in debug mode via mDNS discovery
when log reading fails
'
,
()
async
{
testUsingContext
(
'IOSDevice.startApp succeeds in debug mode via mDNS discovery'
,
()
async
{
final
FileSystem
fileSystem
=
MemoryFileSystem
.
test
();
final
FileSystem
fileSystem
=
MemoryFileSystem
.
test
();
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
kDeployCommand
,
kDeployCommand
,
...
@@ -151,7 +145,6 @@ void main() {
...
@@ -151,7 +145,6 @@ void main() {
debuggingOptions:
DebuggingOptions
.
enabled
(
BuildInfo
.
debug
),
debuggingOptions:
DebuggingOptions
.
enabled
(
BuildInfo
.
debug
),
platformArgs:
<
String
,
dynamic
>{},
platformArgs:
<
String
,
dynamic
>{},
fallbackPollingDelay:
Duration
.
zero
,
fallbackPollingDelay:
Duration
.
zero
,
fallbackThrottleTimeout:
const
Duration
(
milliseconds:
10
),
);
);
verify
(
globals
.
flutterUsage
.
sendEvent
(
'ios-handshake'
,
'mdns-success'
)).
called
(
1
);
verify
(
globals
.
flutterUsage
.
sendEvent
(
'ios-handshake'
,
'mdns-success'
)).
called
(
1
);
...
@@ -164,7 +157,7 @@ void main() {
...
@@ -164,7 +157,7 @@ void main() {
});
});
// Still uses context for analytics and mDNS.
// Still uses context for analytics and mDNS.
testUsingContext
(
'IOSDevice.startApp succeeds in debug mode
via log reading
'
,
()
async
{
testUsingContext
(
'IOSDevice.startApp succeeds in debug mode
when mDNS fails
'
,
()
async
{
final
FileSystem
fileSystem
=
MemoryFileSystem
.
test
();
final
FileSystem
fileSystem
=
MemoryFileSystem
.
test
();
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
kDeployCommand
,
kDeployCommand
,
...
@@ -190,32 +183,34 @@ void main() {
...
@@ -190,32 +183,34 @@ void main() {
device
.
portForwarder
=
const
NoOpDevicePortForwarder
();
device
.
portForwarder
=
const
NoOpDevicePortForwarder
();
device
.
setLogReader
(
iosApp
,
deviceLogReader
);
device
.
setLogReader
(
iosApp
,
deviceLogReader
);
//
Start writing messages to the log reader
.
//
Now that the reader is used, start writing messages to it
.
Timer
.
run
(()
{
Timer
.
run
(()
{
deviceLogReader
.
addLine
(
'Foo'
);
deviceLogReader
.
addLine
(
'Foo'
);
deviceLogReader
.
addLine
(
'Observatory listening on http://127.0.0.1:456'
);
deviceLogReader
.
addLine
(
'Observatory listening on http://127.0.0.1:456'
);
});
});
when
(
MDnsObservatoryDiscovery
.
instance
.
getObservatoryUri
(
any
,
any
,
usesIpv6:
anyNamed
(
'usesIpv6'
)))
.
thenAnswer
((
Invocation
invocation
)
async
=>
null
);
final
LaunchResult
launchResult
=
await
device
.
startApp
(
iosApp
,
final
LaunchResult
launchResult
=
await
device
.
startApp
(
iosApp
,
prebuiltApplication:
true
,
prebuiltApplication:
true
,
debuggingOptions:
DebuggingOptions
.
enabled
(
BuildInfo
.
debug
),
debuggingOptions:
DebuggingOptions
.
enabled
(
BuildInfo
.
debug
),
platformArgs:
<
String
,
dynamic
>{},
platformArgs:
<
String
,
dynamic
>{},
fallbackPollingDelay:
Duration
.
zero
,
fallbackPollingDelay:
Duration
.
zero
,
fallbackThrottleTimeout:
const
Duration
(
milliseconds:
10
),
);
);
expect
(
launchResult
.
started
,
true
);
expect
(
launchResult
.
started
,
true
);
expect
(
launchResult
.
hasObservatory
,
true
);
expect
(
launchResult
.
hasObservatory
,
true
);
verify
(
globals
.
flutterUsage
.
sendEvent
(
'ios-handshake'
,
'
log-success
'
)).
called
(
1
);
verify
(
globals
.
flutterUsage
.
sendEvent
(
'ios-handshake'
,
'
mdns-failure
'
)).
called
(
1
);
verify
Never
(
globals
.
flutterUsage
.
sendEvent
(
'ios-handshake'
,
'mdns-failure'
)
);
verify
(
globals
.
flutterUsage
.
sendEvent
(
'ios-handshake'
,
'fallback-success'
)).
called
(
1
);
expect
(
await
device
.
stopApp
(
iosApp
),
false
);
expect
(
await
device
.
stopApp
(
iosApp
),
false
);
},
overrides:
<
Type
,
Generator
>{
},
overrides:
<
Type
,
Generator
>{
MDnsObservatoryDiscovery:
()
=>
MockMDnsObservatoryDiscovery
(),
Usage:
()
=>
MockUsage
(),
Usage:
()
=>
MockUsage
(),
MDnsObservatoryDiscovery:
()
=>
MockMDnsObservatoryDiscovery
(),
});
});
// Still uses context for analytics and mDNS.
// Still uses context for analytics and mDNS.
testUsingContext
(
'IOSDevice.startApp fails in debug mode when Observatory URI is malformed'
,
()
async
{
testUsingContext
(
'IOSDevice.startApp fails in debug mode when mDNS fails and '
'when Observatory URI is malformed'
,
()
async
{
final
FileSystem
fileSystem
=
MemoryFileSystem
.
test
();
final
FileSystem
fileSystem
=
MemoryFileSystem
.
test
();
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
final
FakeProcessManager
processManager
=
FakeProcessManager
.
list
(<
FakeCommand
>[
kDeployCommand
,
kDeployCommand
,
...
@@ -244,15 +239,16 @@ void main() {
...
@@ -244,15 +239,16 @@ void main() {
// Now that the reader is used, start writing messages to it.
// Now that the reader is used, start writing messages to it.
Timer
.
run
(()
{
Timer
.
run
(()
{
deviceLogReader
.
addLine
(
'Foo'
);
deviceLogReader
.
addLine
(
'Foo'
);
deviceLogReader
.
addLine
(
'Observatory listening on http:/
/127.0.0.1:456abc
'
);
deviceLogReader
.
addLine
(
'Observatory listening on http:/
:/127.0.0.1:456
'
);
});
});
when
(
MDnsObservatoryDiscovery
.
instance
.
getObservatoryUri
(
any
,
any
,
usesIpv6:
anyNamed
(
'usesIpv6'
)))
.
thenAnswer
((
Invocation
invocation
)
async
=>
null
);
final
LaunchResult
launchResult
=
await
device
.
startApp
(
iosApp
,
final
LaunchResult
launchResult
=
await
device
.
startApp
(
iosApp
,
prebuiltApplication:
true
,
prebuiltApplication:
true
,
debuggingOptions:
DebuggingOptions
.
enabled
(
BuildInfo
.
debug
),
debuggingOptions:
DebuggingOptions
.
enabled
(
BuildInfo
.
debug
),
platformArgs:
<
String
,
dynamic
>{},
platformArgs:
<
String
,
dynamic
>{},
fallbackPollingDelay:
Duration
.
zero
,
fallbackPollingDelay:
Duration
.
zero
,
// fallbackThrottleTimeout: const Duration(milliseconds: 10),
);
);
expect
(
launchResult
.
started
,
false
);
expect
(
launchResult
.
started
,
false
);
...
@@ -263,8 +259,8 @@ void main() {
...
@@ -263,8 +259,8 @@ void main() {
label:
anyNamed
(
'label'
),
label:
anyNamed
(
'label'
),
value:
anyNamed
(
'value'
),
value:
anyNamed
(
'value'
),
)).
called
(
1
);
)).
called
(
1
);
verify
(
globals
.
flutterUsage
.
sendEvent
(
'ios-handshake'
,
'log-failure'
)).
called
(
1
);
verify
(
globals
.
flutterUsage
.
sendEvent
(
'ios-handshake'
,
'mdns-failure'
)).
called
(
1
);
verify
(
globals
.
flutterUsage
.
sendEvent
(
'ios-handshake'
,
'mdns-failure'
)).
called
(
1
);
verify
(
globals
.
flutterUsage
.
sendEvent
(
'ios-handshake'
,
'fallback-failure'
)).
called
(
1
);
},
overrides:
<
Type
,
Generator
>{
},
overrides:
<
Type
,
Generator
>{
MDnsObservatoryDiscovery:
()
=>
MockMDnsObservatoryDiscovery
(),
MDnsObservatoryDiscovery:
()
=>
MockMDnsObservatoryDiscovery
(),
Usage:
()
=>
MockUsage
(),
Usage:
()
=>
MockUsage
(),
...
@@ -392,7 +388,6 @@ void main() {
...
@@ -392,7 +388,6 @@ void main() {
debuggingOptions:
DebuggingOptions
.
disabled
(
BuildInfo
.
release
),
debuggingOptions:
DebuggingOptions
.
disabled
(
BuildInfo
.
release
),
platformArgs:
<
String
,
dynamic
>{},
platformArgs:
<
String
,
dynamic
>{},
fallbackPollingDelay:
Duration
.
zero
,
fallbackPollingDelay:
Duration
.
zero
,
fallbackThrottleTimeout:
const
Duration
(
milliseconds:
10
),
);
);
expect
(
launchResult
.
started
,
true
);
expect
(
launchResult
.
started
,
true
);
...
@@ -410,17 +405,13 @@ void main() {
...
@@ -410,17 +405,13 @@ void main() {
kDeployCommand
,
kDeployCommand
,
FakeCommand
(
FakeCommand
(
command:
<
String
>[
command:
<
String
>[
'script'
,
'-t'
,
'0'
,
'/dev/null'
,
'ios-deploy'
,
'ios-deploy'
,
'--id'
,
'--id'
,
'123'
,
'123'
,
'--bundle'
,
'--bundle'
,
'/'
,
'/'
,
'--debug'
,
'--no-wifi'
,
'--no-wifi'
,
'--justlaunch'
,
// The arguments below are determined by what is passed into
// The arguments below are determined by what is passed into
// the debugging options argument to startApp.
// the debugging options argument to startApp.
'--args'
,
'--args'
,
...
@@ -445,8 +436,7 @@ void main() {
...
@@ -445,8 +436,7 @@ void main() {
],
environment:
const
<
String
,
String
>{
],
environment:
const
<
String
,
String
>{
'PATH'
:
'/usr/bin:null'
,
'PATH'
:
'/usr/bin:null'
,
'DYLD_LIBRARY_PATH'
:
'/path/to/libraries'
,
'DYLD_LIBRARY_PATH'
:
'/path/to/libraries'
,
},
}
stdout:
'(lldb) run
\n
success'
,
)
)
]);
]);
final
IOSDevice
device
=
setUpIOSDevice
(
final
IOSDevice
device
=
setUpIOSDevice
(
...
@@ -465,15 +455,22 @@ void main() {
...
@@ -465,15 +455,22 @@ void main() {
bundleName:
'Runner'
,
bundleName:
'Runner'
,
bundleDir:
fileSystem
.
currentDirectory
,
bundleDir:
fileSystem
.
currentDirectory
,
);
);
final
FakeDeviceLogReader
deviceLogReader
=
FakeDeviceLogReader
();
final
Uri
uri
=
Uri
(
scheme:
'http'
,
host:
'127.0.0.1'
,
port:
1234
,
path:
'observatory'
,
);
device
.
setLogReader
(
iosApp
,
FakeDeviceLogReader
());
device
.
portForwarder
=
const
NoOpDevicePortForwarder
();
device
.
portForwarder
=
const
NoOpDevicePortForwarder
();
device
.
setLogReader
(
iosApp
,
deviceLogReader
);
// Start writing messages to the log reader.
when
(
MDnsObservatoryDiscovery
.
instance
.
getObservatoryUri
(
Timer
.
run
(()
{
any
,
deviceLogReader
.
addLine
(
'Observatory listening on http://127.0.0.1:1234'
);
any
,
});
usesIpv6:
anyNamed
(
'usesIpv6'
),
hostVmservicePort:
anyNamed
(
'hostVmservicePort'
)
)).
thenAnswer
((
Invocation
invocation
)
async
=>
uri
);
final
LaunchResult
launchResult
=
await
device
.
startApp
(
iosApp
,
final
LaunchResult
launchResult
=
await
device
.
startApp
(
iosApp
,
prebuiltApplication:
true
,
prebuiltApplication:
true
,
...
@@ -495,7 +492,6 @@ void main() {
...
@@ -495,7 +492,6 @@ void main() {
),
),
platformArgs:
<
String
,
dynamic
>{},
platformArgs:
<
String
,
dynamic
>{},
fallbackPollingDelay:
Duration
.
zero
,
fallbackPollingDelay:
Duration
.
zero
,
fallbackThrottleTimeout:
const
Duration
(
milliseconds:
10
),
);
);
expect
(
launchResult
.
started
,
true
);
expect
(
launchResult
.
started
,
true
);
...
...
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