calabash-android 0.3.5 → 0.3.6

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.
data/CHANGES.txt CHANGED
@@ -1,3 +1,14 @@
1
+ 0.3.6:
2
+ Will fail if the keyguard cannot be disabled when starting the app.
3
+
4
+ If the app is not running calabash will now die instead of running around
5
+ like a serverless chicking.
6
+
7
+ On-device screenshots are still unstable but will no longer crash the app
8
+ if they fail.
9
+
10
+ Much better Cucumber output if the app is no longer running.
11
+
1
12
  0.3.5:
2
13
  No longer takes screenshots when perform_action fails.
3
14
  If you want to take screenshots when a scenario fails you can use a hook:
@@ -10,11 +10,19 @@ def calabash_console(app_path = nil)
10
10
  end
11
11
 
12
12
  unless ENV["PACKAGE_NAME"]
13
- ENV["PACKAGE_NAME"] = package_name(app_path)
13
+ ENV["PACKAGE_NAME"] = package_name(app_path)
14
14
  end
15
15
 
16
16
  unless ENV["MAIN_ACTIVITY"]
17
- ENV["MAIN_ACTIVITY"] = main_activity(app_path)
17
+ ENV["MAIN_ACTIVITY"] = main_activity(app_path)
18
+ end
19
+
20
+ unless ENV["APP_PATH"]
21
+ ENV["APP_PATH"] = app_path
22
+ end
23
+
24
+ unless ENV["TEST_APP_PATH"]
25
+ ENV["TEST_APP_PATH"] = test_server_path
18
26
  end
19
27
 
20
28
  system "irb"
@@ -2,10 +2,6 @@ require 'calabash-android/management/adb'
2
2
  require 'calabash-android/operations'
3
3
  include Calabash::Android::Operations
4
4
 
5
- AfterConfiguration do |config|
6
- wake_up unless config.dry_run?
7
- end
8
-
9
5
  Before do |scenario|
10
6
  start_test_server_in_background
11
7
  end
data/irbrc CHANGED
@@ -18,3 +18,18 @@ include Calabash::Android::Operations
18
18
  def embed(*args)
19
19
  puts "Embed is a Cucumber method and is not available in this console."
20
20
  end
21
+
22
+
23
+
24
+ #Virker det her?
25
+ module Calabash
26
+ module Android
27
+ module Operations
28
+ class Cucumber
29
+ def self.wants_to_quit
30
+ false
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -151,13 +151,13 @@ module Operations
151
151
  cmd = "#{adb_command} install \"#{app_path}\""
152
152
  log "Installing: #{app_path}"
153
153
  result = `#{cmd}`
154
- if result.include? "Success"
155
- log "Success"
156
- else
157
- log "#Failure"
158
- log "'#{cmd}' said:"
159
- log result.strip
160
- raise "Could not install app #{app_path}: #{result.strip}"
154
+ log result
155
+ pn = package_name(app_path)
156
+ succeeded = `#{adb_command} shell pm list packages`.include?("package:#{pn}")
157
+
158
+ unless succeeded
159
+ Cucumber.wants_to_quit = true
160
+ raise "#{pn} did not get installed. Aborting!"
161
161
  end
162
162
  end
163
163
 
@@ -166,6 +166,16 @@ module Operations
166
166
  log `#{adb_command} uninstall #{package_name}`
167
167
  end
168
168
 
169
+ def app_running?
170
+ `#{adb_command} shell ps`.include?(package_name(@app_path))
171
+ end
172
+
173
+ def keyguard_enabled?
174
+ dumpsys = `#{adb_command} shell dumpsys window windows`
175
+ #If a line containing mCurrentFocus and Keyguard exists the keyguard is enabled
176
+ dumpsys.lines.any? { |l| l.include?("mCurrentFocus") and l.include?("Keyguard")}
177
+ end
178
+
169
179
  def perform_action(action, *arguments)
170
180
  log "Action: #{action} - Params: #{arguments.join(', ')}"
171
181
 
@@ -173,7 +183,7 @@ module Operations
173
183
 
174
184
  Timeout.timeout(300) do
175
185
  begin
176
- result = http("/", params)
186
+ result = http("/", params, {:read_timeout => 350})
177
187
  rescue Exception => e
178
188
  log "Error communicating with test server: #{e}"
179
189
  raise e
@@ -190,17 +200,19 @@ module Operations
190
200
  raise Exception, "Step timed out"
191
201
  end
192
202
 
193
- def http(path, data = {})
194
- retries = 0
203
+ def http(path, data = {}, options = {})
195
204
  begin
196
205
  http = Net::HTTP.new "127.0.0.1", @server_port
206
+ http.open_timeout = options[:open_timeout] if options[:open_timeout]
207
+ http.read_timeout = options[:read_timeout] if options[:read_timeout]
197
208
  resp = http.post(path, "#{data.to_json}", {"Content-Type" => "application/json;charset=utf-8"})
198
209
  resp.body
199
210
  rescue Exception => e
200
- raise e if retries > 20
201
- sleep 0.5
202
- retries += 1
203
- retry
211
+ if app_running?
212
+ raise e
213
+ else
214
+ raise "App no longer running"
215
+ end
204
216
  end
205
217
  end
206
218
 
@@ -280,19 +292,32 @@ module Operations
280
292
  log "Waking up device using:"
281
293
  log wake_up_cmd
282
294
  raise "Could not wake up the device" unless system(wake_up_cmd)
295
+
296
+ retriable :tries => 10, :interval => 1 do
297
+ raise "Could not remove the keyguard" if keyguard_enabled?
298
+ end
283
299
  end
284
300
 
285
301
  def start_test_server_in_background
302
+ raise "Will not start test server because of previous failures." if Cucumber.wants_to_quit
303
+
304
+ if keyguard_enabled?
305
+ wake_up
306
+ end
307
+
286
308
  cmd = "#{adb_command} shell am instrument -e target_package #{ENV["PACKAGE_NAME"]} -e main_activity #{ENV["MAIN_ACTIVITY"]} -e class sh.calaba.instrumentationbackend.InstrumentationBackend sh.calaba.android.test/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner"
287
309
  log "Starting test server using:"
288
310
  log cmd
289
311
  raise "Could not execute command to start test server" unless system("#{cmd} 2>&1")
290
312
 
313
+ raise "App did not start" unless app_running?
314
+
291
315
  begin
292
316
  retriable :tries => 10, :interval => 3 do
293
317
  log "Checking if instrumentation backend is ready"
294
- ready = http("/ready")
295
318
 
319
+ log "Is app running? #{app_running?}"
320
+ ready = http("/ready", {}, {:read_timeout => 1})
296
321
  if ready != "true"
297
322
  log "Instrumentation backend not yet ready"
298
323
  raise "Not ready"
@@ -1,5 +1,5 @@
1
1
  module Calabash
2
2
  module Android
3
- VERSION = "0.3.5"
3
+ VERSION = "0.3.6"
4
4
  end
5
5
  end
@@ -8,4 +8,4 @@
8
8
  # project structure.
9
9
 
10
10
  # Project target.
11
- target=Google Inc.:Google APIs:16
11
+ target=Google Inc.:Google APIs:15
@@ -44,6 +44,7 @@ public class InstrumentationBackend extends ActivityInstrumentationTestCase2 {
44
44
  httpServer.setReady();
45
45
  httpServer.waitUntilShutdown();
46
46
  solo.finishOpenedActivities();
47
+ System.exit(0);
47
48
  }
48
49
 
49
50
  @Override
@@ -1,14 +1,16 @@
1
1
  package sh.calaba.instrumentationbackend.actions;
2
2
 
3
- import java.io.ByteArrayInputStream;
4
- import java.io.ByteArrayOutputStream;
5
- import java.io.File;
3
+ import java.io.*;
6
4
  import java.util.Properties;
7
5
  import java.util.List;
8
6
  import java.util.concurrent.locks.Condition;
9
7
  import java.util.concurrent.locks.Lock;
10
8
  import java.util.concurrent.locks.ReentrantLock;
11
9
 
10
+ import android.Manifest;
11
+ import android.app.Activity;
12
+ import android.app.ActivityManager;
13
+ import android.content.pm.PackageManager;
12
14
  import android.graphics.Bitmap;
13
15
  import android.view.View;
14
16
  import sh.calaba.instrumentationbackend.Command;
@@ -59,11 +61,11 @@ public class HttpServer extends NanoHTTPD {
59
61
  super(7102, new File("/"));
60
62
  }
61
63
 
62
- public Response serve( String uri, String method, Properties header, Properties params, Properties files )
63
- {
64
- System.out.println("URI: " + uri);
65
- if (uri.endsWith("/ping")) {
66
- return new NanoHTTPD.Response( HTTP_OK, MIME_HTML, "pong");
64
+ public Response serve( String uri, String method, Properties header, Properties params, Properties files )
65
+ {
66
+ System.out.println("URI: " + uri);
67
+ if (uri.endsWith("/ping")) {
68
+ return new NanoHTTPD.Response( HTTP_OK, MIME_HTML, "pong");
67
69
 
68
70
  } else if (uri.endsWith("/kill")) {
69
71
  lock.lock();
@@ -83,16 +85,23 @@ public class HttpServer extends NanoHTTPD {
83
85
 
84
86
 
85
87
  } else if (uri.endsWith("/screenshot")) {
86
- Bitmap bitmap;
87
- View rootView = getRootView();
88
- rootView.setDrawingCacheEnabled(true);
89
- rootView.buildDrawingCache(true);
90
- bitmap = Bitmap.createBitmap(rootView.getDrawingCache());
91
- rootView.setDrawingCacheEnabled(false);
92
-
93
- ByteArrayOutputStream out = new ByteArrayOutputStream();
94
- bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
95
- return new NanoHTTPD.Response( HTTP_OK, "image/png", new ByteArrayInputStream(out.toByteArray()));
88
+ try {
89
+ Bitmap bitmap;
90
+ View rootView = getRootView();
91
+ rootView.setDrawingCacheEnabled(true);
92
+ rootView.buildDrawingCache(true);
93
+ bitmap = Bitmap.createBitmap(rootView.getDrawingCache());
94
+ rootView.setDrawingCacheEnabled(false);
95
+
96
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
97
+ bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
98
+ return new NanoHTTPD.Response( HTTP_OK, "image/png", new ByteArrayInputStream(out.toByteArray()));
99
+ } catch (Exception e) {
100
+ StringWriter sw = new StringWriter();
101
+ PrintWriter pw = new PrintWriter(sw);
102
+ e.printStackTrace(pw);
103
+ return new NanoHTTPD.Response( HTTP_INTERNALERROR, null, sw.toString());
104
+ }
96
105
  }
97
106
 
98
107
  System.out.println("header: "+ header);
@@ -111,9 +120,12 @@ public class HttpServer extends NanoHTTPD {
111
120
  private View getRootView() {
112
121
  for ( int i = 0; i < 25; i++) {
113
122
  try {
114
- View rootView = InstrumentationBackend.solo.getCurrentActivity().getWindow().getDecorView();
115
- if (rootView != null) {
116
- return rootView;
123
+ View decorView = InstrumentationBackend.solo.getCurrentActivity().getWindow().getDecorView();
124
+ if (decorView != null) {
125
+ View rootView = decorView.findViewById(android.R.id.content);
126
+ if (rootView != null) {
127
+ return rootView;
128
+ }
117
129
  }
118
130
  System.out.println("Retry: " + i);
119
131
 
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.3.5
4
+ version: 0.3.6
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-11-26 00:00:00.000000000 Z
12
+ date: 2012-11-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: cucumber