testautoa 0.4.0 → 0.4.1
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/Rakefile +7 -7
- data/bin/calabash-android +8 -1
- data/bin/calabash-android-build.rb +1 -1
- data/bin/calabash-android-console.rb +4 -4
- data/bin/calabash-android-run.rb +2 -10
- data/bin/testautoa +461 -0
- data/calabash-android.gemspec +3 -1
- data/features-skeleton/support/app_life_cycle_hooks.rb +0 -1
- data/irbrc +3 -1
- data/lib/calabash-android/helpers.rb +45 -17
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/lib/unsign.jar +0 -0
- data/lib/calabash-android/operations.rb +150 -66
- data/lib/calabash-android/steps/list_steps.rb +1 -1
- data/lib/calabash-android/steps/time_picker_steps.rb +1 -1
- data/lib/calabash-android/touch_helpers.rb +9 -0
- data/lib/calabash-android/version.rb +1 -1
- data/lib/calabash-android/wait_helpers.rb +93 -0
- data/test-server/AndroidManifest.xml +2 -0
- data/test-server/build.xml +1 -0
- data/test-server/instrumentation-backend/.classpath +0 -1
- data/test-server/instrumentation-backend/AndroidManifest.xml +1 -1
- data/test-server/instrumentation-backend/antlr/UIQuery.g +48 -5
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Command.java +4 -3
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java +95 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Result.java +7 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/HttpServer.java +14 -29
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/FinishOpenedActivities.java +19 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GetOpenedActivities.java +31 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GoBackToActivity.java +67 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/DragCoordinates.java +28 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/Swipe.java +11 -5
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/location/FakeGPSLocation.java +13 -10
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/LeftKey.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/RightKey.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/UpKey.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/version/Version.java +31 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/CalabashChromeClient.java +131 -36
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpBodyHtml.java +38 -18
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpHtml.java +38 -16
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/EnterTextByCssSelector.java +94 -66
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteAsyncJavascript.java +55 -33
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteJavascript.java +53 -31
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/JavaScriptOperation.java +44 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/PressByCssSelector.java +52 -27
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +39 -32
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ScrollTo.java +56 -41
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetPropertyByCssSelector.java +50 -25
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetText.java +19 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/CompletedFuture.java +40 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/InvocationOperation.java +222 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Operation.java +7 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/PropertyOperation.java +56 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Query.java +151 -43
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQuery.tokens +19 -12
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQueryResultVoid.java +22 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ViewMapper.java +41 -11
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryLexer.java +1010 -242
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryParser.java +406 -98
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/BeginsWithRelation.java +45 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ComparisonOperator.java +54 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ContainsRelation.java +41 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/EndsWithRelation.java +42 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/LikeRelation.java +79 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/PartialFutureList.java +100 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryAST.java +1 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTClassName.java +54 -25
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicate.java +147 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicateRelation.java +5 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +153 -89
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryDirection.java +12 -2
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryEvaluator.java +58 -141
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +162 -7
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryVisibility.java +32 -0
- metadata +130 -97
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Query.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Touch.java +0 -44
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQuery.tokens +0 -10
- data/test-server/instrumentation-backend/tests/sh/calaba/instrumentationbackend/query/tests/UIQueryTest.java +0 -134
|
@@ -12,23 +12,66 @@ options {
|
|
|
12
12
|
package sh.calaba.instrumentationbackend.query.antlr;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
@lexer::members {
|
|
16
|
+
public String getErrorMessage(RecognitionException e, String[] tokenNames)
|
|
17
|
+
{
|
|
18
|
+
List stack = getRuleInvocationStack(e, this.getClass().getName());
|
|
19
|
+
String msg = null;
|
|
20
|
+
if ( e instanceof NoViableAltException ) {
|
|
21
|
+
NoViableAltException nvae = (NoViableAltException)e;
|
|
22
|
+
msg = " no viable alt; token="+e.token+" (decision="+nvae.decisionNumber+" state "+nvae.stateNumber+")"+" decision=<<"+nvae.grammarDecisionDescription+">>";
|
|
23
|
+
throw new RuntimeException(msg, e);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
msg = super.getErrorMessage(e, tokenNames);
|
|
27
|
+
}
|
|
28
|
+
return stack+" "+msg;
|
|
29
|
+
}
|
|
30
|
+
public String getTokenErrorDisplay(Token t) {
|
|
31
|
+
return t.toString();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
15
34
|
|
|
16
35
|
query : expr (WHITE! expr)*
|
|
17
36
|
;
|
|
18
37
|
|
|
19
38
|
|
|
20
|
-
expr : (className | filter)
|
|
39
|
+
expr : (className | filter | visibility | predicate | DIRECTION^)
|
|
40
|
+
;
|
|
41
|
+
|
|
42
|
+
DIRECTION : 'descendant' | 'child' | 'parent' | 'sibling'
|
|
21
43
|
;
|
|
22
44
|
|
|
23
|
-
className : (NAME^ | QUALIFIED_NAME^);
|
|
45
|
+
className : (WILDCARD^ | NAME^ | QUALIFIED_NAME^);
|
|
46
|
+
|
|
47
|
+
WILDCARD : '*';
|
|
24
48
|
|
|
25
49
|
QUALIFIED_NAME : NAME ('.' NAME)+;
|
|
26
50
|
|
|
51
|
+
visibility : (ALL^ | VISIBLE^);
|
|
52
|
+
|
|
53
|
+
ALL : 'all';
|
|
54
|
+
|
|
55
|
+
VISIBLE : 'visible';
|
|
56
|
+
|
|
57
|
+
|
|
27
58
|
filter : NAME FILTER_COLON^ (INT | STRING | BOOL | NIL);
|
|
28
59
|
|
|
29
60
|
FILTER_COLON : ':'
|
|
30
61
|
;
|
|
31
62
|
|
|
63
|
+
predicate : BEGINPRED^ NAME WHITE! RELATION WHITE! (INT | STRING | BOOL | NIL) ENDPRED!
|
|
64
|
+
;
|
|
65
|
+
BEGINPRED : '{'
|
|
66
|
+
;
|
|
67
|
+
ENDPRED : '}'
|
|
68
|
+
;
|
|
69
|
+
|
|
70
|
+
RELATION : | '=' | '>' | '>=' | '<' | '<=' |
|
|
71
|
+
(( 'BEGINSWITH' | 'ENDSWITH' | 'CONTAINS' | 'LIKE'
|
|
72
|
+
| 'beginswith' | 'endswith' | 'contains' | 'like') ('[' ('a'..'z' | 'A'..'Z')* ']')?)
|
|
73
|
+
|
|
74
|
+
;
|
|
32
75
|
|
|
33
76
|
INT : '0'..'9'+
|
|
34
77
|
;
|
|
@@ -43,16 +86,16 @@ NAME : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
|
|
|
43
86
|
;
|
|
44
87
|
|
|
45
88
|
STRING
|
|
46
|
-
: '\'' ( ESC_SEQ | ~('\\'|'
|
|
89
|
+
: '\'' ( ESC_SEQ | ~('\\'|'\'') )* '\''
|
|
47
90
|
;
|
|
48
91
|
|
|
49
|
-
WHITE : ' '
|
|
92
|
+
WHITE : ' '+ ;
|
|
50
93
|
fragment
|
|
51
94
|
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
|
|
52
95
|
|
|
53
96
|
fragment
|
|
54
97
|
ESC_SEQ
|
|
55
|
-
: '\\' ('b'|'t'|'n'|'f'|'r'|'\
|
|
98
|
+
: '\\' ('b'|'t'|'n'|'f'|'r'|'\''|'\\')
|
|
56
99
|
| UNICODE_ESC
|
|
57
100
|
| OCTAL_ESC
|
|
58
101
|
;
|
|
@@ -44,8 +44,9 @@ public class Command {
|
|
|
44
44
|
|
|
45
45
|
public Result execute() {
|
|
46
46
|
final Action action = InstrumentationBackend.actions.lookup(getCommand());
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
return action.execute(getArguments());
|
|
48
|
+
/*
|
|
49
|
+
if ( Looper.getMainLooper().getThread() == Thread.currentThread()) {
|
|
49
50
|
return action.execute(getArguments());
|
|
50
51
|
}
|
|
51
52
|
|
|
@@ -57,7 +58,7 @@ public class Command {
|
|
|
57
58
|
}
|
|
58
59
|
});
|
|
59
60
|
return result.get();
|
|
60
|
-
|
|
61
|
+
*/
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
}
|
data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
package sh.calaba.instrumentationbackend;
|
|
2
|
+
|
|
3
|
+
import java.io.CharArrayWriter;
|
|
4
|
+
import java.io.IOException;
|
|
5
|
+
import java.io.PrintWriter;
|
|
6
|
+
import java.util.Collections;
|
|
7
|
+
import java.util.HashMap;
|
|
8
|
+
import java.util.List;
|
|
9
|
+
import java.util.Map;
|
|
10
|
+
|
|
11
|
+
import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Represents a response in the Frankly protocol.
|
|
15
|
+
* This protocol is a JSON over HTTP protocol which is
|
|
16
|
+
* used across Calabash iOS, Calabash Android and Frank.
|
|
17
|
+
* @author krukow
|
|
18
|
+
* @see https://github.com/moredip/Frank/blob/master/doc/frankly.md
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
public class FranklyResult {
|
|
22
|
+
|
|
23
|
+
final boolean success;
|
|
24
|
+
final String reason;
|
|
25
|
+
final String detail;
|
|
26
|
+
@SuppressWarnings("rawtypes")
|
|
27
|
+
final List results;
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@SuppressWarnings({ "rawtypes" })
|
|
31
|
+
public FranklyResult(boolean success, List results, String reason,
|
|
32
|
+
String detail) {
|
|
33
|
+
super();
|
|
34
|
+
this.success = success;
|
|
35
|
+
this.results = results;
|
|
36
|
+
this.reason = reason;
|
|
37
|
+
this.detail = detail;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public static FranklyResult fromThrowable(Throwable t) {
|
|
41
|
+
CharArrayWriter caw = new CharArrayWriter();
|
|
42
|
+
t.printStackTrace(new PrintWriter(caw));
|
|
43
|
+
return new FranklyResult(false,Collections.EMPTY_LIST,t.getMessage(),caw.toString());
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public static FranklyResult emptyResult() {
|
|
47
|
+
return new FranklyResult(true,Collections.EMPTY_LIST,null,null);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public static FranklyResult failedResult(String message,String detail) {
|
|
51
|
+
return new FranklyResult(false,Collections.EMPTY_LIST,message,detail);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
public String asJson() {
|
|
55
|
+
ObjectMapper mapper = new ObjectMapper();
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
return mapper.writeValueAsString(asMap());
|
|
59
|
+
} catch (IOException e) {
|
|
60
|
+
throw new RuntimeException("Could not convert result to json", e);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public Map<String,Object> asMap()
|
|
65
|
+
{
|
|
66
|
+
Map<String,Object> result = new HashMap<String, Object>();
|
|
67
|
+
result.put("outcome", this.success ? "SUCCESS" : "ERROR");
|
|
68
|
+
|
|
69
|
+
if (this.success)
|
|
70
|
+
{
|
|
71
|
+
result.put("results",this.results);
|
|
72
|
+
}
|
|
73
|
+
else
|
|
74
|
+
{
|
|
75
|
+
result.put("reason", this.reason);
|
|
76
|
+
if (this.detail != null)
|
|
77
|
+
{
|
|
78
|
+
result.put("detail", this.detail);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@Override
|
|
85
|
+
public String toString()
|
|
86
|
+
{
|
|
87
|
+
return "FranklyResult [success=" + success + ", reason=" + reason
|
|
88
|
+
+ ", details=" + detail + ", results=" + results + "]";
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@SuppressWarnings("rawtypes")
|
|
92
|
+
public static FranklyResult successResult(List result) {
|
|
93
|
+
return new FranklyResult(true, result, null,null);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -22,7 +22,13 @@ public class Result {
|
|
|
22
22
|
this.success = success;
|
|
23
23
|
this.message = message;
|
|
24
24
|
}
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
public Result(boolean success, List<String> messages) {
|
|
27
|
+
this.success = success;
|
|
28
|
+
this.message = null;
|
|
29
|
+
this.bonusInformation = messages;
|
|
30
|
+
}
|
|
31
|
+
|
|
26
32
|
public String getMessage() {
|
|
27
33
|
return message;
|
|
28
34
|
}
|
|
@@ -14,13 +14,13 @@ import java.util.concurrent.locks.Lock;
|
|
|
14
14
|
import java.util.concurrent.locks.ReentrantLock;
|
|
15
15
|
|
|
16
16
|
import sh.calaba.instrumentationbackend.Command;
|
|
17
|
+
import sh.calaba.instrumentationbackend.FranklyResult;
|
|
17
18
|
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
|
18
19
|
import sh.calaba.instrumentationbackend.Result;
|
|
19
20
|
import sh.calaba.instrumentationbackend.query.Query;
|
|
20
21
|
import sh.calaba.instrumentationbackend.query.QueryResult;
|
|
21
22
|
import sh.calaba.org.codehaus.jackson.map.DeserializationConfig.Feature;
|
|
22
23
|
import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
|
|
23
|
-
import sh.calaba.org.codehaus.jackson.type.TypeReference;
|
|
24
24
|
import android.graphics.Bitmap;
|
|
25
25
|
import android.util.Log;
|
|
26
26
|
import android.view.View;
|
|
@@ -75,6 +75,7 @@ public class HttpServer extends NanoHTTPD {
|
|
|
75
75
|
return new NanoHTTPD.Response(HTTP_OK, MIME_HTML, "pong");
|
|
76
76
|
|
|
77
77
|
} else if (uri.endsWith("/map")) {
|
|
78
|
+
FranklyResult errorResult = null;
|
|
78
79
|
try {
|
|
79
80
|
String commandString = params.getProperty("json");
|
|
80
81
|
ObjectMapper mapper = new ObjectMapper();
|
|
@@ -85,39 +86,23 @@ public class HttpServer extends NanoHTTPD {
|
|
|
85
86
|
String methodName = (String) op.get("method_name");
|
|
86
87
|
List arguments = (List) op.get("arguments");
|
|
87
88
|
|
|
89
|
+
//For now we only support query and query_all
|
|
90
|
+
//query_all includes also invisible views, while query filters them
|
|
91
|
+
boolean includeInVisible = "query_all".equals(methodName);
|
|
88
92
|
|
|
89
93
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
System.out.println(methodName);
|
|
93
|
-
System.out.println(uiQuery);
|
|
94
|
-
System.out.println(arguments);
|
|
95
|
-
|
|
96
|
-
QueryResult queryResult = new Query(uiQuery,arguments).execute();
|
|
97
|
-
|
|
94
|
+
List queryResult = new Query(uiQuery,arguments).executeQuery();
|
|
98
95
|
|
|
99
|
-
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
|
|
100
|
-
queryResult.asJson());
|
|
101
|
-
} catch (
|
|
102
|
-
// TODO Auto-generated catch block
|
|
96
|
+
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8",
|
|
97
|
+
FranklyResult.successResult(queryResult).asJson());
|
|
98
|
+
} catch (Exception e ) {
|
|
103
99
|
e.printStackTrace();
|
|
104
|
-
|
|
105
|
-
|
|
100
|
+
errorResult = FranklyResult.fromThrowable(e);
|
|
101
|
+
}
|
|
102
|
+
return new NanoHTTPD.Response(HTTP_OK, "application/json;charset=utf-8", errorResult.asJson());
|
|
106
103
|
} else if (uri.endsWith("/query")) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
ObjectMapper mapper = new ObjectMapper();
|
|
110
|
-
Map<String, String> command = mapper.readValue(commandString,
|
|
111
|
-
new TypeReference<Map<String, String>>() {
|
|
112
|
-
});
|
|
113
|
-
QueryResult result = new Query(command.get("query")).execute();
|
|
114
|
-
return new NanoHTTPD.Response(HTTP_OK, MIME_HTML,
|
|
115
|
-
result.asJson());
|
|
116
|
-
} catch (IOException e) {
|
|
117
|
-
e.printStackTrace();
|
|
118
|
-
return new Response(HTTP_INTERNALERROR, MIME_PLAINTEXT,
|
|
119
|
-
"Could not parse arguments as JSON");
|
|
120
|
-
}
|
|
104
|
+
return new Response(HTTP_BADREQUEST, MIME_PLAINTEXT,
|
|
105
|
+
"/query endpoint is discontinued - use /map with operation query");
|
|
121
106
|
} else if (uri.endsWith("/kill")) {
|
|
122
107
|
lock.lock();
|
|
123
108
|
try {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.activity;
|
|
2
|
+
|
|
3
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
|
4
|
+
import sh.calaba.instrumentationbackend.Result;
|
|
5
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
|
6
|
+
|
|
7
|
+
public class FinishOpenedActivities implements Action {
|
|
8
|
+
|
|
9
|
+
@Override
|
|
10
|
+
public Result execute(String... args) {
|
|
11
|
+
InstrumentationBackend.solo.finishOpenedActivities();
|
|
12
|
+
return Result.successResult();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@Override
|
|
16
|
+
public String key() {
|
|
17
|
+
return "finish_opened_activities";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.activity;
|
|
2
|
+
|
|
3
|
+
import java.util.ArrayList;
|
|
4
|
+
|
|
5
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
|
6
|
+
import sh.calaba.instrumentationbackend.Result;
|
|
7
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
|
8
|
+
import android.app.Activity;
|
|
9
|
+
|
|
10
|
+
public class GetOpenedActivities implements Action {
|
|
11
|
+
|
|
12
|
+
@Override
|
|
13
|
+
public Result execute(String... args) {
|
|
14
|
+
final ArrayList<Activity> activities = InstrumentationBackend.solo
|
|
15
|
+
.getAllOpenedActivities();
|
|
16
|
+
final ArrayList<String> opened = new ArrayList<String>(
|
|
17
|
+
activities.size());
|
|
18
|
+
|
|
19
|
+
for (final Activity activity : activities) {
|
|
20
|
+
opened.add(activity.getClass().getSimpleName());
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// opened is attached to bonusInformation
|
|
24
|
+
return new Result(true, opened);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@Override
|
|
28
|
+
public String key() {
|
|
29
|
+
return "get_opened_activities";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.activity;
|
|
2
|
+
|
|
3
|
+
import java.util.ArrayList;
|
|
4
|
+
|
|
5
|
+
import android.app.Activity;
|
|
6
|
+
import android.view.KeyEvent;
|
|
7
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
|
8
|
+
import sh.calaba.instrumentationbackend.Result;
|
|
9
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
|
10
|
+
import sh.calaba.instrumentationbackend.actions.Actions;
|
|
11
|
+
|
|
12
|
+
public class GoBackToActivity implements Action {
|
|
13
|
+
|
|
14
|
+
@Override
|
|
15
|
+
public Result execute(String... args) {
|
|
16
|
+
|
|
17
|
+
if (args == null) {
|
|
18
|
+
return Result
|
|
19
|
+
.failedResult("Target activity name must not be null.");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (args.length != 1) {
|
|
23
|
+
return Result.failedResult("Must pass exactly one argument.");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (args[0].trim().length() == 0) {
|
|
27
|
+
return Result.failedResult("Argument must not be whitespace.");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
final String targetActivityName = args[0];
|
|
31
|
+
|
|
32
|
+
final ArrayList<Activity> activities = InstrumentationBackend.solo
|
|
33
|
+
.getAllOpenedActivities();
|
|
34
|
+
boolean success = false;
|
|
35
|
+
|
|
36
|
+
final ArrayList<String> opened = new ArrayList<String>(
|
|
37
|
+
activities.size());
|
|
38
|
+
|
|
39
|
+
for (final Activity activity : activities) {
|
|
40
|
+
final String name = activity.getClass().getSimpleName();
|
|
41
|
+
if (name.contentEquals(targetActivityName)) {
|
|
42
|
+
success = true;
|
|
43
|
+
}
|
|
44
|
+
opened.add(name);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!success) {
|
|
48
|
+
return new Result(false, opened);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
while (!InstrumentationBackend.solo.getCurrentActivity().getClass()
|
|
52
|
+
.getSimpleName().contentEquals(targetActivityName)) {
|
|
53
|
+
try {
|
|
54
|
+
Actions.parentInstrumentation
|
|
55
|
+
.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
|
|
56
|
+
} catch (Exception exception) {
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return new Result(true, opened);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@Override
|
|
64
|
+
public String key() {
|
|
65
|
+
return "go_back_to_activity";
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.gestures;
|
|
2
|
+
|
|
3
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
|
4
|
+
import sh.calaba.instrumentationbackend.Result;
|
|
5
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
|
6
|
+
|
|
7
|
+
public class DragCoordinates implements Action {
|
|
8
|
+
|
|
9
|
+
@Override
|
|
10
|
+
public Result execute(String... args) {
|
|
11
|
+
|
|
12
|
+
Float fromX = new Float(args[0]);
|
|
13
|
+
Float fromY = new Float(args[1]);
|
|
14
|
+
Float toX = new Float(args[2]);
|
|
15
|
+
Float toY = new Float(args[3]);
|
|
16
|
+
Integer stepCount = 40;
|
|
17
|
+
|
|
18
|
+
InstrumentationBackend.solo.drag(fromX, toX, fromY, toY, stepCount);
|
|
19
|
+
|
|
20
|
+
return Result.successResult();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
public String key() {
|
|
25
|
+
return "drag_coordinates";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
package sh.calaba.instrumentationbackend.actions.gestures;
|
|
2
2
|
|
|
3
|
+
import android.util.DisplayMetrics;
|
|
3
4
|
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
|
4
5
|
import sh.calaba.instrumentationbackend.Result;
|
|
5
6
|
import sh.calaba.instrumentationbackend.actions.Action;
|
|
@@ -11,13 +12,18 @@ public class Swipe implements Action {
|
|
|
11
12
|
@Override
|
|
12
13
|
public Result execute(String... args) {
|
|
13
14
|
String direction = args[0];
|
|
14
|
-
if(direction.equalsIgnoreCase("left")) {
|
|
15
|
-
InstrumentationBackend.solo.scrollToSide(Solo.LEFT);
|
|
16
|
-
} else {
|
|
17
|
-
InstrumentationBackend.solo.scrollToSide(Solo.RIGHT);
|
|
18
15
|
|
|
16
|
+
if (args.length == 1) {
|
|
17
|
+
if(direction.equalsIgnoreCase("left")) {
|
|
18
|
+
InstrumentationBackend.solo.scrollToSide(Solo.LEFT);
|
|
19
|
+
return Result.successResult();
|
|
20
|
+
} else if(direction.equalsIgnoreCase("right")) {
|
|
21
|
+
InstrumentationBackend.solo.scrollToSide(Solo.RIGHT);
|
|
22
|
+
return Result.successResult();
|
|
23
|
+
}
|
|
24
|
+
return Result.failedResult("Invalid direction to swipe: " + direction);
|
|
19
25
|
}
|
|
20
|
-
return Result.
|
|
26
|
+
return Result.failedResult("You must provide a direction. Either 'left' or 'right'");
|
|
21
27
|
}
|
|
22
28
|
|
|
23
29
|
@Override
|
|
@@ -10,6 +10,8 @@ import android.location.Location;
|
|
|
10
10
|
import android.location.LocationManager;
|
|
11
11
|
import android.location.LocationProvider;
|
|
12
12
|
|
|
13
|
+
import java.lang.reflect.Method;
|
|
14
|
+
|
|
13
15
|
|
|
14
16
|
public class FakeGPSLocation implements Action {
|
|
15
17
|
|
|
@@ -73,15 +75,22 @@ public class FakeGPSLocation implements Action {
|
|
|
73
75
|
|
|
74
76
|
private void setLocation(LocationManager locationManager, String locationProvider, double latitude, double longitude) {
|
|
75
77
|
|
|
76
|
-
//locationManager.clearTestProviderLocation(locationProvider);
|
|
77
|
-
|
|
78
78
|
Location location = new Location(locationProvider);
|
|
79
79
|
location.setLatitude(latitude);
|
|
80
80
|
location.setLongitude(longitude);
|
|
81
81
|
location.setAccuracy(1);
|
|
82
82
|
location.setTime(System.currentTimeMillis());
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
try {
|
|
85
|
+
Method makeComplete = Location.class.getMethod("makeComplete");
|
|
86
|
+
if (makeComplete != null) {
|
|
87
|
+
makeComplete.invoke(location);
|
|
88
|
+
}
|
|
89
|
+
} catch (Exception e) {
|
|
90
|
+
//Method only available in Jelly Bean
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
locationManager.setTestProviderLocation(locationProvider, location);
|
|
85
94
|
}
|
|
86
95
|
|
|
87
96
|
public void finish() {
|
|
@@ -93,13 +102,7 @@ public class FakeGPSLocation implements Action {
|
|
|
93
102
|
public String key() {
|
|
94
103
|
return "set_gps_coordinates";
|
|
95
104
|
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Causes error if Device does not support given provider
|
|
99
|
-
*
|
|
100
|
-
* @param provider
|
|
101
|
-
* @return
|
|
102
|
-
*/
|
|
105
|
+
|
|
103
106
|
private boolean doesDeviceProvideGPS() {
|
|
104
107
|
LocationManager locationManager = (LocationManager) InstrumentationBackend.solo.getCurrentActivity().getSystemService(Context.LOCATION_SERVICE);
|
|
105
108
|
if (locationManager.getProvider(LocationManager.GPS_PROVIDER) == null) {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.softkey;
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import com.jayway.android.robotium.solo.Solo;
|
|
5
|
+
|
|
6
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
|
7
|
+
import sh.calaba.instrumentationbackend.Result;
|
|
8
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
public class LeftKey implements Action {
|
|
12
|
+
|
|
13
|
+
@Override
|
|
14
|
+
public Result execute(String... args) {
|
|
15
|
+
InstrumentationBackend.solo.sendKey(Solo.LEFT);
|
|
16
|
+
return Result.successResult();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Override
|
|
20
|
+
public String key() {
|
|
21
|
+
return "send_key_left";
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.softkey;
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import com.jayway.android.robotium.solo.Solo;
|
|
5
|
+
|
|
6
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
|
7
|
+
import sh.calaba.instrumentationbackend.Result;
|
|
8
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
public class RightKey implements Action {
|
|
12
|
+
|
|
13
|
+
@Override
|
|
14
|
+
public Result execute(String... args) {
|
|
15
|
+
InstrumentationBackend.solo.sendKey(Solo.RIGHT);
|
|
16
|
+
return Result.successResult();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Override
|
|
20
|
+
public String key() {
|
|
21
|
+
return "send_key_right";
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.softkey;
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import com.jayway.android.robotium.solo.Solo;
|
|
5
|
+
|
|
6
|
+
import sh.calaba.instrumentationbackend.InstrumentationBackend;
|
|
7
|
+
import sh.calaba.instrumentationbackend.Result;
|
|
8
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
public class UpKey implements Action {
|
|
12
|
+
|
|
13
|
+
@Override
|
|
14
|
+
public Result execute(String... args) {
|
|
15
|
+
InstrumentationBackend.solo.sendKey(Solo.UP);
|
|
16
|
+
return Result.successResult();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Override
|
|
20
|
+
public String key() {
|
|
21
|
+
return "send_key_up";
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package sh.calaba.instrumentationbackend.actions.version;
|
|
2
|
+
|
|
3
|
+
import sh.calaba.instrumentationbackend.Result;
|
|
4
|
+
import sh.calaba.instrumentationbackend.actions.Action;
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Generated Code.
|
|
9
|
+
* Do not edit.
|
|
10
|
+
*
|
|
11
|
+
*/
|
|
12
|
+
public class Version implements Action {
|
|
13
|
+
|
|
14
|
+
/******
|
|
15
|
+
* Generate Version Number
|
|
16
|
+
* DO NOT EDIT
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
public static final String VERSION="####VERSION####";
|
|
20
|
+
|
|
21
|
+
@Override
|
|
22
|
+
public Result execute(String... args) {
|
|
23
|
+
return new Result(true,VERSION);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@Override
|
|
27
|
+
public String key() {
|
|
28
|
+
return "version";
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
}
|