calabash-android 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
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