fastlane-plugin-automated_test_emulator_run 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2beefd49270a753e5f5c58913fb0d613d8674846
4
- data.tar.gz: 27d9e176b1f2304c23c410b761b9e3bc442ea629
3
+ metadata.gz: 2eb526613eca13ae8ef9235ae150146a2016d3a0
4
+ data.tar.gz: e22231a66a5fe51dbf336a5caf80be1685727cf9
5
5
  SHA512:
6
- metadata.gz: 80ed06b2e25dd8395e09612a6d5e4af7e9b357e5d6c237352caa665af9fc9c780e85a3b7dcb36fdd1b21be62e9a7781082bd2f21f685482ea3a4b1a504f60c7c
7
- data.tar.gz: 5e4d0f8e600d05dadcd96bbcec08339cbc8222fd36fb287cff949f36ee97017001726506ace3f0ff0090bc176f4b36e8de33421587b84ecaa5ec45d8da1ebd31
6
+ metadata.gz: 0a60cafaef152b7380478860eaad74c412cf2bc792d7c649c984d04c4772aa670bed0f500f7de85e86d0934802b6da2be002a1f4fc7fa50a62563594747dbd5f
7
+ data.tar.gz: eddb81d99cb8b79512d900e785adc3c6a0027dda1d88b593309879a2306aebae038afe46209ff4dcb3bff8994e416cbe338ba96498afec99004eca1169d6fb6f
@@ -16,9 +16,8 @@ module Fastlane
16
16
  avd_controllers = []
17
17
 
18
18
  # Create AVD_Controller class for each AVD_scheme
19
- for i in 0..(avd_schemes.length - 1)
20
- avd_scheme = avd_schemes[i]
21
- avd_controller = Factory::AvdControllerFactory.get_avd_controller(params, avd_scheme)
19
+ for i in 0...avd_schemes.length
20
+ avd_controller = Factory::AvdControllerFactory.get_avd_controller(params, avd_schemes[i])
22
21
  avd_controllers << avd_controller
23
22
  end
24
23
 
@@ -28,23 +27,31 @@ module Fastlane
28
27
 
29
28
  # Preparation
30
29
  UI.message("Configuring environment in order to launch emulators: ".yellow)
31
-
32
30
  UI.message("Getting avaliable AVDs".yellow)
33
31
  devices = Action.sh(adb_controller.command_get_avds)
34
32
 
35
- for i in 0..(avd_schemes.length - 1)
36
- avd_scheme = avd_schemes[i]
37
- avd_controller = avd_controllers[i]
38
-
39
- # Delete existing AVDs
40
- if !devices.match(avd_scheme.avd_name).nil?
41
- UI.message(["Deleting existing AVD with name:", avd_scheme.avd_name].join(" ").yellow)
42
- Action.sh(avd_controller.command_delete_avd)
33
+ for i in 0...avd_schemes.length
34
+ unless devices.match(avd_schemes[i].avd_name).nil?
35
+ UI.message(["AVD with name '", avd_schemes[i].avd_name, " 'currently exists."].join("").yellow)
36
+ if params[:AVD_recreate_new]
37
+ # Delete existing AVDs
38
+ UI.message("AVD_create_new parameter set to true.".yellow)
39
+ UI.message(["Deleting existing AVD with name:", avd_schemes[i].avd_name].join(" ").yellow)
40
+ Action.sh(avd_controllers[i].command_delete_avd)
41
+
42
+ # Re-create AVD
43
+ UI.message(["Re-creating new AVD."].join(" ").yellow)
44
+ Action.sh(avd_controllers[i].command_create_avd)
45
+ else
46
+ # Use existing AVD
47
+ UI.message("AVD_recreate_new parameter set to false.".yellow)
48
+ UI.message("Using existing AVD for tests.".yellow)
49
+ end
50
+ else
51
+ # Create AVD
52
+ UI.message(["AVD with name '", avd_schemes[i].avd_name, "' does not exist. Creating new AVD."].join("").yellow)
53
+ Action.sh(avd_controllers[i].command_create_avd)
43
54
  end
44
-
45
- # Re-create deleted AVDs
46
- UI.message("Creating new AVD".yellow)
47
- Action.sh(avd_controller.command_create_avd)
48
55
  end
49
56
 
50
57
  # Restart ADB
@@ -53,46 +60,43 @@ module Fastlane
53
60
  Action.sh(adb_controller.command_start)
54
61
 
55
62
  # Applying custom configs (it's not done directly after create because 'cat' operation seems to fail overwrite)
56
- for i in 0..(avd_schemes.length - 1)
57
- avd_scheme = avd_schemes[i]
58
- avd_controller = avd_controllers[i]
59
-
60
- UI.message(["Attemting to apply custom config to ", avd_scheme.avd_name].join("").yellow)
61
- if avd_controller.command_apply_config_avd.eql? ""
62
- UI.message(["No config file found for AVD '", avd_scheme.avd_name, "'. AVD won't have config.ini applied."].join("").yellow)
63
+ for i in 0...avd_schemes.length
64
+ UI.message(["Attemting to apply custom config to ", avd_schemes[i].avd_name].join("").yellow)
65
+ if avd_controllers[i].command_apply_config_avd.eql? ""
66
+ UI.message(["No config file found for AVD '", avd_schemes[i].avd_name, "'. AVD won't have config.ini applied."].join("").yellow)
63
67
  else
64
- UI.message(["Config file found! Applying custom config to: ", avd_scheme.avd_name].join("").yellow)
65
- Action.sh(avd_controller.command_apply_config_avd)
68
+ UI.message(["Config file found! Applying custom config to: ", avd_schemes[i].avd_name].join("").yellow)
69
+ Action.sh(avd_controllers[i].command_apply_config_avd)
66
70
  end
67
71
  end
68
72
 
69
73
  # Launching AVDs
70
- UI.message("Launching all AVDs at the same time".yellow)
71
- for i in 0..(avd_schemes.length - 1)
72
- avd_scheme = avd_schemes[i]
73
- avd_controller = avd_controllers[i]
74
-
75
- Action.sh(avd_controller.command_start_avd)
74
+ UI.message("Launching all AVDs at the same time.".yellow)
75
+ for i in 0...avd_controllers.length
76
+ Action.sh(avd_controllers[i].command_start_avd)
76
77
  end
77
78
 
78
79
  # Wait for AVDs finish booting
79
- UI.message("Waiting for AVDs to finish booting".yellow)
80
+ UI.message("Waiting for AVDs to finish booting.".yellow)
80
81
  boot_status = []
81
- for i in 0..(avd_schemes.length - 1)
82
+ for i in 0...avd_schemes.length
82
83
  boot_status << false
83
84
  end
84
85
 
85
- UI.message("Performing wait for params: dev.bootcomplete, sys.boot_completed, init.svc.bootanim".yellow)
86
- for i in 0..(avd_schemes.length - 1)
87
- avd_controller = avd_controllers[i]
88
- timeout = "#{params[:AVD_launch_timeout]}"
89
- status = wait_for_emulator_boot(adb_controller, avd_controller, timeout)
90
-
91
- if (!status)
92
- all_avd_launched = false
93
- break
86
+ UI.message("Performig wait for ADB boot".yellow)
87
+ all_avd_launched = wait_for_emulator_boot_by_adb(adb_controller, avd_schemes, "#{params[:AVD_adb_launch_timeout]}")
88
+
89
+ if all_avd_launched
90
+ UI.message("Wait for ADB boot completed with success".yellow)
91
+ UI.message("Performing wait for params: dev.bootcomplete, sys.boot_completed, init.svc.bootanim.".yellow)
92
+ for i in 0...avd_schemes.length
93
+ all_avd_launched = wait_for_emulator_boot_by_params(adb_controller, avd_controllers[i], "#{params[:AVD_param_launch_timeout]}")
94
+ unless all_avd_launched
95
+ break
96
+ end
94
97
  end
95
- all_avd_launched = true
98
+ else
99
+ UI.message("Wait for ADB boot failed".yellow)
96
100
  end
97
101
 
98
102
  # Deciding if AVD launch should be restarted
@@ -100,17 +104,12 @@ module Fastlane
100
104
  if all_avd_launched
101
105
  UI.message("AVDs Booted!".green)
102
106
  else
103
- for i in 0..(avd_schemes.length - 1)
104
- avd_scheme = avd_schemes[i]
105
- avd_controller = avd_controllers[i]
106
-
107
- # Kill all emulators
108
- if !devices.match(["emulator-", avd_scheme.launch_avd_port].join("")).nil?
109
- Action.sh(avd_controller.command_kill_device)
107
+ for i in 0...avd_schemes.length
108
+ unless devices.match(["emulator-", avd_schemes[i].launch_avd_port].join("")).nil?
109
+ Action.sh(avd_controllers[i].command_kill_device)
110
110
  end
111
111
  end
112
112
  end
113
-
114
113
  end
115
114
 
116
115
  # Launching tests
@@ -122,33 +121,85 @@ module Fastlane
122
121
  UI.message("Starting tests".green)
123
122
  begin
124
123
  unless shell_task.nil?
125
- UI.message("Using shell task".green)
124
+ UI.message("Using shell task.".green)
126
125
  Action.sh(shell_task)
127
126
  end
128
127
 
129
128
  unless gradle_task.nil?
130
- UI.message("Using gradle task".green)
129
+ UI.message("Using gradle task.".green)
131
130
  gradle.trigger(task: params[:gradle_task], flags: params[:gradle_flags], serial: nil)
132
131
  end
133
132
  ensure
134
133
  # Clean up
135
- for i in 0..(avd_schemes.length - 1)
136
- avd_scheme = avd_schemes[i]
137
- avd_controller = avd_controllers[i]
138
-
134
+ for i in 0...avd_schemes.length
139
135
  # Kill all emulators
140
- if !devices.match(["emulator-", avd_scheme.launch_avd_port].join("")).nil?
141
- Action.sh(avd_controller.command_kill_device)
136
+ unless devices.match(["emulator-", avd_schemes[i].launch_avd_port].join("")).nil?
137
+ Action.sh(avd_controllers[i].command_kill_device)
142
138
  end
143
139
 
144
140
  # Delete AVDs
145
- Action.sh(avd_controller.command_delete_avd)
141
+ if params[:AVD_clean_after]
142
+ UI.message("AVD_clean_after param set to true. Deleting AVDs.".green)
143
+ Action.sh(avd_controllers[i].command_delete_avd)
144
+ else
145
+ UI.message("AVD_clean_after param set to false. Created AVDs won't be deleted.".green)
146
+ end
146
147
  end
147
148
  end
149
+ end
150
+
151
+ def self.wait_for_emulator_boot_by_adb(adb_controller, avd_schemes, timeout)
152
+ timeoutInSeconds= timeout.to_i
153
+ startTime = Time.now
154
+
155
+ launch_status_hash = Hash.new
156
+ device_visibility_hash = Hash.new
157
+
158
+ for i in 0...avd_schemes.length
159
+ device_name = ["emulator-", avd_schemes[i].launch_avd_port].join("")
160
+ launch_status_hash.store(device_name, false)
161
+ device_visibility_hash.store(device_name, false)
162
+ end
163
+
164
+ launch_status = false
165
+ loop do
166
+ currentTime = Time.now
167
+ devices = Action.sh(adb_controller.command_get_devices)
148
168
 
169
+ # Check if device is visible
170
+ all_devices_visible = true
171
+ device_visibility_hash.each do |name, is_visible|
172
+ unless (devices.match(name).nil? || is_visible)
173
+ device_visibility_hash[name] = true
174
+ end
175
+ all_devices_visible = false unless is_visible
176
+ end
177
+
178
+ # Check if device is booted
179
+ all_devices_booted = true
180
+ launch_status_hash.each do |name, is_booted|
181
+ unless (devices.match(name + " device").nil? || is_booted)
182
+ launch_status_hash[name] = true
183
+ end
184
+ all_devices_booted = false unless is_booted
185
+ end
186
+
187
+ if ((currentTime - startTime) >= timeoutInSeconds)
188
+ UI.message(["AVD ADB loading took more than ", timeout, ". Attempting to re-launch."].join("").red)
189
+ launch_status = false
190
+ break
191
+ end
192
+
193
+ if (all_devices_booted && all_devices_visible)
194
+ launch_status = true
195
+ break
196
+ end
197
+ sleep(10)
198
+ end
199
+ return launch_status
149
200
  end
150
201
 
151
- def self.wait_for_emulator_boot(adb_controller, avd_controller, timeout)
202
+ def self.wait_for_emulator_boot_by_params(adb_controller, avd_controller, timeout)
152
203
  timeoutInSeconds= timeout.to_i
153
204
  startTime = Time.now
154
205
 
@@ -160,7 +211,7 @@ module Fastlane
160
211
  currentTime = Time.now
161
212
 
162
213
  if (currentTime - startTime) >= timeoutInSeconds
163
- UI.message("AVD loading took more than 10 minutes. Restarting launch".red)
214
+ UI.message(["AVD param loading took more than ", timeout, ". Attempting to re-launch."].join("").red)
164
215
  launch_status = false
165
216
  break
166
217
  end
@@ -177,49 +228,67 @@ module Fastlane
177
228
  [
178
229
  #paths
179
230
  FastlaneCore::ConfigItem.new(key: :AVD_path,
180
- env_name: "AVD_PATH",
181
- description: "The path to your android AVD directory (root). HOME/.android/avd by default",
182
- is_string: true,
183
- default_value: ENV['HOME'] + '/.android/avd',
184
- optional: true),
231
+ env_name: "AVD_PATH",
232
+ description: "The path to your android AVD directory (root). HOME/.android/avd by default",
233
+ is_string: true,
234
+ default_value: ENV['HOME'] + '/.android/avd',
235
+ optional: true),
185
236
  FastlaneCore::ConfigItem.new(key: :AVD_setup_path,
186
- env_name: "AVD_SETUP_PATH",
187
- description: "Location to AVD_setup.json file which contains info about how many AVD should be launched and their configs",
188
- is_string: true,
189
- optional: false),
237
+ env_name: "AVD_SETUP_PATH",
238
+ description: "Location to AVD_setup.json file which contains info about how many AVD should be launched and their configs",
239
+ is_string: true,
240
+ optional: false),
190
241
  FastlaneCore::ConfigItem.new(key: :SDK_path,
191
- env_name: "SDK_PATH",
192
- description: "The path to your android sdk directory (root). ANDROID_HOME by default",
193
- is_string: true,
194
- default_value: ENV['ANDROID_HOME'],
195
- optional: true),
196
- FastlaneCore::ConfigItem.new(key: :AVD_launch_timeout,
197
- env_name: "AVD_LAUNCH_TIMEOUT",
198
- description: "Timeout in seconds - after what time should plugin attempt to re-launch AVD setup. Default 600 seconds",
199
- is_string: true,
200
- default_value: 600,
201
- optional: true),
202
-
203
-
242
+ env_name: "SDK_PATH",
243
+ description: "The path to your android sdk directory (root). ANDROID_HOME by default",
244
+ is_string: true,
245
+ default_value: ENV['ANDROID_HOME'],
246
+ optional: true),
247
+
248
+
249
+ #emulator re-launch config params
250
+ FastlaneCore::ConfigItem.new(key: :AVD_param_launch_timeout,
251
+ env_name: "AVD_PARAM_LAUNCH_TIMEOUT",
252
+ description: "Timeout in seconds. Even though ADB might find all devices you still might want to wait for animations to finish and system to boot. Default 60 seconds",
253
+ is_string: true,
254
+ default_value: 60,
255
+ optional: true),
256
+ FastlaneCore::ConfigItem.new(key: :AVD_adb_launch_timeout,
257
+ env_name: "AVD_ADB_LAUNCH_TIMEOUT",
258
+ description: "Timeout in seconds. Wait until ADB finds all devices specified in config and sets their value to 'device'. Default 240 seconds",
259
+ is_string: true,
260
+ default_value: 240,
261
+ optional: true),
262
+ FastlaneCore::ConfigItem.new(key: :AVD_recreate_new,
263
+ env_name: "AVD_RECREATE_NEW",
264
+ description: "Allow to decide if AVDs from AVD_setup.json (in case they already exist) should be deleted and created from scratch",
265
+ default_value: true,
266
+ optional: true),
267
+ FastlaneCore::ConfigItem.new(key: :AVD_clean_after,
268
+ env_name: "AVD_CLEAN_AFTER",
269
+ description: "Allow to decide if AVDs should be deleted from PC after test session ends",
270
+ default_value: true,
271
+ optional: true),
272
+
204
273
  #launch commands
205
274
  FastlaneCore::ConfigItem.new(key: :shell_task,
206
- env_name: "SHELL_TASK",
207
- description: "The shell command you want to execute",
208
- is_string: true,
209
- conflicting_options: [:gradle_task],
210
- optional: true),
275
+ env_name: "SHELL_TASK",
276
+ description: "The shell command you want to execute",
277
+ is_string: true,
278
+ conflicting_options: [:gradle_task],
279
+ optional: true),
211
280
  FastlaneCore::ConfigItem.new(key: :gradle_task,
212
- env_name: "GRADLE_TASK",
213
- description: "The gradle task you want to execute",
214
- is_string: true,
215
- conflicting_options: [:shell_command],
216
- optional: true),
281
+ env_name: "GRADLE_TASK",
282
+ description: "The gradle task you want to execute",
283
+ is_string: true,
284
+ conflicting_options: [:shell_command],
285
+ optional: true),
217
286
  FastlaneCore::ConfigItem.new(key: :gradle_flags,
218
- env_name: "GRADLE_FLAGS",
219
- description: "All parameter flags you want to pass to the gradle command, e.g. `--exitcode --xml file.xml`",
220
- optional: true,
221
- conflicting_options: [:shell_command],
222
- is_string: true),
287
+ env_name: "GRADLE_FLAGS",
288
+ description: "All parameter flags you want to pass to the gradle command, e.g. `--exitcode --xml file.xml`",
289
+ optional: true,
290
+ conflicting_options: [:shell_command],
291
+ is_string: true),
223
292
  ]
224
293
  end
225
294
 
@@ -18,7 +18,7 @@ module Fastlane
18
18
  # ADB shell command parts
19
19
  sh_stop_adb = "kill-server"
20
20
  sh_start_adb = "start-server"
21
- sh_devices_adb = "devices"
21
+ sh_devices_adb = "devices | grep [0-9] | tr -s \"\t\" \" | cut -d\""
22
22
  sh_wait_for_device_adb = "wait-for-device"
23
23
  sh_list_avd_adb = "list avd"
24
24
 
@@ -22,7 +22,7 @@ module Fastlane
22
22
 
23
23
  # Create AVD_scheme objects and fill them with data
24
24
  avd_scheme_list = []
25
- for i in 0..(avd_hash_list.length - 1)
25
+ for i in 0...avd_hash_list.length
26
26
  avd_hash = avd_hash_list[i]
27
27
 
28
28
  avd_scheme = AVD_scheme.new
@@ -50,7 +50,7 @@ module Fastlane
50
50
  avaliable_ports = get_unused_even_tcp_ports(5556, 5586, avd_scheme_list)
51
51
 
52
52
  # Fill empty AVD_schemes with open ports
53
- for i in 0..(avd_scheme_list.length - 1)
53
+ for i in 0...avd_scheme_list.length
54
54
  avd_scheme = avd_scheme_list[i]
55
55
  if avd_scheme.launch_avd_port.eql? ""
56
56
  avd_scheme.launch_avd_port = avaliable_ports[0]
@@ -74,7 +74,7 @@ module Fastlane
74
74
  reserved_ports = []
75
75
 
76
76
  # Gather ports requested in JSON config
77
- for i in 0..(avd_scheme_list.length - 1)
77
+ for i in 0...avd_scheme_list.length
78
78
  avd_scheme = avd_scheme_list[i]
79
79
  unless avd_scheme.launch_avd_port.eql? ""
80
80
  reserved_ports << avd_scheme.launch_avd_port
@@ -83,13 +83,13 @@ module Fastlane
83
83
 
84
84
  # Find next open port which wasn't reserved in JSON config
85
85
  port = min_port
86
- for i in 0..(avd_scheme_list.length - 1)
86
+ for i in 0...avd_scheme_list.length
87
87
 
88
88
  while port < max_port do
89
89
  if !system("lsof -i:#{port}", out: '/dev/null')
90
90
 
91
91
  is_port_reserved = false
92
- for j in 0..(reserved_ports.length - 1)
92
+ for j in 0...reserved_ports.length
93
93
  if reserved_ports[j].eql?(port.to_s)
94
94
  is_port_reserved = true
95
95
  break
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module AutomatedTestEmulatorRun
3
- VERSION = "1.1.0"
3
+ VERSION = "1.2.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-automated_test_emulator_run
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kamil Krzyk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-25 00:00:00.000000000 Z
11
+ date: 2016-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry