calabash-android 0.2.17 → 0.2.18

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.
@@ -1,3 +1,8 @@
1
+ 0.2.18:
2
+ Various small improvements and bug fixes.
3
+
4
+ Screenshots are now embedded into the test report using Cucumbers embed method.
5
+
1
6
  0.2.17:
2
7
  Added calabash-android extract-manifest that will print the manifest of any apk file.
3
8
 
@@ -19,11 +19,16 @@ def calabash_run(app_path = nil)
19
19
  end
20
20
 
21
21
  test_server_path = test_server_path(app_path)
22
+ if ENV["TEST_SERVER_PORT"]
23
+ test_server_port = ENV["TEST_SERVER_PORT"]
24
+ else
25
+ test_server_port = "34777"
26
+ end
22
27
  env = "PACKAGE_NAME=#{package_name(app_path)} "\
23
28
  "TEST_PACKAGE_NAME=#{package_name(test_server_path)} "\
24
29
  "APP_PATH=\"#{app_path}\" "\
25
30
  "TEST_APP_PATH=\"#{test_server_path}\" "\
26
- "TEST_SERVER_PORT=34777"
31
+ "TEST_SERVER_PORT=#{test_server_port}"
27
32
  else
28
33
  env = ""
29
34
  end
@@ -1,34 +0,0 @@
1
-
2
- Before do |scenario|
3
- # https://groups.google.com/forum/?fromgroups#!topic/calabash-ios/ICA4f24eSsY
4
- @scenario_is_outline = (scenario.class == Cucumber::Ast::OutlineTable::ExampleRow)
5
- if @scenario_is_outline
6
- scenario = scenario.scenario_outline
7
- end
8
-
9
- StepCounter.step_index = 0
10
- # https://github.com/calabash/calabash-android/issues/58#issuecomment-6745642
11
- if scenario.respond_to? :raw_steps
12
- StepCounter.step_line = scenario.raw_steps[StepCounter.step_index].line
13
- else
14
- StepCounter.step_line = 0
15
- end
16
- end
17
-
18
- AfterStep do |scenario|
19
- #Handle multiline steps
20
- StepCounter.step_index = StepCounter.step_index + 1
21
- # https://github.com/calabash/calabash-android/issues/58#issuecomment-6745642
22
- if scenario.respond_to? :raw_steps
23
- StepCounter.step_line = scenario.raw_steps[StepCounter.step_index].line unless scenario.raw_steps[StepCounter.step_index].nil?
24
- else
25
- StepCounter.step_line = StepCounter.step_line + 1
26
- end
27
- end
28
-
29
- StepCounter = Class.new
30
- class << StepCounter
31
- @step_index = 0
32
- @step_line = 0
33
- attr_accessor :step_index, :step_line
34
- end
@@ -19,7 +19,7 @@ module Operations
19
19
  end
20
20
 
21
21
  def take_screenshot
22
- Device.default_device.take_screenshot
22
+ default_device.take_screenshot
23
23
  end
24
24
 
25
25
  def macro(txt)
@@ -29,28 +29,38 @@ module Operations
29
29
  Then(txt)
30
30
  end
31
31
  end
32
+ def default_device
33
+ Device.default_device(self)
34
+ end
32
35
 
33
36
  def shutdown_test_server
34
- Device.default_device.shutdown_test_server
37
+ default_device.shutdown_test_server
35
38
  end
36
39
 
37
40
  def performAction(action, *arguments)
38
- Device.default_device.perform_action(action, *arguments)
41
+ default_device.perform_action(action, *arguments)
39
42
  end
40
43
 
41
44
  def install_app(app_path)
42
- Device.default_device.install_app(app_path)
45
+ default_device.install_app(app_path)
43
46
  end
44
47
 
45
48
  def uninstall_apps
46
- Device.default_device.uninstall_app(ENV["TEST_PACKAGE_NAME"])
47
- Device.default_device.uninstall_app(ENV["PACKAGE_NAME"])
49
+ default_device.uninstall_app(ENV["TEST_PACKAGE_NAME"])
50
+ default_device.uninstall_app(ENV["PACKAGE_NAME"])
48
51
  end
49
52
 
50
53
  def start_test_server_in_background
51
- Device.default_device.start_test_server_in_background()
54
+ default_device.start_test_server_in_background()
52
55
  end
53
56
 
57
+ def screenshot_embed(options={:prefix => nil, :name => nil, :label => nil})
58
+ default_device.screenshot_embed(options)
59
+ end
60
+
61
+ def screenshot(options={:prefix => nil, :name => nil})
62
+ default_device.screenshot(options)
63
+ end
54
64
 
55
65
  def wait_for(timeout, &block)
56
66
  begin
@@ -99,9 +109,9 @@ module Operations
99
109
  class Device
100
110
  @@default_device = nil
101
111
 
102
- def self.default_device
112
+ def self.default_device(cucumber_world)
103
113
  unless @@default_device
104
- @@default_device = Device.new(ENV["ADB_DEVICE_ARG"], ENV["TEST_SERVER_PORT"], ENV["APP_PATH"], ENV["TEST_APP_PATH"])
114
+ @@default_device = Device.new(cucumber_world, ENV["ADB_DEVICE_ARG"], ENV["TEST_SERVER_PORT"], ENV["APP_PATH"], ENV["TEST_APP_PATH"])
105
115
  end
106
116
  @@default_device
107
117
  end
@@ -110,7 +120,8 @@ module Operations
110
120
  @@default_device = self
111
121
  end
112
122
 
113
- def initialize(serial, server_port, app_path, test_server_path)
123
+ def initialize(cucumber_world, serial, server_port, app_path, test_server_path)
124
+ @cucumber_world = cucumber_world
114
125
  @serial = serial
115
126
  @server_port = server_port
116
127
  @app_path = app_path
@@ -166,7 +177,7 @@ module Operations
166
177
  raise "Empty result from TestServer" if result.chomp.empty?
167
178
  result = JSON.parse(result)
168
179
  if not result["success"] then
169
- take_screenshot
180
+ screenshot_embed
170
181
  if result["bonusInformation"] && result["bonusInformation"].size > 0 && result["bonusInformation"][0].include?("Exception")
171
182
  log result["bonusInformation"][0]
172
183
  end
@@ -193,6 +204,7 @@ module Operations
193
204
  end
194
205
 
195
206
  def take_screenshot
207
+ puts "take_screenshot is deprecated. Use screenshot_embed instead."
196
208
  path = ENV["SCREENSHOT_PATH_PREFIX"] || "results"
197
209
  FileUtils.mkdir_p path unless File.exist? path
198
210
  filename_prefix = FeatureNameMemory.feature_name.gsub(/\s+/, '_').downcase
@@ -203,13 +215,41 @@ module Operations
203
215
  open(file_name ,"wb") { |file|
204
216
  file.write(image)
205
217
  }
206
- log "Screenshot stored in: #{file_name}"
218
+ log "Screenshot stored in: #{file_name}!!!"
207
219
  end
208
220
  rescue Timeout::Error
209
221
  raise Exception, "take_screenshot timed out"
210
222
  end
211
223
  end
212
224
 
225
+ def screenshot_embed(options={:prefix => nil, :name => nil, :label => nil})
226
+ path = screenshot(options)
227
+ @cucumber_world.embed(path, "image/png", options[:label] || File.basename(path))
228
+ end
229
+
230
+ def screenshot(options={:prefix => nil, :name => nil})
231
+ prefix = options[:prefix] || ENV['SCREENSHOT_PATH'] || ""
232
+ name = options[:name]
233
+
234
+ if name.nil?
235
+ name = "screenshot"
236
+ else
237
+ if File.extname(name).downcase == ".png"
238
+ name = name.split(".png")[0]
239
+ end
240
+ end
241
+
242
+ @@screenshot_count ||= 0
243
+ res = http("/screenshot")
244
+
245
+ path = "#{prefix}#{name}_#{@@screenshot_count}.png"
246
+ File.open(path, 'wb') do |f|
247
+ f.write res
248
+ end
249
+ @@screenshot_count += 1
250
+ path
251
+ end
252
+
213
253
  def adb_command
214
254
  if is_windows?
215
255
  %Q("#{ENV["ANDROID_HOME"]}\\platform-tools\\adb.exe" #{device_args})
@@ -283,7 +323,7 @@ module Operations
283
323
  end
284
324
 
285
325
  def screenshot_and_raise(msg)
286
- take_screenshot
326
+ screenshot_embed
287
327
  sleep 5
288
328
  raise(msg)
289
329
  end
@@ -394,10 +434,6 @@ module Operations
394
434
  def backdoor(sel, arg)
395
435
  ni
396
436
  end
397
-
398
- def screenshot
399
- ni
400
- end
401
437
 
402
438
  def map( query, method_name, *method_args )
403
439
  ni
@@ -1,11 +1,11 @@
1
1
  Then /^take picture$/ do
2
- take_screenshot
2
+ screenshot_embed
3
3
  end
4
4
 
5
5
  Then /^I take a picture$/ do
6
- take_screenshot
6
+ screenshot_embed
7
7
  end
8
8
 
9
9
  Then /^I take a screenshot$/ do
10
- take_screenshot
10
+ screenshot_embed
11
11
  end
@@ -1,5 +1,5 @@
1
1
  module Calabash
2
2
  module Android
3
- VERSION = "0.2.17"
3
+ VERSION = "0.2.18"
4
4
  end
5
5
  end
@@ -46,18 +46,7 @@
46
46
  <path id="android.target.classpath">
47
47
  <fileset dir="${env.ANDROID_HOME}/platforms/android-${android.api.level}/" includes="*.jar"/>
48
48
  </path>
49
-
50
- <target name="test" description="Run test features" depends="package">
51
- <exec executable="cucumber${bat}">
52
- <env key="PACKAGE_NAME" value="${tested.package_name}" />
53
- <env key="TEST_PACKAGE_NAME" value="${tested.package_name}.test" />
54
- <env key="APP_PATH" value="${tested.project.apk}" />
55
- <env key="TEST_APP_PATH" value="bin/Test.apk" />
56
- <env key="TEST_SERVER_PORT" value="34777" />
57
- <env key="ADB_DEVICE_ARG" value="${adb.device.arg}" />
58
- <arg value="features" />
59
- </exec>
60
- </target>
49
+
61
50
  <target name="-check.preconditions">
62
51
  <available file="${tested.project.apk}" property="tested.apk.found" />
63
52
  <fail unless="tested.apk.found" message="Tested apk: '${tested.project.apk}' could not be found"/>
@@ -4,6 +4,7 @@ import java.io.ByteArrayInputStream;
4
4
  import java.io.ByteArrayOutputStream;
5
5
  import java.io.File;
6
6
  import java.util.Properties;
7
+ import java.util.List;
7
8
  import java.util.concurrent.locks.Condition;
8
9
  import java.util.concurrent.locks.Lock;
9
10
  import java.util.concurrent.locks.ReentrantLock;
@@ -83,10 +84,10 @@ public class HttpServer extends NanoHTTPD {
83
84
 
84
85
  } else if (uri.endsWith("/screenshot")) {
85
86
  Bitmap bitmap;
86
- View v1 = InstrumentationBackend.solo.getViews().get(0).getRootView();
87
- v1.setDrawingCacheEnabled(true);
88
- bitmap = Bitmap.createBitmap(v1.getDrawingCache());
89
- v1.setDrawingCacheEnabled(false);
87
+ View rootView = getRootView();
88
+ rootView.setDrawingCacheEnabled(true);
89
+ bitmap = Bitmap.createBitmap(rootView.getDrawingCache());
90
+ rootView.setDrawingCacheEnabled(false);
90
91
 
91
92
  ByteArrayOutputStream out = new ByteArrayOutputStream();
92
93
  bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
@@ -106,6 +107,23 @@ public class HttpServer extends NanoHTTPD {
106
107
  return new NanoHTTPD.Response( HTTP_OK, MIME_HTML, result);
107
108
  }
108
109
 
110
+ private View getRootView() {
111
+ for ( int i = 0; i < 25; i++) {
112
+ try {
113
+ View rootView = InstrumentationBackend.solo.getCurrentActivity().getWindow().getDecorView();
114
+ if (rootView != null) {
115
+ return rootView;
116
+ }
117
+ System.out.println("Retry: " + i);
118
+
119
+ Thread.sleep(200);
120
+ } catch (Exception e) {
121
+ }
122
+ }
123
+
124
+ throw new RuntimeException("Could not find any views");
125
+ }
126
+
109
127
  private ObjectMapper createJsonMapper() {
110
128
  ObjectMapper mapper = new ObjectMapper();
111
129
  mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, true);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calabash-android
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.17
4
+ version: 0.2.18
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-06 00:00:00.000000000 Z
12
+ date: 2012-09-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cucumber