@appium/base-driver 8.5.7 → 8.7.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.
Files changed (74) hide show
  1. package/build/lib/basedriver/capabilities.js +2 -2
  2. package/build/lib/basedriver/commands/execute.d.ts +11 -0
  3. package/build/lib/basedriver/commands/execute.d.ts.map +1 -0
  4. package/build/lib/basedriver/commands/execute.js +62 -0
  5. package/build/lib/basedriver/commands/index.d.ts +1 -1
  6. package/build/lib/basedriver/commands/index.d.ts.map +1 -1
  7. package/build/lib/basedriver/commands/index.js +5 -2
  8. package/build/lib/basedriver/commands/log.js +2 -4
  9. package/build/lib/basedriver/core.d.ts +11 -0
  10. package/build/lib/basedriver/core.d.ts.map +1 -1
  11. package/build/lib/basedriver/core.js +6 -1
  12. package/build/lib/basedriver/helpers.js +2 -2
  13. package/build/lib/express/server.d.ts +70 -7
  14. package/build/lib/express/server.d.ts.map +1 -1
  15. package/build/lib/express/server.js +19 -16
  16. package/build/lib/express/websocket.d.ts +12 -30
  17. package/build/lib/express/websocket.d.ts.map +1 -1
  18. package/build/lib/express/websocket.js +6 -4
  19. package/build/lib/index.d.ts +12 -180
  20. package/build/lib/index.d.ts.map +1 -1
  21. package/build/lib/index.js +107 -80
  22. package/build/lib/jsonwp-proxy/protocol-converter.js +2 -4
  23. package/build/lib/jsonwp-proxy/proxy.js +3 -7
  24. package/build/lib/protocol/index.d.ts +3 -1
  25. package/build/lib/protocol/index.js +13 -1
  26. package/build/lib/protocol/protocol.d.ts +8 -4
  27. package/build/lib/protocol/protocol.d.ts.map +1 -1
  28. package/build/lib/protocol/protocol.js +7 -7
  29. package/build/lib/protocol/routes.js +2 -6
  30. package/build/tsconfig.tsbuildinfo +1 -1
  31. package/lib/basedriver/commands/execute.js +65 -0
  32. package/lib/basedriver/commands/index.js +3 -1
  33. package/lib/basedriver/core.js +15 -0
  34. package/lib/express/server.js +126 -36
  35. package/lib/express/websocket.js +13 -11
  36. package/lib/index.js +19 -61
  37. package/lib/protocol/index.js +4 -0
  38. package/lib/protocol/protocol.js +10 -3
  39. package/package.json +17 -15
  40. package/build/test/basedriver/README.md +0 -5
  41. package/build/test/basedriver/driver-e2e-tests.js +0 -413
  42. package/build/test/basedriver/driver-tests.js +0 -572
  43. package/build/test/basedriver/index.js +0 -26
  44. package/build/test/e2e/basedriver/driver.e2e.spec.js +0 -15
  45. package/build/test/e2e/basedriver/helpers.e2e.spec.js +0 -192
  46. package/build/test/e2e/basedriver/websockets.e2e.spec.js +0 -87
  47. package/build/test/e2e/express/server.e2e.spec.js +0 -159
  48. package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +0 -59
  49. package/build/test/e2e/protocol/fake-driver.js +0 -163
  50. package/build/test/e2e/protocol/helpers.js +0 -25
  51. package/build/test/e2e/protocol/protocol.e2e.spec.js +0 -1186
  52. package/build/test/helpers.js +0 -55
  53. package/build/test/unit/basedriver/capabilities.spec.js +0 -672
  54. package/build/test/unit/basedriver/capability.spec.js +0 -353
  55. package/build/test/unit/basedriver/commands/event.spec.js +0 -110
  56. package/build/test/unit/basedriver/commands/log.spec.js +0 -92
  57. package/build/test/unit/basedriver/device-settings.spec.js +0 -97
  58. package/build/test/unit/basedriver/driver.spec.js +0 -15
  59. package/build/test/unit/basedriver/helpers.spec.js +0 -151
  60. package/build/test/unit/basedriver/timeout.spec.js +0 -135
  61. package/build/test/unit/express/server.spec.js +0 -155
  62. package/build/test/unit/express/static.spec.js +0 -26
  63. package/build/test/unit/jsonwp-proxy/mock-request.js +0 -91
  64. package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +0 -171
  65. package/build/test/unit/jsonwp-proxy/proxy.spec.js +0 -292
  66. package/build/test/unit/jsonwp-proxy/url.spec.js +0 -165
  67. package/build/test/unit/jsonwp-status/status.spec.js +0 -34
  68. package/build/test/unit/protocol/errors.spec.js +0 -390
  69. package/build/test/unit/protocol/routes.spec.js +0 -80
  70. package/build/test/unit/protocol/validator.spec.js +0 -149
  71. package/test/basedriver/README.md +0 -5
  72. package/test/basedriver/driver-e2e-tests.js +0 -386
  73. package/test/basedriver/driver-tests.js +0 -624
  74. package/test/basedriver/index.js +0 -6
@@ -1,149 +0,0 @@
1
- "use strict";
2
-
3
- require("source-map-support/register");
4
-
5
- var _validators = require("../../../lib/protocol/validators");
6
-
7
- describe('Protocol', function () {
8
- describe('direct to driver', function () {
9
- describe('setUrl', function () {
10
- it('should fail when no url passed', function () {
11
- (() => {
12
- _validators.validators.setUrl();
13
- }).should.throw(/url/i);
14
- });
15
- it('should fail when given invalid url', function () {
16
- (() => {
17
- _validators.validators.setUrl('foo');
18
- }).should.throw(/url/i);
19
- });
20
- it('should succeed when given url starting with http', function () {
21
- (() => {
22
- _validators.validators.setUrl('http://appium.io');
23
- }).should.not.throw();
24
- });
25
- it('should succeed when given an android-like scheme', function () {
26
- (() => {
27
- _validators.validators.setUrl('content://contacts/people/1');
28
- }).should.not.throw();
29
- });
30
- it('should succeed with hyphens dots and plus chars in the scheme', function () {
31
- (() => {
32
- _validators.validators.setUrl('my-app.a+b://login');
33
- }).should.not.throw();
34
- });
35
- it('should succeed when given an about scheme', function () {
36
- (() => {
37
- _validators.validators.setUrl('about:blank');
38
- }).should.not.throw();
39
- });
40
- it('should succeed when given a data scheme', function () {
41
- (() => {
42
- _validators.validators.setUrl('data:text/html,<html></html>');
43
- }).should.not.throw();
44
- });
45
- });
46
- describe('implicitWait', function () {
47
- it('should fail when given no ms', function () {
48
- (() => {
49
- _validators.validators.implicitWait();
50
- }).should.throw(/ms/i);
51
- });
52
- it('should fail when given a non-numeric ms', function () {
53
- (() => {
54
- _validators.validators.implicitWait('five');
55
- }).should.throw(/ms/i);
56
- });
57
- it('should fail when given a negative ms', function () {
58
- (() => {
59
- _validators.validators.implicitWait(-1);
60
- }).should.throw(/ms/i);
61
- });
62
- it('should succeed when given an ms of 0', function () {
63
- (() => {
64
- _validators.validators.implicitWait(0);
65
- }).should.not.throw();
66
- });
67
- it('should succeed when given an ms greater than 0', function () {
68
- (() => {
69
- _validators.validators.implicitWait(100);
70
- }).should.not.throw();
71
- });
72
- });
73
- describe('asyncScriptTimeout', function () {
74
- it('should fail when given no ms', function () {
75
- (() => {
76
- _validators.validators.asyncScriptTimeout();
77
- }).should.throw(/ms/i);
78
- });
79
- it('should fail when given a non-numeric ms', function () {
80
- (() => {
81
- _validators.validators.asyncScriptTimeout('five');
82
- }).should.throw(/ms/i);
83
- });
84
- it('should fail when given a negative ms', function () {
85
- (() => {
86
- _validators.validators.asyncScriptTimeout(-1);
87
- }).should.throw(/ms/i);
88
- });
89
- it('should succeed when given an ms of 0', function () {
90
- (() => {
91
- _validators.validators.asyncScriptTimeout(0);
92
- }).should.not.throw();
93
- });
94
- it('should succeed when given an ms greater than 0', function () {
95
- (() => {
96
- _validators.validators.asyncScriptTimeout(100);
97
- }).should.not.throw();
98
- });
99
- });
100
- describe('clickCurrent', function () {
101
- it('should fail when given an invalid button', function () {
102
- (() => {
103
- _validators.validators.clickCurrent(4);
104
- }).should.throw(/0, 1, or 2/i);
105
- });
106
- it('should succeed when given a valid button', function () {
107
- (() => {
108
- _validators.validators.clickCurrent(0);
109
- }).should.not.throw();
110
- (() => {
111
- _validators.validators.clickCurrent(1);
112
- }).should.not.throw();
113
- (() => {
114
- _validators.validators.clickCurrent(2);
115
- }).should.not.throw();
116
- });
117
- });
118
- describe('setNetworkConnection', function () {
119
- it('should fail when given no type', function () {
120
- (() => {
121
- _validators.validators.setNetworkConnection();
122
- }).should.throw(/0, 1, 2, 4, 6/i);
123
- });
124
- it('should fail when given an invalid type', function () {
125
- (() => {
126
- _validators.validators.setNetworkConnection(8);
127
- }).should.throw(/0, 1, 2, 4, 6/i);
128
- });
129
- it('should succeed when given a valid type', function () {
130
- (() => {
131
- _validators.validators.setNetworkConnection(0);
132
- }).should.not.throw();
133
- (() => {
134
- _validators.validators.setNetworkConnection(1);
135
- }).should.not.throw();
136
- (() => {
137
- _validators.validators.setNetworkConnection(2);
138
- }).should.not.throw();
139
- (() => {
140
- _validators.validators.setNetworkConnection(4);
141
- }).should.not.throw();
142
- (() => {
143
- _validators.validators.setNetworkConnection(6);
144
- }).should.not.throw();
145
- });
146
- });
147
- });
148
- });
149
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZXNjcmliZSIsIml0IiwidmFsaWRhdG9ycyIsInNldFVybCIsInNob3VsZCIsInRocm93Iiwibm90IiwiaW1wbGljaXRXYWl0IiwiYXN5bmNTY3JpcHRUaW1lb3V0IiwiY2xpY2tDdXJyZW50Iiwic2V0TmV0d29ya0Nvbm5lY3Rpb24iXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvcHJvdG9jb2wvdmFsaWRhdG9yLnNwZWMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1vY2hhXG5cbmltcG9ydCB7dmFsaWRhdG9yc30gZnJvbSAnLi4vLi4vLi4vbGliL3Byb3RvY29sL3ZhbGlkYXRvcnMnO1xuXG5kZXNjcmliZSgnUHJvdG9jb2wnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdkaXJlY3QgdG8gZHJpdmVyJywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCdzZXRVcmwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBubyB1cmwgcGFzc2VkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuc2V0VXJsKCk7XG4gICAgICAgIH0pLnNob3VsZC50aHJvdygvdXJsL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBpbnZhbGlkIHVybCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldFVybCgnZm9vJyk7XG4gICAgICAgIH0pLnNob3VsZC50aHJvdygvdXJsL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2hlbiBnaXZlbiB1cmwgc3RhcnRpbmcgd2l0aCBodHRwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuc2V0VXJsKCdodHRwOi8vYXBwaXVtLmlvJyk7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdoZW4gZ2l2ZW4gYW4gYW5kcm9pZC1saWtlIHNjaGVtZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldFVybCgnY29udGVudDovL2NvbnRhY3RzL3Blb3BsZS8xJyk7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHdpdGggaHlwaGVucyBkb3RzIGFuZCBwbHVzIGNoYXJzIGluIHRoZSBzY2hlbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5zZXRVcmwoJ215LWFwcC5hK2I6Ly9sb2dpbicpO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB3aGVuIGdpdmVuIGFuIGFib3V0IHNjaGVtZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldFVybCgnYWJvdXQ6YmxhbmsnKTtcbiAgICAgICAgfSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2hlbiBnaXZlbiBhIGRhdGEgc2NoZW1lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuc2V0VXJsKCdkYXRhOnRleHQvaHRtbCw8aHRtbD48L2h0bWw+Jyk7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdpbXBsaWNpdFdhaXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBubyBtcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLmltcGxpY2l0V2FpdCgpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coL21zL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBhIG5vbi1udW1lcmljIG1zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuaW1wbGljaXRXYWl0KCdmaXZlJyk7XG4gICAgICAgIH0pLnNob3VsZC50aHJvdygvbXMvaSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGdpdmVuIGEgbmVnYXRpdmUgbXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5pbXBsaWNpdFdhaXQoLTEpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coL21zL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2hlbiBnaXZlbiBhbiBtcyBvZiAwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuaW1wbGljaXRXYWl0KDApO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB3aGVuIGdpdmVuIGFuIG1zIGdyZWF0ZXIgdGhhbiAwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuaW1wbGljaXRXYWl0KDEwMCk7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdhc3luY1NjcmlwdFRpbWVvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBubyBtcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLmFzeW5jU2NyaXB0VGltZW91dCgpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coL21zL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBhIG5vbi1udW1lcmljIG1zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuYXN5bmNTY3JpcHRUaW1lb3V0KCdmaXZlJyk7XG4gICAgICAgIH0pLnNob3VsZC50aHJvdygvbXMvaSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGdpdmVuIGEgbmVnYXRpdmUgbXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5hc3luY1NjcmlwdFRpbWVvdXQoLTEpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coL21zL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2hlbiBnaXZlbiBhbiBtcyBvZiAwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuYXN5bmNTY3JpcHRUaW1lb3V0KDApO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB3aGVuIGdpdmVuIGFuIG1zIGdyZWF0ZXIgdGhhbiAwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuYXN5bmNTY3JpcHRUaW1lb3V0KDEwMCk7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdjbGlja0N1cnJlbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiBnaXZlbiBhbiBpbnZhbGlkIGJ1dHRvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLmNsaWNrQ3VycmVudCg0KTtcbiAgICAgICAgfSkuc2hvdWxkLnRocm93KC8wLCAxLCBvciAyL2kpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgd2hlbiBnaXZlbiBhIHZhbGlkIGJ1dHRvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLmNsaWNrQ3VycmVudCgwKTtcbiAgICAgICAgfSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuY2xpY2tDdXJyZW50KDEpO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5jbGlja0N1cnJlbnQoMik7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdzZXROZXR3b3JrQ29ubmVjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGdpdmVuIG5vIHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5zZXROZXR3b3JrQ29ubmVjdGlvbigpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coLzAsIDEsIDIsIDQsIDYvaSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgZmFpbCB3aGVuIGdpdmVuIGFuIGludmFsaWQgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldE5ldHdvcmtDb25uZWN0aW9uKDgpO1xuICAgICAgICB9KS5zaG91bGQudGhyb3coLzAsIDEsIDIsIDQsIDYvaSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgc3VjY2VlZCB3aGVuIGdpdmVuIGEgdmFsaWQgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldE5ldHdvcmtDb25uZWN0aW9uKDApO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5zZXROZXR3b3JrQ29ubmVjdGlvbigxKTtcbiAgICAgICAgfSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIHZhbGlkYXRvcnMuc2V0TmV0d29ya0Nvbm5lY3Rpb24oMik7XG4gICAgICAgIH0pLnNob3VsZC5ub3QudGhyb3coKTtcbiAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICB2YWxpZGF0b3JzLnNldE5ldHdvcmtDb25uZWN0aW9uKDQpO1xuICAgICAgICB9KS5zaG91bGQubm90LnRocm93KCk7XG4gICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgdmFsaWRhdG9ycy5zZXROZXR3b3JrQ29ubmVjdGlvbig2KTtcbiAgICAgICAgfSkuc2hvdWxkLm5vdC50aHJvdygpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFFQTs7QUFFQUEsUUFBUSxDQUFDLFVBQUQsRUFBYSxZQUFZO0VBQy9CQSxRQUFRLENBQUMsa0JBQUQsRUFBcUIsWUFBWTtJQUN2Q0EsUUFBUSxDQUFDLFFBQUQsRUFBVyxZQUFZO01BQzdCQyxFQUFFLENBQUMsZ0NBQUQsRUFBbUMsWUFBWTtRQUMvQyxDQUFDLE1BQU07VUFDTEMsc0JBQUEsQ0FBV0MsTUFBWDtRQUNELENBRkQsRUFFR0MsTUFGSCxDQUVVQyxLQUZWLENBRWdCLE1BRmhCO01BR0QsQ0FKQyxDQUFGO01BS0FKLEVBQUUsQ0FBQyxvQ0FBRCxFQUF1QyxZQUFZO1FBQ25E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
@@ -1,5 +0,0 @@
1
- # Driver Test Helpers
2
-
3
- This directory contains modules which expose test suites that an external driver can use to test against the base implementation. They are published in the `@appium/base-driver` package.
4
-
5
- Drivers wanting to leverage these suites will want to add `@appium/base-driver` to their `devDependencies`.
@@ -1,386 +0,0 @@
1
- import _ from 'lodash';
2
- import {BaseDriver, server, routeConfiguringFunction, DeviceSettings} from '../../lib';
3
- import axios from 'axios';
4
- import B from 'bluebird';
5
- import {TEST_HOST, getTestPort, createAppiumURL, METHODS} from '../helpers';
6
- import {PREFIXED_APPIUM_OPTS_CAP} from '../../lib/basedriver/capabilities';
7
- const {POST, DELETE} = METHODS;
8
-
9
- function baseDriverE2ETests(DriverClass, defaultCaps = {}) {
10
- let address = defaultCaps['appium:address'] ?? TEST_HOST;
11
- let port = defaultCaps['appium:port'];
12
- const className = DriverClass.name || '(unknown driver)';
13
-
14
- describe(`BaseDriver E2E (as ${className})`, function () {
15
- let baseServer, d;
16
- /**
17
- * This URL creates a new session
18
- * @type {string}
19
- **/
20
- let newSessionURL;
21
-
22
- /**
23
- * Creates a URL with base host/port. Supply `session` and `pathname`
24
- * @type {_.CurriedFunction2<string,string,string>}
25
- */
26
- let createAppiumTestURL;
27
-
28
- /**
29
- * Creates a URL with the given session ID and a blank pathname;
30
- * e.g., `http://foo.bar:123/session/<session-id>`
31
- * @type {_.CurriedFunction1<string,string>}
32
- */
33
- let createSessionURL;
34
-
35
- before(async function () {
36
- port = port ?? (await getTestPort());
37
- defaultCaps = {...defaultCaps, 'appium:port': port};
38
- d = new DriverClass({port, address});
39
- baseServer = await server({
40
- routeConfiguringFunction: routeConfiguringFunction(d),
41
- port,
42
- hostname: TEST_HOST,
43
- });
44
- createAppiumTestURL = createAppiumURL(address, port);
45
- newSessionURL = createAppiumTestURL('', 'session');
46
- createSessionURL = createAppiumTestURL(_, '');
47
- });
48
-
49
- after(async function () {
50
- await baseServer.close();
51
- });
52
-
53
- async function startSession(caps) {
54
- return (
55
- await axios({
56
- url: newSessionURL,
57
- method: POST,
58
- data: {capabilities: {alwaysMatch: caps, firstMatch: [{}]}},
59
- })
60
- ).data.value;
61
- }
62
-
63
- async function endSession(id) {
64
- return (
65
- await axios({
66
- url: createSessionURL(id),
67
- method: DELETE,
68
- validateStatus: null,
69
- })
70
- ).data.value;
71
- }
72
-
73
- async function getSession(id) {
74
- return (
75
- await axios({
76
- url: createSessionURL(id),
77
- })
78
- ).data.value;
79
- }
80
-
81
- describe('session handling', function () {
82
- it('should handle idempotency while creating sessions', async function () {
83
- const sessionIds = [];
84
- let times = 0;
85
- do {
86
- const {sessionId} = (
87
- await axios({
88
- url: newSessionURL,
89
- headers: {
90
- 'X-Idempotency-Key': '123456',
91
- },
92
- method: POST,
93
- data: {
94
- capabilities: {alwaysMatch: defaultCaps, firstMatch: [{}]},
95
- },
96
- simple: false,
97
- resolveWithFullResponse: true,
98
- })
99
- ).data.value;
100
-
101
- sessionIds.push(sessionId);
102
- times++;
103
- } while (times < 2);
104
- _.uniq(sessionIds).length.should.equal(1);
105
-
106
- const {status, data} = await axios({
107
- url: createSessionURL(sessionIds[0]),
108
- method: DELETE,
109
- });
110
- status.should.equal(200);
111
- should.equal(data.value, null);
112
- });
113
-
114
- it('should handle idempotency while creating parallel sessions', async function () {
115
- const reqs = [];
116
- let times = 0;
117
- do {
118
- reqs.push(
119
- axios({
120
- url: newSessionURL,
121
- headers: {
122
- 'X-Idempotency-Key': '12345',
123
- },
124
- method: POST,
125
- data: {
126
- capabilities: {alwaysMatch: defaultCaps, firstMatch: [{}]},
127
- },
128
- })
129
- );
130
- times++;
131
- } while (times < 2);
132
- const sessionIds = (await B.all(reqs)).map((x) => x.data.value.sessionId);
133
- _.uniq(sessionIds).length.should.equal(1);
134
-
135
- const {status, data} = await axios({
136
- url: createSessionURL(sessionIds[0]),
137
- method: DELETE,
138
- });
139
- status.should.equal(200);
140
- should.equal(data.value, null);
141
- });
142
-
143
- it('should create session and retrieve a session id, then delete it', async function () {
144
- let {status, data} = await axios({
145
- url: newSessionURL,
146
- method: POST,
147
- data: {capabilities: {alwaysMatch: defaultCaps, firstMatch: [{}]}},
148
- });
149
-
150
- status.should.equal(200);
151
- should.exist(data.value.sessionId);
152
- data.value.capabilities.platformName.should.equal(defaultCaps.platformName);
153
- data.value.capabilities.deviceName.should.equal(defaultCaps['appium:deviceName']);
154
-
155
- ({status, data} = await axios({
156
- url: createSessionURL(d.sessionId),
157
- method: DELETE,
158
- }));
159
-
160
- status.should.equal(200);
161
- should.equal(data.value, null);
162
- should.equal(d.sessionId, null);
163
- });
164
- });
165
-
166
- it.skip('should throw NYI for commands not implemented', async function () {});
167
-
168
- describe('command timeouts', function () {
169
- let originalFindElement, originalFindElements;
170
-
171
- async function startTimeoutSession(timeout) {
172
- const caps = _.cloneDeep(defaultCaps);
173
- caps['appium:newCommandTimeout'] = timeout;
174
- return await startSession(caps);
175
- }
176
-
177
- before(function () {
178
- originalFindElement = d.findElement;
179
- d.findElement = function () {
180
- return 'foo';
181
- }.bind(d);
182
-
183
- originalFindElements = d.findElements;
184
- d.findElements = async function () {
185
- await B.delay(200);
186
- return ['foo'];
187
- }.bind(d);
188
- });
189
-
190
- after(function () {
191
- d.findElement = originalFindElement;
192
- d.findElements = originalFindElements;
193
- });
194
-
195
- it('should set a default commandTimeout', async function () {
196
- let newSession = await startTimeoutSession();
197
- d.newCommandTimeoutMs.should.be.above(0);
198
- await endSession(newSession.sessionId);
199
- });
200
-
201
- it('should timeout on commands using commandTimeout cap', async function () {
202
- let newSession = await startTimeoutSession(0.25);
203
- // XXX: race condition: we must build this URL before ...something happens...
204
- // which causes `d.sessionId` to be missing
205
- let sessionURL = createSessionURL(d.sessionId);
206
- await axios({
207
- url: createAppiumTestURL(d.sessionId, 'element'),
208
- method: POST,
209
- data: {using: 'name', value: 'foo'},
210
- });
211
- await B.delay(400);
212
- const {data} = await axios({
213
- url: sessionURL,
214
- validateStatus: null,
215
- });
216
- should.equal(data.value.error, 'invalid session id');
217
- should.equal(d.sessionId, null);
218
- const resp = await endSession(newSession.sessionId);
219
- should.equal(resp.error, 'invalid session id');
220
- });
221
-
222
- it('should not timeout with commandTimeout of false', async function () {
223
- let newSession = await startTimeoutSession(0.1);
224
- let start = Date.now();
225
- const {value} = (
226
- await axios({
227
- url: createAppiumTestURL(d.sessionId, 'elements'),
228
- method: POST,
229
- data: {using: 'name', value: 'foo'},
230
- })
231
- ).data;
232
- (Date.now() - start).should.be.above(150);
233
- value.should.eql(['foo']);
234
- await endSession(newSession.sessionId);
235
- });
236
-
237
- it('should not timeout with commandTimeout of 0', async function () {
238
- d.newCommandTimeoutMs = 2;
239
- let newSession = await startTimeoutSession(0);
240
-
241
- await axios({
242
- url: createAppiumTestURL(d.sessionId, 'element'),
243
- method: POST,
244
- data: {using: 'name', value: 'foo'},
245
- });
246
- await B.delay(400);
247
- const {value} = (
248
- await axios({
249
- url: createSessionURL(d.sessionId),
250
- })
251
- ).data;
252
- value.platformName.should.equal(defaultCaps.platformName);
253
- const resp = await endSession(newSession.sessionId);
254
- should.equal(resp, null);
255
-
256
- d.newCommandTimeoutMs = 60 * 1000;
257
- });
258
-
259
- it('should not timeout if its just the command taking awhile', async function () {
260
- let newSession = await startTimeoutSession(0.25);
261
- // XXX: race condition: we must build this URL before ...something happens...
262
- // which causes `d.sessionId` to be missing
263
- let sessionURL = createSessionURL(d.sessionId);
264
- await axios({
265
- url: createAppiumTestURL(d.sessionId, 'element'),
266
- method: POST,
267
- data: {using: 'name', value: 'foo'},
268
- });
269
- await B.delay(400);
270
- const {value} = (
271
- await axios({
272
- url: sessionURL,
273
- validateStatus: null,
274
- })
275
- ).data;
276
- value.error.should.equal('invalid session id');
277
- should.equal(d.sessionId, null);
278
- const resp = await endSession(newSession.sessionId);
279
- resp.error.should.equal('invalid session id');
280
- });
281
-
282
- it('should not have a timer running before or after a session', async function () {
283
- should.not.exist(d.noCommandTimer);
284
- let newSession = await startTimeoutSession(0.25);
285
- newSession.sessionId.should.equal(d.sessionId);
286
- should.exist(d.noCommandTimer);
287
- await endSession(newSession.sessionId);
288
- should.not.exist(d.noCommandTimer);
289
- });
290
- });
291
-
292
- describe('settings api', function () {
293
- before(function () {
294
- d.settings = new DeviceSettings({ignoreUnimportantViews: false});
295
- });
296
- it('should be able to get settings object', function () {
297
- d.settings.getSettings().ignoreUnimportantViews.should.be.false;
298
- });
299
- it('should not reject when `updateSettings` method is not provided', async function () {
300
- await d.settings.update({ignoreUnimportantViews: true}).should.not.be.rejected;
301
- });
302
- it('should reject for invalid update object', async function () {
303
- await d.settings.update('invalid json').should.eventually.be.rejectedWith('JSON');
304
- });
305
- });
306
-
307
- describe('unexpected exits', function () {
308
- it('should reject a current command when the driver crashes', async function () {
309
- d._oldGetStatus = d.getStatus;
310
- try {
311
- d.getStatus = async function () {
312
- await B.delay(5000);
313
- }.bind(d);
314
- const reqPromise = axios({
315
- url: createAppiumTestURL('', 'status'),
316
- validateStatus: null,
317
- });
318
- // make sure that the request gets to the server before our shutdown
319
- await B.delay(100);
320
- const shutdownEventPromise = new B((resolve, reject) => {
321
- setTimeout(
322
- () =>
323
- reject(
324
- new Error(
325
- 'onUnexpectedShutdown event is expected to be fired within 5 seconds timeout'
326
- )
327
- ),
328
- 5000
329
- );
330
- d.onUnexpectedShutdown(resolve);
331
- });
332
- d.startUnexpectedShutdown(new Error('Crashytimes'));
333
- const {value} = (await reqPromise).data;
334
- value.message.should.contain('Crashytimes');
335
- await shutdownEventPromise;
336
- } finally {
337
- d.getStatus = d._oldGetStatus;
338
- }
339
- });
340
- });
341
-
342
- describe('event timings', function () {
343
- it('should not add timings if not using opt-in cap', async function () {
344
- const session = await startSession(defaultCaps);
345
- const res = await getSession(session.sessionId);
346
- should.not.exist(res.events);
347
- await endSession(session.sessionId);
348
- });
349
- it('should add start session timings', async function () {
350
- const caps = Object.assign({}, defaultCaps, {
351
- 'appium:eventTimings': true,
352
- });
353
- const session = await startSession(caps);
354
- const res = await getSession(session.sessionId);
355
- should.exist(res.events);
356
- should.exist(res.events.newSessionRequested);
357
- should.exist(res.events.newSessionStarted);
358
- res.events.newSessionRequested[0].should.be.a('number');
359
- res.events.newSessionStarted[0].should.be.a('number');
360
- await endSession(session.sessionId);
361
- });
362
- });
363
-
364
- if (DriverClass === BaseDriver) {
365
- // only run this test on basedriver, not other drivers which also use these tests, since we
366
- // don't want them to try and start sessions with these random capabilities that are
367
- // necessary to test the appium options logic
368
- describe('special appium:options capability', function () {
369
- it('should be able to start a session with caps held in appium:options', async function () {
370
- const ret = await startSession({
371
- platformName: 'iOS',
372
- [PREFIXED_APPIUM_OPTS_CAP]: {
373
- platformVersion: '11.4',
374
- 'appium:deviceName': 'iPhone 11',
375
- },
376
- });
377
- d.opts.platformVersion.should.eql('11.4');
378
- d.opts.deviceName.should.eql('iPhone 11');
379
- await endSession(ret.sessionId);
380
- });
381
- });
382
- }
383
- });
384
- }
385
-
386
- export default baseDriverE2ETests;