simctl 1.6.2 → 1.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +80 -0
- data/.travis.yml +5 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +20 -3
- data/README.md +3 -3
- data/fastlane-plugin-simctl/.gitignore +11 -0
- data/fastlane-plugin-simctl/.rspec +3 -0
- data/fastlane-plugin-simctl/.rubocop.yml +263 -0
- data/fastlane-plugin-simctl/Gemfile +6 -0
- data/fastlane-plugin-simctl/README.md +46 -0
- data/fastlane-plugin-simctl/Rakefile +9 -0
- data/fastlane-plugin-simctl/fastlane-plugin-simctl.gemspec +29 -0
- data/fastlane-plugin-simctl/fastlane/Fastfile +9 -0
- data/fastlane-plugin-simctl/fastlane/Pluginfile +1 -0
- data/fastlane-plugin-simctl/lib/fastlane/plugin/simctl.rb +16 -0
- data/fastlane-plugin-simctl/lib/fastlane/plugin/simctl/actions/simctl_action.rb +51 -0
- data/fastlane-plugin-simctl/lib/fastlane/plugin/simctl/helper/simctl_helper.rb +52 -0
- data/fastlane-plugin-simctl/lib/fastlane/plugin/simctl/version.rb +5 -0
- data/fastlane-plugin-simctl/spec/simctl_action_spec.rb +4 -0
- data/fastlane-plugin-simctl/spec/spec_helper.rb +15 -0
- data/lib/simctl.rb +1 -1
- data/lib/simctl/command/create.rb +3 -2
- data/lib/simctl/command/delete.rb +1 -1
- data/lib/simctl/command/erase.rb +0 -2
- data/lib/simctl/command/io.rb +3 -3
- data/lib/simctl/command/launch.rb +6 -6
- data/lib/simctl/command/list.rb +8 -6
- data/lib/simctl/command/reset.rb +2 -2
- data/lib/simctl/command/spawn.rb +4 -2
- data/lib/simctl/command/terminate.rb +4 -4
- data/lib/simctl/command/warmup.rb +3 -3
- data/lib/simctl/device.rb +14 -14
- data/lib/simctl/device_launchctl.rb +3 -3
- data/lib/simctl/device_path.rb +18 -7
- data/lib/simctl/device_settings.rb +5 -5
- data/lib/simctl/device_type.rb +1 -1
- data/lib/simctl/executor.rb +3 -3
- data/lib/simctl/list.rb +6 -6
- data/lib/simctl/object.rb +1 -1
- data/lib/simctl/runtime.rb +2 -2
- data/lib/simctl/version.rb +1 -1
- data/lib/simctl/xcode/path.rb +10 -4
- data/lib/simctl/xcode/version.rb +3 -3
- data/simctl.gemspec +3 -1
- data/spec/simctl/device_interaction_spec.rb +11 -11
- data/spec/simctl/executor_spec.rb +1 -1
- data/spec/simctl/list_spec.rb +6 -2
- data/spec/simctl/readme_spec.rb +5 -5
- data/spec/simctl/warmup_spec.rb +1 -1
- data/spec/spec_helper.rb +9 -13
- metadata +33 -2
@@ -7,13 +7,13 @@ module SimCtl
|
|
7
7
|
# @param runtime [String] runtime string
|
8
8
|
# @param timeout [Integer] timeout in seconds to wait until device is ready
|
9
9
|
# @return [SimCtl::Device]
|
10
|
-
def warmup(devicetype, runtime, timeout=120)
|
10
|
+
def warmup(devicetype, runtime, timeout = 120)
|
11
11
|
devicetype = devicetype(name: devicetype) unless devicetype.is_a?(DeviceType)
|
12
12
|
runtime = runtime(name: runtime) unless runtime.is_a?(Runtime)
|
13
13
|
device = device(devicetype: devicetype, runtime: runtime)
|
14
|
-
raise DeviceNotFound
|
14
|
+
raise DeviceNotFound, "Could not find device with type '#{devicetype.name}' and runtime '#{runtime.name}'" if device.nil?
|
15
15
|
device.launch
|
16
|
-
device.wait(timeout) {|d| d.state == :booted && d.ready?}
|
16
|
+
device.wait(timeout) { |d| d.state == :booted && d.ready? }
|
17
17
|
device
|
18
18
|
end
|
19
19
|
end
|
data/lib/simctl/device.rb
CHANGED
@@ -71,7 +71,7 @@ module SimCtl
|
|
71
71
|
# Launches the Simulator
|
72
72
|
#
|
73
73
|
# @return [void]
|
74
|
-
def launch(scale=1.0, opts={})
|
74
|
+
def launch(scale = 1.0, opts = {})
|
75
75
|
SimCtl.launch_device(self, scale, opts)
|
76
76
|
end
|
77
77
|
|
@@ -88,7 +88,7 @@ module SimCtl
|
|
88
88
|
# @param identifier [String] the app identifier
|
89
89
|
# @param args [Array] optional launch arguments
|
90
90
|
# @return [void]
|
91
|
-
def launch_app(identifier, args=[], opts={})
|
91
|
+
def launch_app(identifier, args = [], opts = {})
|
92
92
|
SimCtl.launch_app(self, identifier, args, opts)
|
93
93
|
end
|
94
94
|
|
@@ -97,7 +97,7 @@ module SimCtl
|
|
97
97
|
# @param identifier [String] the app identifier
|
98
98
|
# @param args [Array] optional terminate arguments
|
99
99
|
# @return [void]
|
100
|
-
def terminate_app(identifier, args=[])
|
100
|
+
def terminate_app(identifier, args = [])
|
101
101
|
SimCtl.terminate_app(self, identifier, args)
|
102
102
|
end
|
103
103
|
|
@@ -121,7 +121,7 @@ module SimCtl
|
|
121
121
|
#
|
122
122
|
# @return [Bool]
|
123
123
|
def ready?
|
124
|
-
running_services = launchctl.list.reject {|service| service.pid.to_i == 0 }.map
|
124
|
+
running_services = launchctl.list.reject { |service| service.pid.to_i == 0 }.map(&:name)
|
125
125
|
(required_services_for_ready - running_services).empty?
|
126
126
|
end
|
127
127
|
|
@@ -164,7 +164,7 @@ module SimCtl
|
|
164
164
|
# * type: Can be png, tiff, bmp, gif, jpeg (default is png)
|
165
165
|
# * display: Can be main or tv for iOS, tv for tvOS and main for watchOS
|
166
166
|
# @return [void]
|
167
|
-
def screenshot(file, opts={})
|
167
|
+
def screenshot(file, opts = {})
|
168
168
|
SimCtl.screenshot(self, file, opts)
|
169
169
|
end
|
170
170
|
|
@@ -187,7 +187,7 @@ module SimCtl
|
|
187
187
|
# @param path [String] path to executable
|
188
188
|
# @param args [Array] arguments for the executable
|
189
189
|
# @return [void]
|
190
|
-
def spawn(path, args=[], opts={})
|
190
|
+
def spawn(path, args = [], opts = {})
|
191
191
|
SimCtl.spawn(self, path, args, opts)
|
192
192
|
end
|
193
193
|
|
@@ -201,8 +201,8 @@ module SimCtl
|
|
201
201
|
# Reloads the device until the given block returns true
|
202
202
|
#
|
203
203
|
# @return [void]
|
204
|
-
def wait(timeout=SimCtl.default_timeout)
|
205
|
-
Timeout
|
204
|
+
def wait(timeout = SimCtl.default_timeout)
|
205
|
+
Timeout.timeout(timeout) do
|
206
206
|
loop do
|
207
207
|
break if yield SimCtl.device(udid: udid)
|
208
208
|
end
|
@@ -212,7 +212,7 @@ module SimCtl
|
|
212
212
|
|
213
213
|
def ==(other)
|
214
214
|
return false if other.nil?
|
215
|
-
return false unless other.
|
215
|
+
return false unless other.is_a? Device
|
216
216
|
other.udid == udid
|
217
217
|
end
|
218
218
|
|
@@ -239,12 +239,12 @@ module SimCtl
|
|
239
239
|
if Xcode::Version.gte? '8.0'
|
240
240
|
[
|
241
241
|
'com.apple.mobileassetd',
|
242
|
-
'com.apple.nsurlsessiond'
|
242
|
+
'com.apple.nsurlsessiond'
|
243
243
|
]
|
244
244
|
else
|
245
245
|
[
|
246
246
|
'com.apple.mobileassetd',
|
247
|
-
'com.apple.networkd'
|
247
|
+
'com.apple.networkd'
|
248
248
|
]
|
249
249
|
end
|
250
250
|
when :ios
|
@@ -253,20 +253,20 @@ module SimCtl
|
|
253
253
|
'com.apple.backboardd',
|
254
254
|
'com.apple.mobile.installd',
|
255
255
|
'com.apple.CoreSimulator.bridge',
|
256
|
-
'com.apple.SpringBoard'
|
256
|
+
'com.apple.SpringBoard'
|
257
257
|
]
|
258
258
|
elsif Xcode::Version.gte? '8.0'
|
259
259
|
[
|
260
260
|
'com.apple.SimulatorBridge',
|
261
261
|
'com.apple.SpringBoard',
|
262
262
|
'com.apple.backboardd',
|
263
|
-
'com.apple.mobile.installd'
|
263
|
+
'com.apple.mobile.installd'
|
264
264
|
]
|
265
265
|
else
|
266
266
|
[
|
267
267
|
'com.apple.SimulatorBridge',
|
268
268
|
'com.apple.SpringBoard',
|
269
|
-
'com.apple.mobile.installd'
|
269
|
+
'com.apple.mobile.installd'
|
270
270
|
]
|
271
271
|
end
|
272
272
|
else
|
@@ -7,13 +7,13 @@ module SimCtl
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def list
|
10
|
-
fields = [
|
10
|
+
fields = %i[pid status name]
|
11
11
|
device
|
12
12
|
.spawn(device.path.launchctl, ['list'])
|
13
13
|
.split("\n")
|
14
14
|
.drop(1)
|
15
|
-
.map {|item| Hash[fields.zip(item.split("\t"))] }
|
16
|
-
.map {|item| OpenStruct.new(item) }
|
15
|
+
.map { |item| Hash[fields.zip(item.split("\t"))] }
|
16
|
+
.map { |item| OpenStruct.new(item) }
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
data/lib/simctl/device_path.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'cfpropertylist'
|
2
|
+
|
1
3
|
module SimCtl
|
2
4
|
class DevicePath
|
3
5
|
def initialize(device)
|
@@ -17,11 +19,7 @@ module SimCtl
|
|
17
19
|
end
|
18
20
|
|
19
21
|
def launchctl
|
20
|
-
@launchctl ||=
|
21
|
-
"#{Xcode::Path.home}//Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/bin/launchctl"
|
22
|
-
else
|
23
|
-
File.join(runtime_root, 'bin/launchctl')
|
24
|
-
end
|
22
|
+
@launchctl ||= File.join(runtime_root, 'bin/launchctl')
|
25
23
|
end
|
26
24
|
|
27
25
|
def preferences_plist
|
@@ -38,9 +36,22 @@ module SimCtl
|
|
38
36
|
end
|
39
37
|
|
40
38
|
def locate_runtime_root
|
41
|
-
|
42
|
-
|
39
|
+
runtime_identifier = device.runtime.identifier
|
40
|
+
|
41
|
+
[
|
42
|
+
Xcode::Path.runtime_profiles,
|
43
|
+
'/Library/Developer/CoreSimulator/Profiles/Runtimes/'
|
44
|
+
].each do |parent_dir|
|
45
|
+
Dir.glob(File.join(File.expand_path(parent_dir), '*')).each do |dir|
|
46
|
+
plist_path = File.join(dir, 'Contents/Info.plist')
|
47
|
+
next unless File.exist?(plist_path)
|
48
|
+
info = CFPropertyList.native_types(CFPropertyList::List.new(file: plist_path).value)
|
49
|
+
next unless info.is_a?(Hash) && (info['CFBundleIdentifier'] == runtime_identifier)
|
50
|
+
root_path = File.join(dir, 'Contents/Resources/RuntimeRoot')
|
51
|
+
return root_path if File.exist?(root_path)
|
52
|
+
end
|
43
53
|
end
|
54
|
+
|
44
55
|
Xcode::Path.sdk_root
|
45
56
|
end
|
46
57
|
|
@@ -13,7 +13,7 @@ module SimCtl
|
|
13
13
|
# @return [void]
|
14
14
|
def disable_keyboard_helpers
|
15
15
|
edit_plist(path.preferences_plist) do |plist|
|
16
|
-
%w
|
16
|
+
%w[
|
17
17
|
KeyboardAllowPaddle
|
18
18
|
KeyboardAssistant
|
19
19
|
KeyboardAutocapitalization
|
@@ -23,7 +23,7 @@ module SimCtl
|
|
23
23
|
KeyboardPeriodShortcut
|
24
24
|
KeyboardPrediction
|
25
25
|
KeyboardShowPredictionBar
|
26
|
-
|
26
|
+
].each do |key|
|
27
27
|
plist[key] = false
|
28
28
|
end
|
29
29
|
end
|
@@ -39,8 +39,8 @@ module SimCtl
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
def edit_plist(path
|
43
|
-
plist = File.
|
42
|
+
def edit_plist(path)
|
43
|
+
plist = File.exist?(path) ? CFPropertyList::List.new(file: path) : CFPropertyList::List.new
|
44
44
|
content = CFPropertyList.native_types(plist.value) || {}
|
45
45
|
yield content
|
46
46
|
plist.value = CFPropertyList.guess(content)
|
@@ -53,7 +53,7 @@ module SimCtl
|
|
53
53
|
def set_language(language)
|
54
54
|
edit_plist(path.global_preferences_plist) do |plist|
|
55
55
|
key = 'AppleLanguages'
|
56
|
-
plist[key] = [] unless plist.
|
56
|
+
plist[key] = [] unless plist.key?(key)
|
57
57
|
plist[key].unshift(language).uniq!
|
58
58
|
end
|
59
59
|
end
|
data/lib/simctl/device_type.rb
CHANGED
data/lib/simctl/executor.rb
CHANGED
@@ -7,11 +7,11 @@ module SimCtl
|
|
7
7
|
def execute(command)
|
8
8
|
command = command.flatten.join(' ')
|
9
9
|
$stderr.puts command if ENV['SIMCTL_DEBUG']
|
10
|
-
Open3.popen3(command) do |
|
10
|
+
Open3.popen3(command) do |_stdin, stdout, stderr, result|
|
11
11
|
output = stdout.read
|
12
12
|
if result.value.to_i > 0
|
13
13
|
output = stderr.read if output.empty?
|
14
|
-
raise
|
14
|
+
raise output
|
15
15
|
end
|
16
16
|
return unless block_given?
|
17
17
|
if looks_like_json?(output)
|
@@ -25,7 +25,7 @@ module SimCtl
|
|
25
25
|
private
|
26
26
|
|
27
27
|
def looks_like_json?(output)
|
28
|
-
output.start_with?('['
|
28
|
+
output.start_with?('[', '{')
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
data/lib/simctl/list.rb
CHANGED
@@ -12,12 +12,12 @@ module SimCtl
|
|
12
12
|
select do |item|
|
13
13
|
matches = true
|
14
14
|
filter.each do |key, value|
|
15
|
-
case value
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
matches &= case value
|
16
|
+
when Regexp
|
17
|
+
item.send(key) =~ value
|
18
|
+
else
|
19
|
+
item.send(key) == value
|
20
|
+
end
|
21
21
|
end
|
22
22
|
matches
|
23
23
|
end
|
data/lib/simctl/object.rb
CHANGED
data/lib/simctl/runtime.rb
CHANGED
@@ -11,7 +11,7 @@ module SimCtl
|
|
11
11
|
|
12
12
|
def ==(other)
|
13
13
|
return false if other.nil?
|
14
|
-
return false unless other.
|
14
|
+
return false unless other.is_a? Runtime
|
15
15
|
other.identifier == identifier
|
16
16
|
end
|
17
17
|
|
@@ -20,7 +20,7 @@ module SimCtl
|
|
20
20
|
# @param name [String] type (ios, watchos, tvos)
|
21
21
|
# @return [SimCtl::Runtime] the latest available runtime
|
22
22
|
def self.latest(type)
|
23
|
-
Naturally.sort_by(SimCtl.list_runtimes.where(name:
|
23
|
+
Naturally.sort_by(SimCtl.list_runtimes.where(name: /#{type}/i), :version).last
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
data/lib/simctl/version.rb
CHANGED
data/lib/simctl/xcode/path.rb
CHANGED
@@ -1,15 +1,21 @@
|
|
1
1
|
module SimCtl
|
2
2
|
module Xcode
|
3
3
|
class Path
|
4
|
-
HOME=`xcode-select -p`.chomp
|
5
|
-
|
6
4
|
class << self
|
7
5
|
def home
|
8
|
-
|
6
|
+
@home ||= `xcode-select -p`.chomp
|
9
7
|
end
|
10
8
|
|
11
9
|
def sdk_root
|
12
|
-
File.join(
|
10
|
+
File.join(home, 'Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk')
|
11
|
+
end
|
12
|
+
|
13
|
+
def runtime_profiles
|
14
|
+
if Xcode::Version.gte? '9.0'
|
15
|
+
File.join(home, 'Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/')
|
16
|
+
else
|
17
|
+
File.join(home, 'Platforms/iPhoneSimulator.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/')
|
18
|
+
end
|
13
19
|
end
|
14
20
|
end
|
15
21
|
end
|
data/lib/simctl/xcode/version.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
module SimCtl
|
2
2
|
module Xcode
|
3
3
|
class Version
|
4
|
-
VERSION = Gem::Version.new(`xcodebuild -version`.scan(/Xcode (\S+)/).flatten.first)
|
5
|
-
|
6
4
|
class << self
|
7
5
|
def gte?(version)
|
8
|
-
|
6
|
+
@version ||= Gem::Version.new(`xcodebuild -version`.scan(/Xcode (\S+)/).flatten.first)
|
7
|
+
|
8
|
+
@version >= Gem::Version.new(version)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
data/simctl.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
|
2
3
|
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
3
4
|
require 'simctl/version'
|
4
5
|
|
@@ -9,7 +10,7 @@ Gem::Specification.new do |s|
|
|
9
10
|
s.description = 'Ruby interface to xcrun simctl'
|
10
11
|
|
11
12
|
s.authors = ['Johannes Plunien']
|
12
|
-
s.email = %w
|
13
|
+
s.email = %w[plu@pqpq.de]
|
13
14
|
s.homepage = 'https://github.com/plu/simctl'
|
14
15
|
s.licenses = ['MIT']
|
15
16
|
|
@@ -21,6 +22,7 @@ Gem::Specification.new do |s|
|
|
21
22
|
s.add_development_dependency 'coveralls'
|
22
23
|
s.add_development_dependency 'rake'
|
23
24
|
s.add_development_dependency 'rspec'
|
25
|
+
s.add_development_dependency 'rubocop'
|
24
26
|
|
25
27
|
s.add_dependency 'CFPropertyList'
|
26
28
|
s.add_dependency 'naturally'
|
@@ -4,15 +4,15 @@ require 'spec_helper'
|
|
4
4
|
RSpec.describe SimCtl, order: :defined do
|
5
5
|
before(:all) do
|
6
6
|
@name = SecureRandom.hex
|
7
|
-
@devicetype = SimCtl.devicetype(name: 'iPhone
|
7
|
+
@devicetype = SimCtl.devicetype(name: 'iPhone 6')
|
8
8
|
@runtime = SimCtl::Runtime.latest(:ios)
|
9
9
|
@device = SimCtl.create_device @name, @devicetype, @runtime
|
10
|
-
@device.wait {|d| d.state == :shutdown}
|
10
|
+
@device.wait { |d| d.state == :shutdown }
|
11
11
|
end
|
12
12
|
|
13
13
|
after(:all) do
|
14
14
|
with_rescue { @device.kill }
|
15
|
-
with_rescue { @device.wait {|d| d.state == :shutdown} }
|
15
|
+
with_rescue { @device.wait { |d| d.state == :shutdown } }
|
16
16
|
with_rescue { @device.delete }
|
17
17
|
end
|
18
18
|
|
@@ -77,7 +77,7 @@ RSpec.describe SimCtl, order: :defined do
|
|
77
77
|
describe 'device settings' do
|
78
78
|
describe 'update hardware keyboard' do
|
79
79
|
it 'creates the preferences plist' do
|
80
|
-
File.delete(@device.path.preferences_plist) if File.
|
80
|
+
File.delete(@device.path.preferences_plist) if File.exist?(@device.path.preferences_plist)
|
81
81
|
@device.settings.update_hardware_keyboard(false)
|
82
82
|
expect(File).to exist(@device.path.preferences_plist)
|
83
83
|
end
|
@@ -85,7 +85,7 @@ RSpec.describe SimCtl, order: :defined do
|
|
85
85
|
|
86
86
|
describe 'disable keyboard helpers' do
|
87
87
|
it 'creates the preferences plist' do
|
88
|
-
File.delete(@device.path.preferences_plist) if File.
|
88
|
+
File.delete(@device.path.preferences_plist) if File.exist?(@device.path.preferences_plist)
|
89
89
|
@device.settings.disable_keyboard_helpers
|
90
90
|
expect(File).to exist(@device.path.preferences_plist)
|
91
91
|
end
|
@@ -139,12 +139,12 @@ RSpec.describe SimCtl, order: :defined do
|
|
139
139
|
describe 'launching the device' do
|
140
140
|
it 'launches the device' do
|
141
141
|
@device.launch
|
142
|
-
@device.wait {|d| d.state == :booted}
|
142
|
+
@device.wait { |d| d.state == :booted }
|
143
143
|
expect(@device.state).to be == :booted
|
144
144
|
end
|
145
145
|
|
146
146
|
it 'is ready' do
|
147
|
-
@device.wait
|
147
|
+
@device.wait(&:ready?)
|
148
148
|
expect(@device).to be_ready
|
149
149
|
end
|
150
150
|
end
|
@@ -223,7 +223,7 @@ RSpec.describe SimCtl, order: :defined do
|
|
223
223
|
|
224
224
|
it 'kills the device' do
|
225
225
|
@device.kill
|
226
|
-
@device.wait {|d| d.state == :shutdown}
|
226
|
+
@device.wait { |d| d.state == :shutdown }
|
227
227
|
end
|
228
228
|
|
229
229
|
it 'state is shutdown' do
|
@@ -238,7 +238,7 @@ RSpec.describe SimCtl, order: :defined do
|
|
238
238
|
|
239
239
|
it 'boots the device' do
|
240
240
|
@device.boot
|
241
|
-
@device.wait {|d| d.state == :booted}
|
241
|
+
@device.wait { |d| d.state == :booted }
|
242
242
|
expect(@device.state).to be == :booted
|
243
243
|
end
|
244
244
|
|
@@ -247,7 +247,7 @@ RSpec.describe SimCtl, order: :defined do
|
|
247
247
|
end
|
248
248
|
|
249
249
|
it 'is ready' do
|
250
|
-
@device.wait
|
250
|
+
@device.wait(&:ready?)
|
251
251
|
expect(@device).to be_ready
|
252
252
|
end
|
253
253
|
end
|
@@ -259,7 +259,7 @@ RSpec.describe SimCtl, order: :defined do
|
|
259
259
|
|
260
260
|
it 'shuts down the device' do
|
261
261
|
@device.shutdown
|
262
|
-
@device.wait {|d| d.state == :shutdown}
|
262
|
+
@device.wait { |d| d.state == :shutdown }
|
263
263
|
end
|
264
264
|
|
265
265
|
it 'state is shutdown' do
|