run_loop 2.1.7 → 2.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/run_loop/core_simulator.rb +76 -3
- data/lib/run_loop/device_agent/Frameworks.zip +0 -0
- data/lib/run_loop/device_agent/app/DeviceAgent-Runner.app.zip +0 -0
- data/lib/run_loop/device_agent/bin/CLI.json +125 -0
- data/lib/run_loop/device_agent/bin/iOSDeviceManager +0 -0
- data/lib/run_loop/device_agent/client.rb +853 -0
- data/lib/run_loop/device_agent/ios_device_manager.rb +97 -32
- data/lib/run_loop/device_agent/ipa/DeviceAgent-Runner.app.zip +0 -0
- data/lib/run_loop/device_agent/{launcher.rb → launcher_strategy.rb} +8 -8
- data/lib/run_loop/device_agent/{cbxrunner.rb → runner.rb} +15 -25
- data/lib/run_loop/device_agent/xcodebuild.rb +25 -8
- data/lib/run_loop/environment.rb +10 -6
- data/lib/run_loop/http/retriable_client.rb +7 -1
- data/lib/run_loop/simctl.rb +24 -15
- data/lib/run_loop/version.rb +7 -2
- data/lib/run_loop/xcode.rb +2 -2
- data/lib/run_loop.rb +13 -13
- metadata +10 -7
- data/lib/run_loop/device_agent/app/CBX-Runner.app.zip +0 -0
- data/lib/run_loop/device_agent/ipa/CBX-Runner.app.zip +0 -0
- data/lib/run_loop/xcuitest.rb +0 -727
@@ -5,7 +5,15 @@ module RunLoop
|
|
5
5
|
# @!visibility private
|
6
6
|
#
|
7
7
|
# A wrapper around the test-control binary.
|
8
|
-
class IOSDeviceManager < RunLoop::DeviceAgent::
|
8
|
+
class IOSDeviceManager < RunLoop::DeviceAgent::LauncherStrategy
|
9
|
+
|
10
|
+
EXIT_CODES = {
|
11
|
+
"0" => :success,
|
12
|
+
"2" => :false
|
13
|
+
}.freeze
|
14
|
+
|
15
|
+
require "run_loop/shell"
|
16
|
+
include RunLoop::Shell
|
9
17
|
|
10
18
|
# @!visibility private
|
11
19
|
@@ios_device_manager = nil
|
@@ -40,7 +48,7 @@ but binary does not exist at that path.
|
|
40
48
|
|
41
49
|
# @!visibility private
|
42
50
|
def name
|
43
|
-
:
|
51
|
+
:ios_device_manager
|
44
52
|
end
|
45
53
|
|
46
54
|
# @!visibility private
|
@@ -55,56 +63,73 @@ but binary does not exist at that path.
|
|
55
63
|
|
56
64
|
# @!visibility private
|
57
65
|
def runner
|
58
|
-
@runner ||= RunLoop::DeviceAgent::
|
66
|
+
@runner ||= RunLoop::DeviceAgent::Runner.new(device)
|
59
67
|
end
|
60
68
|
|
61
69
|
# @!visibility private
|
62
70
|
def self.log_file
|
63
|
-
path = File.join(
|
71
|
+
path = File.join(LauncherStrategy.dot_dir, "ios-device-manager.log")
|
64
72
|
FileUtils.touch(path) if !File.exist?(path)
|
65
73
|
path
|
66
74
|
end
|
67
75
|
|
68
76
|
# @!visibility private
|
69
|
-
def launch
|
77
|
+
def launch(options)
|
78
|
+
code_sign_identity = options[:code_sign_identity]
|
79
|
+
|
70
80
|
RunLoop::DeviceAgent::Frameworks.instance.install
|
81
|
+
cmd = RunLoop::DeviceAgent::IOSDeviceManager.ios_device_manager
|
71
82
|
|
72
|
-
|
83
|
+
start = Time.now
|
73
84
|
if device.simulator?
|
74
|
-
|
75
|
-
CoreSimulator.quit_simulator
|
85
|
+
cbxapp = RunLoop::App.new(runner.runner)
|
76
86
|
|
77
|
-
|
87
|
+
# quits the simulator
|
88
|
+
sim = CoreSimulator.new(device, cbxapp)
|
89
|
+
sim.install
|
90
|
+
sim.launch_simulator
|
91
|
+
else
|
78
92
|
|
79
|
-
|
80
|
-
|
81
|
-
|
93
|
+
if !code_sign_identity
|
94
|
+
raise ArgumentError, %Q[
|
95
|
+
Targeting a physical devices requires a code signing identity.
|
82
96
|
|
83
|
-
|
84
|
-
#
|
85
|
-
# # quits the simulator
|
86
|
-
# sim = CoreSimulator.new(device, cbxapp)
|
87
|
-
# sim.install
|
88
|
-
# sim.launch_simulator
|
89
|
-
end
|
97
|
+
Rerun your test with:
|
90
98
|
|
91
|
-
|
99
|
+
$ CODE_SIGN_IDENTITY="iPhone Developer: Your Name (ABCDEF1234)" cucumber
|
92
100
|
|
93
|
-
|
94
|
-
|
95
|
-
"-t", runner.tester,
|
96
|
-
"-d", device.udid]
|
101
|
+
]
|
102
|
+
end
|
97
103
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
104
|
+
options = {:log_cmd => true}
|
105
|
+
args = [
|
106
|
+
cmd, "install",
|
107
|
+
"--device-id", device.udid,
|
108
|
+
"--app-bundle", runner.runner,
|
109
|
+
"--codesign-identity", code_sign_identity
|
110
|
+
]
|
102
111
|
|
103
|
-
|
104
|
-
args
|
105
|
-
|
112
|
+
start = Time.now
|
113
|
+
hash = run_shell_command(args, options)
|
114
|
+
|
115
|
+
|
116
|
+
if hash[:exit_status] != 0
|
117
|
+
raise RuntimeError, %Q[
|
118
|
+
|
119
|
+
Could not install #{runner.runner}. iOSDeviceManager says:
|
120
|
+
|
121
|
+
#{hash[:out]}
|
122
|
+
|
123
|
+
]
|
124
|
+
end
|
106
125
|
end
|
107
126
|
|
127
|
+
RunLoop::log_debug("Took #{Time.now - start} seconds to install DeviceAgent");
|
128
|
+
|
129
|
+
cmd = RunLoop::DeviceAgent::IOSDeviceManager.ios_device_manager
|
130
|
+
|
131
|
+
args = ["start_test", "--device-id", device.udid]
|
132
|
+
|
108
133
|
log_file = IOSDeviceManager.log_file
|
109
134
|
FileUtils.rm_rf(log_file)
|
110
135
|
FileUtils.touch(log_file)
|
@@ -122,11 +147,51 @@ but binary does not exist at that path.
|
|
122
147
|
Process.detach(pid)
|
123
148
|
|
124
149
|
if device.simulator?
|
125
|
-
|
150
|
+
# Give it a whirl.
|
151
|
+
# device.simulator_wait_for_stable_state
|
126
152
|
end
|
127
153
|
|
128
154
|
pid.to_i
|
129
155
|
end
|
156
|
+
|
157
|
+
def app_installed?(bundle_identifier)
|
158
|
+
options = {:log_cmd => true}
|
159
|
+
|
160
|
+
cmd = RunLoop::DeviceAgent::IOSDeviceManager.ios_device_manager
|
161
|
+
|
162
|
+
args = [
|
163
|
+
cmd, "is_installed",
|
164
|
+
"--device-id", device.udid,
|
165
|
+
"--bundle-identifier", bundle_identifier
|
166
|
+
]
|
167
|
+
|
168
|
+
start = Time.now
|
169
|
+
hash = run_shell_command(args, options)
|
170
|
+
|
171
|
+
exit_status = EXIT_CODES[hash[:exit_status].to_s]
|
172
|
+
if exit_status == :success
|
173
|
+
true
|
174
|
+
elsif exit_status == :false
|
175
|
+
false
|
176
|
+
else
|
177
|
+
raise RuntimeError, %Q[
|
178
|
+
|
179
|
+
Could not check if app is installed:
|
180
|
+
|
181
|
+
bundle identifier: #{bundle_identifier}
|
182
|
+
device: #{device}
|
183
|
+
|
184
|
+
iOSDeviceManager says:
|
185
|
+
|
186
|
+
#{hash[:out]}
|
187
|
+
|
188
|
+
]
|
189
|
+
end
|
190
|
+
|
191
|
+
RunLoop::log_debug("Took #{Time.now - start} seconds to check if app was installed");
|
192
|
+
|
193
|
+
hash[:exit_status] == 0
|
194
|
+
end
|
130
195
|
end
|
131
196
|
end
|
132
197
|
end
|
Binary file
|
@@ -4,9 +4,9 @@ module RunLoop
|
|
4
4
|
module DeviceAgent
|
5
5
|
# @!visibility private
|
6
6
|
#
|
7
|
-
#
|
8
|
-
# device.
|
9
|
-
class
|
7
|
+
# A base class for something that can launch the DeviceAgent-Runner on a
|
8
|
+
# device.
|
9
|
+
class LauncherStrategy
|
10
10
|
require "run_loop/abstract"
|
11
11
|
include RunLoop::Abstract
|
12
12
|
|
@@ -14,7 +14,7 @@ module RunLoop
|
|
14
14
|
attr_reader :device
|
15
15
|
|
16
16
|
# @!visibility private
|
17
|
-
# @param [RunLoop::Device] device where to launch the
|
17
|
+
# @param [RunLoop::Device] device where to launch the DeviceAgent-Runner
|
18
18
|
def initialize(device)
|
19
19
|
@device = device
|
20
20
|
|
@@ -24,7 +24,7 @@ Invalid device:
|
|
24
24
|
|
25
25
|
#{device}
|
26
26
|
|
27
|
-
|
27
|
+
DeviceAgent is only available for iOS >= 9.0
|
28
28
|
]
|
29
29
|
end
|
30
30
|
end
|
@@ -32,15 +32,15 @@ XCUITest is only available for iOS >= 9.0
|
|
32
32
|
# @!visibility private
|
33
33
|
# The name of this launcher. Must be a symbol (keyword). This value will
|
34
34
|
# be used for the key :cbx_launcher in the RunLoop::Cache so Calabash
|
35
|
-
# iOS can attach and reattach to
|
35
|
+
# iOS can attach and reattach to a DeviceAgent instance.
|
36
36
|
def name
|
37
37
|
abstract_method!
|
38
38
|
end
|
39
39
|
|
40
40
|
# @!visibility private
|
41
41
|
#
|
42
|
-
# Does whatever it takes to launch the
|
43
|
-
def launch
|
42
|
+
# Does whatever it takes to launch the DeviceAgent-Runner on the device.
|
43
|
+
def launch(options)
|
44
44
|
abstract_method!
|
45
45
|
end
|
46
46
|
|
@@ -3,8 +3,7 @@ module RunLoop
|
|
3
3
|
# @!visibility private
|
4
4
|
module DeviceAgent
|
5
5
|
# @!visibility private
|
6
|
-
class
|
7
|
-
|
6
|
+
class Runner
|
8
7
|
|
9
8
|
# @!visibility private
|
10
9
|
@@cbxdevice = nil
|
@@ -19,7 +18,7 @@ module RunLoop
|
|
19
18
|
|
20
19
|
# @!visibility private
|
21
20
|
def self.detect_cbxsim
|
22
|
-
@@cbxsim ||=
|
21
|
+
@@cbxsim ||= begin
|
23
22
|
from_env = RunLoop::Environment.cbxsim
|
24
23
|
|
25
24
|
if from_env
|
@@ -37,12 +36,12 @@ but runner does not exist at that path.
|
|
37
36
|
else
|
38
37
|
self.default_cbxsim
|
39
38
|
end
|
40
|
-
end
|
39
|
+
end
|
41
40
|
end
|
42
41
|
|
43
42
|
# @!visibility private
|
44
43
|
def self.detect_cbxdevice
|
45
|
-
@@cbxdevice ||=
|
44
|
+
@@cbxdevice ||= begin
|
46
45
|
from_env = RunLoop::Environment.cbxdevice
|
47
46
|
|
48
47
|
if from_env
|
@@ -60,12 +59,12 @@ but runner does not exist at that path.
|
|
60
59
|
else
|
61
60
|
self.default_cbxdevice
|
62
61
|
end
|
63
|
-
end
|
62
|
+
end
|
64
63
|
end
|
65
64
|
|
66
65
|
# @!visibility private
|
67
66
|
def self.default_cbxdevice
|
68
|
-
cbx = File.join(self.device_agent_dir, "ipa", "
|
67
|
+
cbx = File.join(self.device_agent_dir, "ipa", "DeviceAgent-Runner.app")
|
69
68
|
|
70
69
|
if !File.exist?(cbx)
|
71
70
|
self.expand_runner_archive("#{cbx}.zip")
|
@@ -76,7 +75,7 @@ but runner does not exist at that path.
|
|
76
75
|
|
77
76
|
# @!visibility private
|
78
77
|
def self.default_cbxsim
|
79
|
-
cbx = File.join(self.device_agent_dir, "app", "
|
78
|
+
cbx = File.join(self.device_agent_dir, "app", "DeviceAgent-Runner.app")
|
80
79
|
|
81
80
|
if !File.exist?(cbx)
|
82
81
|
self.expand_runner_archive("#{cbx}.zip")
|
@@ -86,22 +85,13 @@ but runner does not exist at that path.
|
|
86
85
|
end
|
87
86
|
|
88
87
|
# @!visibility private
|
89
|
-
# TODO move this behavior to shell.rb - should be able to call Shell.run_unix_command
|
90
88
|
def self.expand_runner_archive(archive)
|
91
|
-
shell = Class.new do
|
92
|
-
require "run_loop/shell"
|
93
|
-
include RunLoop::Shell
|
94
|
-
def to_s; "#<CBXRunner Shell>"; end
|
95
|
-
def inspect; to_s; end
|
96
|
-
end.new
|
97
|
-
|
98
89
|
dir = File.dirname(archive)
|
99
90
|
options = { :log_cmd => true }
|
100
91
|
Dir.chdir(dir) do
|
101
|
-
|
102
|
-
shell.run_shell_command(["ditto", "-xk", File.basename(archive), "."], options)
|
92
|
+
Shell.run_shell_command(["ditto", "-xk", File.basename(archive), "."], options)
|
103
93
|
end
|
104
|
-
File.join(dir, "
|
94
|
+
File.join(dir, "DeviceAgent-Runner.app")
|
105
95
|
end
|
106
96
|
|
107
97
|
# @!visibility private
|
@@ -115,18 +105,18 @@ but runner does not exist at that path.
|
|
115
105
|
|
116
106
|
# @!visibility private
|
117
107
|
def runner
|
118
|
-
@runner ||=
|
108
|
+
@runner ||= begin
|
119
109
|
if device.physical_device?
|
120
|
-
RunLoop::DeviceAgent::
|
110
|
+
RunLoop::DeviceAgent::Runner.detect_cbxdevice
|
121
111
|
else
|
122
|
-
RunLoop::DeviceAgent::
|
112
|
+
RunLoop::DeviceAgent::Runner.detect_cbxsim
|
123
113
|
end
|
124
|
-
end
|
114
|
+
end
|
125
115
|
end
|
126
116
|
|
127
117
|
# @!visibility private
|
128
118
|
def tester
|
129
|
-
@tester ||= File.join(runner, "PlugIns", "
|
119
|
+
@tester ||= File.join(runner, "PlugIns", "DeviceAgent.xctest")
|
130
120
|
end
|
131
121
|
|
132
122
|
# @!visibility private
|
@@ -143,7 +133,7 @@ but runner does not exist at that path.
|
|
143
133
|
|
144
134
|
# @!visibility private
|
145
135
|
def info_plist
|
146
|
-
@info_plist ||= File.join(runner, "
|
136
|
+
@info_plist ||= File.join(runner, "Info.plist")
|
147
137
|
end
|
148
138
|
|
149
139
|
# @!visibility private
|
@@ -5,7 +5,7 @@ module RunLoop
|
|
5
5
|
module DeviceAgent
|
6
6
|
|
7
7
|
# @!visibility private
|
8
|
-
class Xcodebuild < RunLoop::DeviceAgent::
|
8
|
+
class Xcodebuild < RunLoop::DeviceAgent::LauncherStrategy
|
9
9
|
|
10
10
|
# @!visibility private
|
11
11
|
def self.log_file
|
@@ -30,7 +30,7 @@ module RunLoop
|
|
30
30
|
end
|
31
31
|
|
32
32
|
# @!visibility private
|
33
|
-
def launch
|
33
|
+
def launch(_)
|
34
34
|
workspace
|
35
35
|
|
36
36
|
if device.simulator?
|
@@ -48,14 +48,25 @@ module RunLoop
|
|
48
48
|
|
49
49
|
# @!visibility private
|
50
50
|
def workspace
|
51
|
-
@workspace ||=
|
52
|
-
path = RunLoop::Environment.send(:cbxws)
|
53
|
-
|
51
|
+
@workspace ||= begin
|
52
|
+
path = RunLoop::Environment.send(:cbxws) || default_workspace
|
53
|
+
|
54
|
+
if File.exist?(path)
|
54
55
|
path
|
55
56
|
else
|
56
|
-
raise
|
57
|
+
raise(RuntimeError, %Q[
|
58
|
+
Cannot find the DeviceAgent.xcworkspace.
|
59
|
+
|
60
|
+
Expected it here:
|
61
|
+
|
62
|
+
#{path}
|
63
|
+
|
64
|
+
Use the CBXWS environment variable to override the default.
|
65
|
+
|
66
|
+
])
|
67
|
+
|
57
68
|
end
|
58
|
-
end
|
69
|
+
end
|
59
70
|
end
|
60
71
|
|
61
72
|
# @!visibility private
|
@@ -68,7 +79,7 @@ module RunLoop
|
|
68
79
|
args = [
|
69
80
|
"xcrun",
|
70
81
|
"xcodebuild",
|
71
|
-
"-scheme", "
|
82
|
+
"-scheme", "AppStub",
|
72
83
|
"-workspace", workspace,
|
73
84
|
"-config", "Debug",
|
74
85
|
"-destination",
|
@@ -95,6 +106,12 @@ module RunLoop
|
|
95
106
|
Process.detach(pid)
|
96
107
|
pid.to_i
|
97
108
|
end
|
109
|
+
|
110
|
+
def default_workspace
|
111
|
+
this_dir = File.expand_path(File.dirname(__FILE__))
|
112
|
+
relative = File.expand_path(File.join(this_dir, "..", "..", "..", ".."))
|
113
|
+
File.join(relative, "DeviceAgent.iOS/DeviceAgent.xcworkspace")
|
114
|
+
end
|
98
115
|
end
|
99
116
|
end
|
100
117
|
end
|
data/lib/run_loop/environment.rb
CHANGED
@@ -316,9 +316,11 @@ module RunLoop
|
|
316
316
|
end
|
317
317
|
|
318
318
|
# !@visibility private
|
319
|
-
# Returns the value of CBXWS. This can be used
|
320
|
-
#
|
321
|
-
#
|
319
|
+
# Returns the value of CBXWS. This can be used in conjunction with
|
320
|
+
# :cbx_launcher => :xcodebuild to launch the DeviceAgent rather than
|
321
|
+
# iOSDeviceManager.
|
322
|
+
#
|
323
|
+
# You should only set this if you are actively developing the DeviceAgent.
|
322
324
|
def self.cbxws
|
323
325
|
value = ENV["CBXWS"]
|
324
326
|
if value.nil? || value == ""
|
@@ -326,12 +328,14 @@ module RunLoop
|
|
326
328
|
else
|
327
329
|
path = File.expand_path(value)
|
328
330
|
if !File.directory?(path)
|
329
|
-
raise RuntimeError, %Q[
|
331
|
+
raise RuntimeError, %Q[
|
332
|
+
CBXWS is set, but there is no workspace at
|
333
|
+
|
330
334
|
#{path}
|
331
335
|
|
332
|
-
Only set CBXWS if you are developing new features in the
|
336
|
+
Only set CBXWS if you are developing new features in the DeviceAgent.
|
333
337
|
|
334
|
-
|
338
|
+
]
|
335
339
|
end
|
336
340
|
path
|
337
341
|
end
|
@@ -113,7 +113,13 @@ module RunLoop
|
|
113
113
|
interval = options.fetch(:interval, @interval)
|
114
114
|
header = options.fetch(:header, HEADER)
|
115
115
|
|
116
|
-
RunLoop.
|
116
|
+
if RunLoop::Environment.debug?
|
117
|
+
http_options = {
|
118
|
+
:retries => retries,
|
119
|
+
:timeout => timeout
|
120
|
+
}
|
121
|
+
RunLoop.log_debug("HTTP: #{request_method} #{@server.endpoint + request.route} #{http_options}")
|
122
|
+
end
|
117
123
|
|
118
124
|
start_time = Time.now
|
119
125
|
last_error = nil
|
data/lib/run_loop/simctl.rb
CHANGED
@@ -24,6 +24,7 @@ module RunLoop
|
|
24
24
|
"Shutdown" => 1,
|
25
25
|
"Shutting Down" => 2,
|
26
26
|
"Booted" => 3,
|
27
|
+
"Plist Missing" => -1
|
27
28
|
}.freeze
|
28
29
|
|
29
30
|
# @!visibility private
|
@@ -38,24 +39,28 @@ module RunLoop
|
|
38
39
|
|
39
40
|
# @!visibility private
|
40
41
|
def self.ensure_valid_core_simulator_service
|
42
|
+
max_tries = 3
|
43
|
+
valid = false
|
44
|
+
3.times do |try|
|
45
|
+
valid = self.valid_core_simulator_service?
|
46
|
+
break if valid
|
47
|
+
RunLoop.log_debug("Invalid CoreSimulator service for active Xcode: try #{try + 1} of #{max_tries}")
|
48
|
+
end
|
49
|
+
valid
|
50
|
+
end
|
51
|
+
|
52
|
+
# @!visibility private
|
53
|
+
def self.valid_core_simulator_service?
|
41
54
|
require "run_loop/shell"
|
42
55
|
args = ["xcrun", "simctl", "help"]
|
43
56
|
|
44
|
-
|
45
|
-
|
46
|
-
hash
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
RunLoop.log_debug("Invalid CoreSimulator service for active Xcode: try #{try + 1} of #{max_tries}")
|
51
|
-
else
|
52
|
-
return true
|
53
|
-
end
|
54
|
-
rescue RunLoop::Shell::Error => _
|
55
|
-
RunLoop.log_debug("Invalid CoreSimulator service for active Xcode, retrying #{try + 1} of #{max_tries}")
|
56
|
-
end
|
57
|
+
begin
|
58
|
+
hash = Shell.run_shell_command(args)
|
59
|
+
hash[:exit_status] == 0 &&
|
60
|
+
!hash[:out][/Failed to locate a valid instance of CoreSimulatorService/]
|
61
|
+
rescue RunLoop::Shell::Error => _
|
62
|
+
false
|
57
63
|
end
|
58
|
-
false
|
59
64
|
end
|
60
65
|
|
61
66
|
# @!visibility private
|
@@ -119,7 +124,11 @@ module RunLoop
|
|
119
124
|
# @!visibility private
|
120
125
|
def simulator_state_as_int(device)
|
121
126
|
plist = device.simulator_device_plist
|
122
|
-
|
127
|
+
if File.exist?(plist)
|
128
|
+
pbuddy.plist_read("state", plist).to_i
|
129
|
+
else
|
130
|
+
SIM_STATES["Plist Missing"]
|
131
|
+
end
|
123
132
|
end
|
124
133
|
|
125
134
|
# @!visibility private
|
data/lib/run_loop/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module RunLoop
|
2
|
-
VERSION = "2.1.
|
2
|
+
VERSION = "2.1.8"
|
3
3
|
|
4
4
|
# A model of a software release version that can be used to compare two versions.
|
5
5
|
#
|
@@ -7,12 +7,17 @@ module RunLoop
|
|
7
7
|
# However, the semantic versioning spec is incompatible with RubyGem's patterns
|
8
8
|
# for pre-release gems.
|
9
9
|
#
|
10
|
-
# > "But returning to the practical: No release version of SemVer is compatible
|
10
|
+
# > "But returning to the practical: No release version of SemVer is compatible
|
11
|
+
# > with Rubygems." - _David Kellum_
|
11
12
|
#
|
12
13
|
# Calabash and RunLoop version numbers will be in the form `<major>.<minor>.<patch>[.pre<N>]`.
|
13
14
|
#
|
14
15
|
# @see http://semver.org/
|
15
16
|
# @see http://gravitext.com/2012/07/22/versioning.html
|
17
|
+
#
|
18
|
+
# TODO Expand to handle versions with more than 1 "." and no "."
|
19
|
+
# ^ Needs to handle arbitrary versions from Info.plists. In particular it
|
20
|
+
# needs to handle a unix timestamp - found the DeviceAgent-Runner.app.
|
16
21
|
class Version
|
17
22
|
|
18
23
|
# @!attribute [rw] major
|
data/lib/run_loop/xcode.rb
CHANGED
@@ -237,7 +237,7 @@ module RunLoop
|
|
237
237
|
# @raise [RuntimeError] If path to Xcode.app/Contents/Developer
|
238
238
|
# cannot be determined.
|
239
239
|
def developer_dir
|
240
|
-
@xcode_developer_dir ||=
|
240
|
+
@xcode_developer_dir ||= begin
|
241
241
|
if RunLoop::Environment.developer_dir
|
242
242
|
path = RunLoop::Environment.developer_dir
|
243
243
|
else
|
@@ -267,7 +267,7 @@ $ man xcode-select
|
|
267
267
|
}
|
268
268
|
end
|
269
269
|
path
|
270
|
-
end
|
270
|
+
end
|
271
271
|
end
|
272
272
|
|
273
273
|
private
|
data/lib/run_loop.rb
CHANGED
@@ -20,9 +20,14 @@ require 'run_loop/plist_buddy'
|
|
20
20
|
require "run_loop/codesign"
|
21
21
|
require 'run_loop/app'
|
22
22
|
require 'run_loop/ipa'
|
23
|
-
require "run_loop/
|
23
|
+
require "run_loop/http/error"
|
24
|
+
require "run_loop/http/server"
|
25
|
+
require "run_loop/http/request"
|
26
|
+
require "run_loop/http/retriable_client"
|
27
|
+
require "run_loop/device_agent/client"
|
28
|
+
require "run_loop/device_agent/runner"
|
24
29
|
require "run_loop/device_agent/frameworks"
|
25
|
-
require "run_loop/device_agent/
|
30
|
+
require "run_loop/device_agent/launcher_strategy"
|
26
31
|
require "run_loop/device_agent/ios_device_manager"
|
27
32
|
require "run_loop/device_agent/xcodebuild"
|
28
33
|
require "run_loop/detect_aut/errors"
|
@@ -42,11 +47,6 @@ require "run_loop/simctl"
|
|
42
47
|
require 'run_loop/template'
|
43
48
|
require "run_loop/locale"
|
44
49
|
require "run_loop/language"
|
45
|
-
require "run_loop/xcuitest"
|
46
|
-
require "run_loop/http/error"
|
47
|
-
require "run_loop/http/server"
|
48
|
-
require "run_loop/http/request"
|
49
|
-
require "run_loop/http/retriable_client"
|
50
50
|
require "run_loop/physical_device/life_cycle"
|
51
51
|
require "run_loop/physical_device/ios_device_manager"
|
52
52
|
|
@@ -110,7 +110,7 @@ module RunLoop
|
|
110
110
|
|
111
111
|
gesture_performer = RunLoop.detect_gesture_performer(cloned_options, xcode, device)
|
112
112
|
if gesture_performer == :device_agent
|
113
|
-
RunLoop::
|
113
|
+
RunLoop::DeviceAgent::Client.run(cloned_options)
|
114
114
|
else
|
115
115
|
if RunLoop::Instruments.new.instruments_app_running?
|
116
116
|
raise %q(The Instruments.app is open.
|
@@ -261,8 +261,8 @@ Invalid Xcode and iOS combination:
|
|
261
261
|
Xcode version: #{xcode.version.to_s}
|
262
262
|
iOS version: #{device.version.to_s}
|
263
263
|
|
264
|
-
Calabash cannot test iOS < 9.0 using Xcode 8 because
|
265
|
-
with iOS < 9.0 and UIAutomation is not available in Xcode 8.
|
264
|
+
Calabash cannot test iOS < 9.0 using Xcode 8 because DeviceAgent is not
|
265
|
+
compatible with iOS < 9.0 and UIAutomation is not available in Xcode 8.
|
266
266
|
|
267
267
|
You can rerun your test if you have Xcode 7 installed:
|
268
268
|
|
@@ -280,7 +280,7 @@ $ DEVELOPER_DIR=/path/to/Xcode/7.3.1/Xcode.app/Contents/Developer cucumber
|
|
280
280
|
#
|
281
281
|
# First pass at choosing the correct code path.
|
282
282
|
#
|
283
|
-
# We don't know if we can test on iOS 8 with UIAutomation or
|
283
|
+
# We don't know if we can test on iOS 8 with UIAutomation or DeviceAgent on
|
284
284
|
# Xcode 8.
|
285
285
|
#
|
286
286
|
# @param [Hash] options The options passed by the user
|
@@ -311,8 +311,8 @@ Invalid Xcode and iOS combination:
|
|
311
311
|
Xcode version: #{xcode.version.to_s}
|
312
312
|
iOS version: #{device.version.to_s}
|
313
313
|
|
314
|
-
Calabash cannot test iOS < 9.0 using Xcode 8 because
|
315
|
-
with iOS < 9.0 and UIAutomation is not available in Xcode 8.
|
314
|
+
Calabash cannot test iOS < 9.0 using Xcode 8 because DeviceAgent is not
|
315
|
+
compatible with iOS < 9.0 and UIAutomation is not available in Xcode 8.
|
316
316
|
|
317
317
|
You can rerun your test if you have Xcode 7 installed:
|
318
318
|
|