@appium/base-driver 8.3.0 → 8.3.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.
- package/build/lib/basedriver/capabilities.js +2 -4
- package/build/lib/basedriver/commands/event.js +2 -4
- package/build/lib/basedriver/commands/find.js +2 -4
- package/build/lib/basedriver/commands/index.js +2 -4
- package/build/lib/basedriver/commands/log.js +2 -4
- package/build/lib/basedriver/commands/session.js +2 -4
- package/build/lib/basedriver/commands/settings.js +2 -4
- package/build/lib/basedriver/commands/timeout.js +2 -4
- package/build/lib/basedriver/desired-caps.js +2 -4
- package/build/lib/basedriver/device-settings.js +2 -4
- package/build/lib/basedriver/driver.js +17 -6
- package/build/lib/basedriver/helpers.js +2 -4
- package/build/lib/basedriver/logger.js +2 -4
- package/build/lib/constants.js +2 -4
- package/build/lib/express/crash.js +2 -4
- package/build/lib/express/express-logging.js +2 -4
- package/build/lib/express/idempotency.js +2 -4
- package/build/lib/express/logger.js +2 -4
- package/build/lib/express/middleware.js +2 -4
- package/build/lib/express/server.js +2 -4
- package/build/lib/express/static.js +2 -4
- package/build/lib/express/websocket.js +2 -4
- package/build/lib/helpers/capabilities.js +2 -4
- package/build/lib/index.js +2 -4
- package/build/lib/jsonwp-proxy/protocol-converter.js +2 -4
- package/build/lib/jsonwp-proxy/proxy.js +2 -4
- package/build/lib/jsonwp-status/status.js +2 -4
- package/build/lib/protocol/errors.js +2 -4
- package/build/lib/protocol/helpers.js +2 -4
- package/build/lib/protocol/index.js +2 -4
- package/build/lib/protocol/protocol.js +2 -4
- package/build/lib/protocol/routes.js +2 -4
- package/build/lib/protocol/validators.js +2 -4
- package/build/test/basedriver/README.md +5 -0
- package/build/test/basedriver/driver-e2e-tests.js +2 -4
- package/build/test/basedriver/driver-tests.js +2 -4
- package/build/test/basedriver/index.js +2 -4
- package/build/test/e2e/basedriver/driver.e2e.spec.js +15 -0
- package/build/test/e2e/basedriver/helpers.e2e.spec.js +192 -0
- package/build/test/e2e/basedriver/websockets.e2e.spec.js +82 -0
- package/build/test/e2e/express/server.e2e.spec.js +159 -0
- package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +59 -0
- package/build/test/e2e/protocol/fake-driver.js +163 -0
- package/build/test/e2e/protocol/helpers.js +25 -0
- package/build/test/e2e/protocol/protocol.e2e.spec.js +1186 -0
- package/build/test/helpers.js +2 -4
- package/build/test/unit/basedriver/capabilities.spec.js +672 -0
- package/build/test/unit/basedriver/capability.spec.js +353 -0
- package/build/test/unit/basedriver/commands/event.spec.js +110 -0
- package/build/test/unit/basedriver/commands/log.spec.js +85 -0
- package/build/test/unit/basedriver/driver.spec.js +15 -0
- package/build/test/unit/basedriver/helpers.spec.js +151 -0
- package/build/test/unit/basedriver/timeout.spec.js +135 -0
- package/build/test/unit/express/server.spec.js +155 -0
- package/build/test/unit/express/static.spec.js +26 -0
- package/build/test/unit/jsonwp-proxy/mock-request.js +91 -0
- package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +171 -0
- package/build/test/unit/jsonwp-proxy/proxy.spec.js +292 -0
- package/build/test/unit/jsonwp-proxy/url.spec.js +165 -0
- package/build/test/unit/jsonwp-status/status.spec.js +34 -0
- package/build/test/unit/protocol/errors.spec.js +390 -0
- package/build/test/unit/protocol/routes.spec.js +80 -0
- package/build/test/unit/protocol/validator.spec.js +149 -0
- package/lib/basedriver/driver.js +15 -4
- package/package.json +14 -9
- package/test/basedriver/README.md +5 -0
- package/test/basedriver/driver-e2e-tests.js +1 -1
- package/build/test/basedriver/capabilities-specs.js +0 -674
- package/build/test/basedriver/capability-specs.js +0 -355
- package/build/test/basedriver/commands/event-specs.js +0 -112
- package/build/test/basedriver/commands/log-specs.js +0 -87
- package/build/test/basedriver/driver-e2e-specs.js +0 -17
- package/build/test/basedriver/driver-specs.js +0 -17
- package/build/test/basedriver/helpers-e2e-specs.js +0 -194
- package/build/test/basedriver/helpers-specs.js +0 -153
- package/build/test/basedriver/timeout-specs.js +0 -137
- package/build/test/basedriver/websockets-e2e-specs.js +0 -84
- package/build/test/express/server-e2e-specs.js +0 -161
- package/build/test/express/server-specs.js +0 -157
- package/build/test/express/static-specs.js +0 -28
- package/build/test/jsonwp-proxy/mock-request.js +0 -93
- package/build/test/jsonwp-proxy/protocol-converter-specs.js +0 -173
- package/build/test/jsonwp-proxy/proxy-e2e-specs.js +0 -61
- package/build/test/jsonwp-proxy/proxy-specs.js +0 -294
- package/build/test/jsonwp-proxy/url-specs.js +0 -167
- package/build/test/jsonwp-status/status-specs.js +0 -36
- package/build/test/protocol/errors-specs.js +0 -388
- package/build/test/protocol/fake-driver.js +0 -165
- package/build/test/protocol/helpers.js +0 -27
- package/build/test/protocol/protocol-e2e-specs.js +0 -1188
- package/build/test/protocol/routes-specs.js +0 -82
- package/build/test/protocol/validator-specs.js +0 -151
- package/test/basedriver/capabilities-specs.js +0 -537
- package/test/basedriver/capability-specs.js +0 -383
- package/test/basedriver/commands/event-specs.js +0 -74
- package/test/basedriver/commands/log-specs.js +0 -79
- package/test/basedriver/driver-e2e-specs.js +0 -8
- package/test/basedriver/driver-specs.js +0 -8
- package/test/basedriver/fixtures/BadZippedApp.zip +0 -1
- package/test/basedriver/fixtures/FakeAndroidApp.apk +0 -1
- package/test/basedriver/fixtures/FakeAndroidApp.asd +0 -0
- package/test/basedriver/fixtures/FakeIOSApp.app +0 -1
- package/test/basedriver/fixtures/FakeIOSApp.app.zip +0 -0
- package/test/basedriver/fixtures/FakeIOSApp.ipa +0 -0
- package/test/basedriver/fixtures/custom-element-finder-bad.js +0 -5
- package/test/basedriver/fixtures/custom-element-finder.js +0 -29
- package/test/basedriver/helpers-e2e-specs.js +0 -187
- package/test/basedriver/helpers-specs.js +0 -137
- package/test/basedriver/timeout-specs.js +0 -128
- package/test/basedriver/websockets-e2e-specs.js +0 -75
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _lodash = _interopRequireDefault(require("lodash"));
|
|
8
|
-
|
|
9
|
-
var _constants = require("../../lib/constants");
|
|
10
|
-
|
|
11
|
-
var _protocolConverter = _interopRequireWildcard(require("../../lib/jsonwp-proxy/protocol-converter"));
|
|
12
|
-
|
|
13
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
14
|
-
|
|
15
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
16
|
-
|
|
17
|
-
const {
|
|
18
|
-
MJSONWP,
|
|
19
|
-
W3C
|
|
20
|
-
} = _constants.PROTOCOLS;
|
|
21
|
-
describe('Protocol Converter', function () {
|
|
22
|
-
describe('getTimeoutRequestObjects', function () {
|
|
23
|
-
let converter;
|
|
24
|
-
before(function () {
|
|
25
|
-
converter = new _protocolConverter.default(_lodash.default.noop);
|
|
26
|
-
});
|
|
27
|
-
it('should take W3C inputs and produce MJSONWP compatible objects', function () {
|
|
28
|
-
converter.downstreamProtocol = MJSONWP;
|
|
29
|
-
let timeoutObjects = converter.getTimeoutRequestObjects({
|
|
30
|
-
script: 100
|
|
31
|
-
});
|
|
32
|
-
timeoutObjects.length.should.equal(1);
|
|
33
|
-
timeoutObjects[0].should.eql({
|
|
34
|
-
type: 'script',
|
|
35
|
-
ms: 100
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
it('should ignore invalid entries while converting from W3C', function () {
|
|
39
|
-
converter.downstreamProtocol = MJSONWP;
|
|
40
|
-
let timeoutObjects = converter.getTimeoutRequestObjects({
|
|
41
|
-
script: 100,
|
|
42
|
-
sessionId: '5432a4f3-cd89-4781-8905-ea9d3150840c',
|
|
43
|
-
bar: -1,
|
|
44
|
-
baz: undefined
|
|
45
|
-
});
|
|
46
|
-
timeoutObjects.length.should.equal(1);
|
|
47
|
-
timeoutObjects[0].should.eql({
|
|
48
|
-
type: 'script',
|
|
49
|
-
ms: 100
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
it('should take multiple W3C timeouts and produce multiple MJSONWP compatible objects', function () {
|
|
53
|
-
converter.downstreamProtocol = MJSONWP;
|
|
54
|
-
let [scriptTimeout, pageLoadTimeout, implicitTimeout] = converter.getTimeoutRequestObjects({
|
|
55
|
-
script: 100,
|
|
56
|
-
pageLoad: 200,
|
|
57
|
-
implicit: 300
|
|
58
|
-
});
|
|
59
|
-
scriptTimeout.should.eql({
|
|
60
|
-
type: 'script',
|
|
61
|
-
ms: 100
|
|
62
|
-
});
|
|
63
|
-
pageLoadTimeout.should.eql({
|
|
64
|
-
type: 'page load',
|
|
65
|
-
ms: 200
|
|
66
|
-
});
|
|
67
|
-
implicitTimeout.should.eql({
|
|
68
|
-
type: 'implicit',
|
|
69
|
-
ms: 300
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
it('should take MJSONWP input and produce W3C compatible object', function () {
|
|
73
|
-
converter.downstreamProtocol = W3C;
|
|
74
|
-
let timeoutObjects = converter.getTimeoutRequestObjects({
|
|
75
|
-
type: 'implicit',
|
|
76
|
-
ms: 300
|
|
77
|
-
});
|
|
78
|
-
timeoutObjects.length.should.equal(1);
|
|
79
|
-
timeoutObjects[0].should.eql({
|
|
80
|
-
implicit: 300
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
it('should not change the input if protocol name is unknown', function () {
|
|
84
|
-
converter.downstreamProtocol = null;
|
|
85
|
-
let timeoutObjects = converter.getTimeoutRequestObjects({
|
|
86
|
-
type: 'implicit',
|
|
87
|
-
ms: 300
|
|
88
|
-
});
|
|
89
|
-
timeoutObjects.length.should.equal(1);
|
|
90
|
-
timeoutObjects[0].should.eql({
|
|
91
|
-
type: 'implicit',
|
|
92
|
-
ms: 300
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
it('should not change the input if protocol name is unchanged', function () {
|
|
96
|
-
converter.downstreamProtocol = MJSONWP;
|
|
97
|
-
let timeoutObjects = converter.getTimeoutRequestObjects({
|
|
98
|
-
type: 'implicit',
|
|
99
|
-
ms: 300
|
|
100
|
-
});
|
|
101
|
-
timeoutObjects.length.should.equal(1);
|
|
102
|
-
timeoutObjects[0].should.eql({
|
|
103
|
-
type: 'implicit',
|
|
104
|
-
ms: 300
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
describe('setValue', function () {
|
|
109
|
-
let converter;
|
|
110
|
-
let responseBody;
|
|
111
|
-
before(function () {
|
|
112
|
-
responseBody = null;
|
|
113
|
-
converter = new _protocolConverter.default((url, method, body) => {
|
|
114
|
-
responseBody = body;
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
beforeEach(function () {
|
|
118
|
-
responseBody = {};
|
|
119
|
-
});
|
|
120
|
-
it('should calculate value if not present', async function () {
|
|
121
|
-
await converter.proxySetValue('', '', {
|
|
122
|
-
text: 'bla'
|
|
123
|
-
});
|
|
124
|
-
responseBody.should.eql({
|
|
125
|
-
text: 'bla',
|
|
126
|
-
value: ['b', 'l', 'a']
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
it('should calculate text if not present', async function () {
|
|
130
|
-
await converter.proxySetValue('', '', {
|
|
131
|
-
value: ['b', 'l', 'a']
|
|
132
|
-
});
|
|
133
|
-
responseBody.should.eql({
|
|
134
|
-
text: 'bla',
|
|
135
|
-
value: ['b', 'l', 'a']
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
it('should keep the response body unchanged if both value and text are present', async function () {
|
|
139
|
-
await converter.proxySetValue('', '', {
|
|
140
|
-
text: 'bla',
|
|
141
|
-
value: ['b', 'l', 'a']
|
|
142
|
-
});
|
|
143
|
-
responseBody.should.eql({
|
|
144
|
-
text: 'bla',
|
|
145
|
-
value: ['b', 'l', 'a']
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
describe('getProperty', function () {
|
|
150
|
-
let jsonwpConverter, w3cConverter;
|
|
151
|
-
before(function () {
|
|
152
|
-
for (let command of _protocolConverter.COMMAND_URLS_CONFLICTS) {
|
|
153
|
-
if (command.commandNames.includes('getProperty')) {
|
|
154
|
-
jsonwpConverter = command.jsonwpConverter;
|
|
155
|
-
w3cConverter = command.w3cConverter;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
it('should convert "property/value" to "attribute/value"', function () {
|
|
160
|
-
jsonwpConverter('/session/123/element/456/property/value').should.equal('/session/123/element/456/attribute/value');
|
|
161
|
-
});
|
|
162
|
-
it('should convert "property/:somePropName" to "attribute/:somePropName"', function () {
|
|
163
|
-
jsonwpConverter('/session/123/element/456/property/somePropName').should.equal('/session/123/element/456/attribute/somePropName');
|
|
164
|
-
});
|
|
165
|
-
it('should not convert from JSONWP to W3C', function () {
|
|
166
|
-
w3cConverter('/session/123/element/456/attribute/someAttr').should.equal('/session/123/element/456/attribute/someAttr');
|
|
167
|
-
w3cConverter('/session/123/element/456/property/someProp').should.equal('/session/123/element/456/property/someProp');
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
});require('source-map-support').install();
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvanNvbndwLXByb3h5L3Byb3RvY29sLWNvbnZlcnRlci1zcGVjcy5qcyJdLCJuYW1lcyI6WyJNSlNPTldQIiwiVzNDIiwiUFJPVE9DT0xTIiwiZGVzY3JpYmUiLCJjb252ZXJ0ZXIiLCJiZWZvcmUiLCJQcm90b2NvbENvbnZlcnRlciIsIl8iLCJub29wIiwiaXQiLCJkb3duc3RyZWFtUHJvdG9jb2wiLCJ0aW1lb3V0T2JqZWN0cyIsImdldFRpbWVvdXRSZXF1ZXN0T2JqZWN0cyIsInNjcmlwdCIsImxlbmd0aCIsInNob3VsZCIsImVxdWFsIiwiZXFsIiwidHlwZSIsIm1zIiwic2Vzc2lvbklkIiwiYmFyIiwiYmF6IiwidW5kZWZpbmVkIiwic2NyaXB0VGltZW91dCIsInBhZ2VMb2FkVGltZW91dCIsImltcGxpY2l0VGltZW91dCIsInBhZ2VMb2FkIiwiaW1wbGljaXQiLCJyZXNwb25zZUJvZHkiLCJ1cmwiLCJtZXRob2QiLCJib2R5IiwiYmVmb3JlRWFjaCIsInByb3h5U2V0VmFsdWUiLCJ0ZXh0IiwidmFsdWUiLCJqc29ud3BDb252ZXJ0ZXIiLCJ3M2NDb252ZXJ0ZXIiLCJjb21tYW5kIiwiQ09NTUFORF9VUkxTX0NPTkZMSUNUUyIsImNvbW1hbmROYW1lcyIsImluY2x1ZGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsTUFBTTtBQUFDQSxFQUFBQSxPQUFEO0FBQVVDLEVBQUFBO0FBQVYsSUFBaUJDLG9CQUF2QjtBQUdBQyxRQUFRLENBQUMsb0JBQUQsRUFBdUIsWUFBWTtBQUN6Q0EsRUFBQUEsUUFBUSxDQUFDLDBCQUFELEVBQTZCLFlBQVk7QUFDL0MsUUFBSUMsU0FBSjtBQUNBQyxJQUFBQSxNQUFNLENBQUMsWUFBWTtBQUNqQkQsTUFBQUEsU0FBUyxHQUFHLElBQUlFLDBCQUFKLENBQXNCQyxnQkFBRUMsSUFBeEIsQ0FBWjtBQUNELEtBRkssQ0FBTjtBQUdBQyxJQUFBQSxFQUFFLENBQUMsK0RBQUQs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aURBQS9FO0FBQ0QsS0FGQyxDQUFGO0FBR0FQLElBQUFBLEVBQUUsQ0FBQyx1Q0FBRCxFQUEwQyxZQUFZO0FBQ3RENkIsTUFBQUEsWUFBWSxDQUFDLDZDQUFELENBQVosQ0FBNER2QixNQUE1RCxDQUFtRUMsS0FBbkUsQ0FBeUUsNkNBQXpFO0FBQ0FzQixNQUFBQSxZQUFZLENBQUMsNENBQUQsQ0FBWixDQUEyRHZCLE1BQTNELENBQWtFQyxLQUFsRSxDQUF3RSw0Q0FBeEU7QUFDRCxLQUhDLENBQUY7QUFJRCxHQXBCTyxDQUFSO0FBcUJELENBMUhPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUFJPVE9DT0xTIH0gZnJvbSAnLi4vLi4vbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgUHJvdG9jb2xDb252ZXJ0ZXIsIHtDT01NQU5EX1VSTFNfQ09ORkxJQ1RTfSBmcm9tICcuLi8uLi9saWIvanNvbndwLXByb3h5L3Byb3RvY29sLWNvbnZlcnRlcic7XG5cbmNvbnN0IHtNSlNPTldQLCBXM0N9ID0gUFJPVE9DT0xTO1xuXG5cbmRlc2NyaWJlKCdQcm90b2NvbCBDb252ZXJ0ZXInLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdnZXRUaW1lb3V0UmVxdWVzdE9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGNvbnZlcnRlcjtcbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgY29udmVydGVyID0gbmV3IFByb3RvY29sQ29udmVydGVyKF8ubm9vcCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0YWtlIFczQyBpbnB1dHMgYW5kIHByb2R1Y2UgTUpTT05XUCBjb21wYXRpYmxlIG9iamVjdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb252ZXJ0ZXIuZG93bnN0cmVhbVByb3RvY29sID0gTUpTT05XUDtcbiAgICAgIGxldCB0aW1lb3V0T2JqZWN0cyA9IGNvbnZlcnRlci5nZXRUaW1lb3V0UmVxdWVzdE9iamVjdHMoe3NjcmlwdDogMTAwfSk7XG4gICAgICB0aW1lb3V0T2JqZWN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdGltZW91dE9iamVjdHNbMF0uc2hvdWxkLmVxbCh7dHlwZTogJ3NjcmlwdCcsIG1zOiAxMDB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGlnbm9yZSBpbnZhbGlkIGVudHJpZXMgd2hpbGUgY29udmVydGluZyBmcm9tIFczQycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnZlcnRlci5kb3duc3RyZWFtUHJvdG9jb2wgPSBNSlNPTldQO1xuICAgICAgbGV0IHRpbWVvdXRPYmplY3RzID0gY29udmVydGVyLmdldFRpbWVvdXRSZXF1ZXN0T2JqZWN0cyh7XG4gICAgICAgIHNjcmlwdDogMTAwLFxuICAgICAgICBzZXNzaW9uSWQ6ICc1NDMyYTRmMy1jZDg5LTQ3ODEtODkwNS1lYTlkMzE1MDg0MGMnLFxuICAgICAgICBiYXI6IC0xLFxuICAgICAgICBiYXo6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgdGltZW91dE9iamVjdHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHRpbWVvdXRPYmplY3RzWzBdLnNob3VsZC5lcWwoe3R5cGU6ICdzY3JpcHQnLCBtczogMTAwfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0YWtlIG11bHRpcGxlIFczQyB0aW1lb3V0cyBhbmQgcHJvZHVjZSBtdWx0aXBsZSBNSlNPTldQIGNvbXBhdGlibGUgb2JqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnZlcnRlci5kb3duc3RyZWFtUHJvdG9jb2wgPSBNSlNPTldQO1xuICAgICAgbGV0IFtzY3JpcHRUaW1lb3V0LCBwYWdlTG9hZFRpbWVvdXQsIGltcGxpY2l0VGltZW91dF0gPSBjb252ZXJ0ZXIuZ2V0VGltZW91dFJlcXVlc3RPYmplY3RzKHtzY3JpcHQ6IDEwMCwgcGFnZUxvYWQ6IDIwMCwgaW1wbGljaXQ6IDMwMH0pO1xuICAgICAgc2NyaXB0VGltZW91dC5zaG91bGQuZXFsKHtcbiAgICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICAgIG1zOiAxMDAsXG4gICAgICB9KTtcbiAgICAgIHBhZ2VMb2FkVGltZW91dC5zaG91bGQuZXFsKHtcbiAgICAgICAgdHlwZTogJ3BhZ2UgbG9hZCcsXG4gICAgICAgIG1zOiAyMDAsXG4gICAgICB9KTtcbiAgICAgIGltcGxpY2l0VGltZW91dC5zaG91bGQuZXFsKHtcbiAgICAgICAgdHlwZTogJ2ltcGxpY2l0JyxcbiAgICAgICAgbXM6IDMwMCxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGFrZSBNSlNPTldQIGlucHV0IGFuZCBwcm9kdWNlIFczQyBjb21wYXRpYmxlIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnZlcnRlci5kb3duc3RyZWFtUHJvdG9jb2wgPSBXM0M7XG4gICAgICBsZXQgdGltZW91dE9iamVjdHMgPSBjb252ZXJ0ZXIuZ2V0VGltZW91dFJlcXVlc3RPYmplY3RzKHt0eXBlOiAnaW1wbGljaXQnLCBtczogMzAwfSk7XG4gICAgICB0aW1lb3V0T2JqZWN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdGltZW91dE9iamVjdHNbMF0uc2hvdWxkLmVxbCh7aW1wbGljaXQ6IDMwMH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbm90IGNoYW5nZSB0aGUgaW5wdXQgaWYgcHJvdG9jb2wgbmFtZSBpcyB1bmtub3duJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29udmVydGVyLmRvd25zdHJlYW1Qcm90b2NvbCA9IG51bGw7XG4gICAgICBsZXQgdGltZW91dE9iamVjdHMgPSBjb252ZXJ0ZXIuZ2V0VGltZW91dFJlcXVlc3RPYmplY3RzKHt0eXBlOiAnaW1wbGljaXQnLCBtczogMzAwfSk7XG4gICAgICB0aW1lb3V0T2JqZWN0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdGltZW91dE9iamVjdHNbMF0uc2hvdWxkLmVxbCh7dHlwZTogJ2ltcGxpY2l0JywgbXM6IDMwMH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbm90IGNoYW5nZSB0aGUgaW5wdXQgaWYgcHJvdG9jb2wgbmFtZSBpcyB1bmNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb252ZXJ0ZXIuZG93bnN0cmVhbVByb3RvY29sID0gTUpTT05XUDtcbiAgICAgIGxldCB0aW1lb3V0T2JqZWN0cyA9IGNvbnZlcnRlci5nZXRUaW1lb3V0UmVxdWVzdE9iamVjdHMoe3R5cGU6ICdpbXBsaWNpdCcsIG1zOiAzMDB9KTtcbiAgICAgIHRpbWVvdXRPYmplY3RzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICB0aW1lb3V0T2JqZWN0c1swXS5zaG91bGQuZXFsKHt0eXBlOiAnaW1wbGljaXQnLCBtczogMzAwfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzZXRWYWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgY29udmVydGVyO1xuICAgIGxldCByZXNwb25zZUJvZHk7XG4gICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc3BvbnNlQm9keSA9IG51bGw7XG4gICAgICBjb252ZXJ0ZXIgPSBuZXcgUHJvdG9jb2xDb252ZXJ0ZXIoKHVybCwgbWV0aG9kLCBib2R5KSA9PiB7XG4gICAgICAgIHJlc3BvbnNlQm9keSA9IGJvZHk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc3BvbnNlQm9keSA9IHt9O1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgdmFsdWUgaWYgbm90IHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb252ZXJ0ZXIucHJveHlTZXRWYWx1ZSgnJywgJycsIHtcbiAgICAgICAgdGV4dDogJ2JsYScsXG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlQm9keS5zaG91bGQuZXFsKHtcbiAgICAgICAgdGV4dDogJ2JsYScsXG4gICAgICAgIHZhbHVlOiBbJ2InLCAnbCcsICdhJ10sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSB0ZXh0IGlmIG5vdCBwcmVzZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgY29udmVydGVyLnByb3h5U2V0VmFsdWUoJycsICcnLCB7XG4gICAgICAgIHZhbHVlOiBbJ2InLCAnbCcsICdhJ10sXG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlQm9keS5zaG91bGQuZXFsKHtcbiAgICAgICAgdGV4dDogJ2JsYScsXG4gICAgICAgIHZhbHVlOiBbJ2InLCAnbCcsICdhJ10sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGtlZXAgdGhlIHJlc3BvbnNlIGJvZHkgdW5jaGFuZ2VkIGlmIGJvdGggdmFsdWUgYW5kIHRleHQgYXJlIHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBjb252ZXJ0ZXIucHJveHlTZXRWYWx1ZSgnJywgJycsIHtcbiAgICAgICAgdGV4dDogJ2JsYScsXG4gICAgICAgIHZhbHVlOiBbJ2InLCAnbCcsICdhJ10sXG4gICAgICB9KTtcbiAgICAgIHJlc3BvbnNlQm9keS5zaG91bGQuZXFsKHtcbiAgICAgICAgdGV4dDogJ2JsYScsXG4gICAgICAgIHZhbHVlOiBbJ2InLCAnbCcsICdhJ10sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdnZXRQcm9wZXJ0eScsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQganNvbndwQ29udmVydGVyLCB3M2NDb252ZXJ0ZXI7XG4gICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAobGV0IGNvbW1hbmQgb2YgQ09NTUFORF9VUkxTX0NPTkZMSUNUUykge1xuICAgICAgICBpZiAoY29tbWFuZC5jb21tYW5kTmFtZXMuaW5jbHVkZXMoJ2dldFByb3BlcnR5JykpIHtcbiAgICAgICAgICBqc29ud3BDb252ZXJ0ZXIgPSBjb21tYW5kLmpzb253cENvbnZlcnRlcjtcbiAgICAgICAgICB3M2NDb252ZXJ0ZXIgPSBjb21tYW5kLnczY0NvbnZlcnRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgY29udmVydCBcInByb3BlcnR5L3ZhbHVlXCIgdG8gXCJhdHRyaWJ1dGUvdmFsdWVcIicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGpzb253cENvbnZlcnRlcignL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L3Byb3BlcnR5L3ZhbHVlJykuc2hvdWxkLmVxdWFsKCcvc2Vzc2lvbi8xMjMvZWxlbWVudC80NTYvYXR0cmlidXRlL3ZhbHVlJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IFwicHJvcGVydHkvOnNvbWVQcm9wTmFtZVwiIHRvIFwiYXR0cmlidXRlLzpzb21lUHJvcE5hbWVcIicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGpzb253cENvbnZlcnRlcignL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L3Byb3BlcnR5L3NvbWVQcm9wTmFtZScpLnNob3VsZC5lcXVhbCgnL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L2F0dHJpYnV0ZS9zb21lUHJvcE5hbWUnKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBjb252ZXJ0IGZyb20gSlNPTldQIHRvIFczQycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHczY0NvbnZlcnRlcignL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L2F0dHJpYnV0ZS9zb21lQXR0cicpLnNob3VsZC5lcXVhbCgnL3Nlc3Npb24vMTIzL2VsZW1lbnQvNDU2L2F0dHJpYnV0ZS9zb21lQXR0cicpO1xuICAgICAgdzNjQ29udmVydGVyKCcvc2Vzc2lvbi8xMjMvZWxlbWVudC80NTYvcHJvcGVydHkvc29tZVByb3AnKS5zaG91bGQuZXF1YWwoJy9zZXNzaW9uLzEyMy9lbGVtZW50LzQ1Ni9wcm9wZXJ0eS9zb21lUHJvcCcpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2pzb253cC1wcm94eS9wcm90b2NvbC1jb252ZXJ0ZXItc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
require("source-map-support/register");
|
|
4
|
-
|
|
5
|
-
var _lib = require("../../lib");
|
|
6
|
-
|
|
7
|
-
var _fakeDriver = require("../protocol/fake-driver");
|
|
8
|
-
|
|
9
|
-
describe('proxy', function () {
|
|
10
|
-
const jwproxy = new _lib.JWProxy();
|
|
11
|
-
let baseServer;
|
|
12
|
-
before(async function () {
|
|
13
|
-
baseServer = await (0, _lib.server)({
|
|
14
|
-
routeConfiguringFunction: (0, _lib.routeConfiguringFunction)(new _fakeDriver.FakeDriver()),
|
|
15
|
-
port: 4444
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
after(async function () {
|
|
19
|
-
await baseServer.close();
|
|
20
|
-
});
|
|
21
|
-
it('should proxy status straight', async function () {
|
|
22
|
-
let [res, resBody] = await jwproxy.proxy('/status', 'GET');
|
|
23
|
-
res.statusCode.should.equal(200);
|
|
24
|
-
resBody.value.should.equal(`I'm fine`);
|
|
25
|
-
});
|
|
26
|
-
it('should proxy status as command', async function () {
|
|
27
|
-
const res = await jwproxy.command('/status', 'GET');
|
|
28
|
-
res.should.eql(`I'm fine`);
|
|
29
|
-
});
|
|
30
|
-
describe('new session', function () {
|
|
31
|
-
afterEach(async function () {
|
|
32
|
-
await jwproxy.command('', 'DELETE');
|
|
33
|
-
});
|
|
34
|
-
it('should start a new session', async function () {
|
|
35
|
-
const caps = {
|
|
36
|
-
browserName: 'fake'
|
|
37
|
-
};
|
|
38
|
-
const res = await jwproxy.command('/session', 'POST', {
|
|
39
|
-
capabilities: {
|
|
40
|
-
alwaysMatch: caps
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
res.capabilities.alwaysMatch.should.have.property('browserName');
|
|
44
|
-
jwproxy.sessionId.should.have.length(48);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
describe('delete session', function () {
|
|
48
|
-
beforeEach(async function () {
|
|
49
|
-
await jwproxy.command('/session', 'POST', {
|
|
50
|
-
desiredCapabilities: {}
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
it('should quit a session', async function () {
|
|
54
|
-
const res = await jwproxy.command('', 'DELETE');
|
|
55
|
-
should.not.exist(res);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
});require('source-map-support').install();
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvanNvbndwLXByb3h5L3Byb3h5LWUyZS1zcGVjcy5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImp3cHJveHkiLCJKV1Byb3h5IiwiYmFzZVNlcnZlciIsImJlZm9yZSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsIkZha2VEcml2ZXIiLCJwb3J0IiwiYWZ0ZXIiLCJjbG9zZSIsIml0IiwicmVzIiwicmVzQm9keSIsInByb3h5Iiwic3RhdHVzQ29kZSIsInNob3VsZCIsImVxdWFsIiwidmFsdWUiLCJjb21tYW5kIiwiZXFsIiwiYWZ0ZXJFYWNoIiwiY2FwcyIsImJyb3dzZXJOYW1lIiwiY2FwYWJpbGl0aWVzIiwiYWx3YXlzTWF0Y2giLCJoYXZlIiwicHJvcGVydHkiLCJzZXNzaW9uSWQiLCJsZW5ndGgiLCJiZWZvcmVFYWNoIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsIm5vdCIsImV4aXN0Il0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7O0FBQ0E7O0FBRUFBLFFBQVEsQ0FBQyxPQUFELEVBQVUsWUFBWTtBQUM1QixRQUFNQyxPQUFPLEdBQUcsSUFBSUMsWUFBSixFQUFoQjtBQUNBLE1BQUlDLFVBQUo7QUFDQUMsRUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QkQsSUFBQUEsVUFBVSxHQUFHLE1BQU0saUJBQU87QUFDeEJFLE1BQUFBLHdCQUF3QixFQUFFLG1DQUF5QixJQUFJQyxzQkFBSixFQUF6QixDQURGO0FBRXhCQyxNQUFBQSxJQUFJLEVBQUU7QUFGa0IsS0FBUCxDQUFuQjtBQUlELEdBTEssQ0FBTjtBQU1BQyxFQUFBQSxLQUFLLENBQUMsa0JBQWtCO0FBQ3RCLFVBQU1MLFVBQVUsQ0FBQ00sS0FBWCxFQUFOO0FBQ0QsR0FGSSxDQUFMO0FBSUFDLEVBQUFBLEVBQUUsQ0FBQyw4QkFBRCxFQUFpQyxrQkFBa0I7QUFDbkQsUUFBSSxDQUFDQyxHQUFELEVBQU1DLE9BQU4sSUFBaUIsTUFBTVgsT0FBTyxDQUFDWSxLQUFSLENBQWMsU0FBZCxFQUF5QixLQUF6QixDQUEzQjtBQUNBRixJQUFBQSxHQUFHLENBQUNHLFVBQUosQ0FBZUMsTUFBZixDQUFzQkMsS0FBdEIsQ0FBNEIsR0FBNUI7QUFDQUosSUFBQUEsT0FBTyxDQUFDSyxLQUFSLENBQWNGLE1BQWQsQ0FBcUJDLEtBQXJCLENBQTRCLFVBQTVCO0FBQ0QsR0FKQyxDQUFGO0FBS0FOLEVBQUFBLEVBQUUsQ0FBQyxnQ0FBRCxFQUFtQyxrQkFBa0I7QUFDckQsVUFBTUMsR0FBRyxHQUFHLE1BQU1WLE9BQU8sQ0FBQ2lCLE9BQVIsQ0FBZ0IsU0FBaEIsRUFBMkIsS0FBM0IsQ0FBbEI7QUFDQVAsSUFBQUEsR0FBRyxDQUFDSSxNQUFKLENBQVdJLEdBQVgsQ0FBZ0IsVUFBaEI7QUFDRCxHQUhDLENBQUY7QUFJQW5CLEVBQUFBLFFBQVEsQ0FBQyxhQUFELEVBQWdCLFlBQVk7QUFDbENvQixJQUFBQSxTQUFTLENBQUMsa0JBQWtCO0FBQzFCLFlBQU1uQixPQUFPLENBQUNpQixPQUFSLENBQWdCLEVBQWhCLEVBQW9CLFFBQXBCLENBQU47QUFDRCxLQUZRLENBQVQ7QUFHQVIsSUFBQUEsRUFBRSxDQUFDLDRCQUFELEVBQStCLGtCQUFrQjtBQUNqRCxZQUFNVyxJQUFJLEdBQUc7QUFBQ0MsUUFBQUEsV0FBVyxFQUFFO0FBQWQsT0FBYjtBQUNBLFlBQU1YLEdBQUcsR0FBRyxNQUFNVixPQUFPLENBQUNpQixPQUFSLENBQWdCLFVBQWhCLEVBQTRCLE1BQTVCLEVBQW9DO0FBQUNLLFFBQUFBLFlBQVksRUFBRTtBQUFDQyxVQUFBQSxXQUFXLEVBQUVIO0FBQWQ7QUFBZixPQUFwQyxDQUFsQjtBQUNBVixNQUFBQSxHQUFHLENBQUNZLFlBQUosQ0FBaUJDLFdBQWpCLENBQTZCVCxNQUE3QixDQUFvQ1UsSUFBcEMsQ0FBeUNDLFFBQXpDLENBQWtELGFBQWxEO0FBQ0F6QixNQUFBQSxPQUFPLENBQUMwQixTQUFSLENBQWtCWixNQUFsQixDQUF5QlUsSUFBekIsQ0FBOEJHLE1BQTlCLENBQXFDLEVBQXJDO0FBQ0QsS0FMQyxDQUFGO0FBTUQsR0FWTyxDQUFSO0FBV0E1QixFQUFBQSxRQUFRLENBQUMsZ0JBQUQsRUFBbUIsWUFBWTtBQUNyQzZCLElBQUFBLFVBQVUsQ0FBQyxrQkFBa0I7QUFDM0IsWUFBTTVCLE9BQU8sQ0FBQ2lCLE9BQVIsQ0FBZ0IsVUFBaEIsRUFBNEIsTUFBNUIsRUFBb0M7QUFBQ1ksUUFBQUEsbUJBQW1CLEVBQUU7QUFBdEIsT0FBcEMsQ0FBTjtBQUNELEtBRlMsQ0FBVjtBQUdBcEIsSUFBQUEsRUFBRSxDQUFDLHVCQUFELEVBQTBCLGtCQUFrQjtBQUM1QyxZQUFNQyxHQUFHLEdBQUcsTUFBTVYsT0FBTyxDQUFDaUIsT0FBUixDQUFnQixFQUFoQixFQUFvQixRQUFwQixDQUFsQjtBQUNBSCxNQUFBQSxNQUFNLENBQUNnQixHQUFQLENBQVdDLEtBQVgsQ0FBaUJyQixHQUFqQjtBQUNELEtBSEMsQ0FBRjtBQUlELEdBUk8sQ0FBUjtBQVNELENBMUNPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKV1Byb3h5LCBzZXJ2ZXIsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgeyBGYWtlRHJpdmVyIH0gZnJvbSAnLi4vcHJvdG9jb2wvZmFrZS1kcml2ZXInO1xuXG5kZXNjcmliZSgncHJveHknLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGp3cHJveHkgPSBuZXcgSldQcm94eSgpO1xuICBsZXQgYmFzZVNlcnZlcjtcbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBiYXNlU2VydmVyID0gYXdhaXQgc2VydmVyKHtcbiAgICAgIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbjogcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uKG5ldyBGYWtlRHJpdmVyKCkpLFxuICAgICAgcG9ydDogNDQ0NCxcbiAgICB9KTtcbiAgfSk7XG4gIGFmdGVyKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBiYXNlU2VydmVyLmNsb3NlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcHJveHkgc3RhdHVzIHN0cmFpZ2h0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGxldCBbcmVzLCByZXNCb2R5XSA9IGF3YWl0IGp3cHJveHkucHJveHkoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgcmVzLnN0YXR1c0NvZGUuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgcmVzQm9keS52YWx1ZS5zaG91bGQuZXF1YWwoYEknbSBmaW5lYCk7XG4gIH0pO1xuICBpdCgnc2hvdWxkIHByb3h5IHN0YXR1cyBhcyBjb21tYW5kJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGp3cHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICByZXMuc2hvdWxkLmVxbChgSSdtIGZpbmVgKTtcbiAgfSk7XG4gIGRlc2NyaWJlKCduZXcgc2Vzc2lvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBhZnRlckVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgandwcm94eS5jb21tYW5kKCcnLCAnREVMRVRFJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzdGFydCBhIG5ldyBzZXNzaW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY2FwcyA9IHticm93c2VyTmFtZTogJ2Zha2UnfTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGp3cHJveHkuY29tbWFuZCgnL3Nlc3Npb24nLCAnUE9TVCcsIHtjYXBhYmlsaXRpZXM6IHthbHdheXNNYXRjaDogY2Fwc319KTtcbiAgICAgIHJlcy5jYXBhYmlsaXRpZXMuYWx3YXlzTWF0Y2guc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Jyb3dzZXJOYW1lJyk7XG4gICAgICBqd3Byb3h5LnNlc3Npb25JZC5zaG91bGQuaGF2ZS5sZW5ndGgoNDgpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ2RlbGV0ZSBzZXNzaW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgandwcm94eS5jb21tYW5kKCcvc2Vzc2lvbicsICdQT1NUJywge2Rlc2lyZWRDYXBhYmlsaXRpZXM6IHt9fSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBxdWl0IGEgc2Vzc2lvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGp3cHJveHkuY29tbWFuZCgnJywgJ0RFTEVURScpO1xuICAgICAgc2hvdWxkLm5vdC5leGlzdChyZXMpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2pzb253cC1wcm94eS9wcm94eS1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
require("source-map-support/register");
|
|
6
|
-
|
|
7
|
-
var _lib = require("../../lib");
|
|
8
|
-
|
|
9
|
-
var _mockRequest = _interopRequireDefault(require("./mock-request"));
|
|
10
|
-
|
|
11
|
-
var _errors = require("../../lib/protocol/errors");
|
|
12
|
-
|
|
13
|
-
var _helpers = require("../helpers");
|
|
14
|
-
|
|
15
|
-
function buildReqRes(url, method, body) {
|
|
16
|
-
let req = {
|
|
17
|
-
originalUrl: url,
|
|
18
|
-
method,
|
|
19
|
-
body
|
|
20
|
-
};
|
|
21
|
-
let res = {};
|
|
22
|
-
res.headers = {};
|
|
23
|
-
|
|
24
|
-
res.set = (k, v) => {
|
|
25
|
-
res[k] = v;
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
res.status = code => {
|
|
29
|
-
res.sentCode = code;
|
|
30
|
-
return res;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
res.send = body => {
|
|
34
|
-
try {
|
|
35
|
-
body = JSON.parse(body);
|
|
36
|
-
} catch (e) {}
|
|
37
|
-
|
|
38
|
-
res.sentBody = body;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
return [req, res];
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
describe('proxy', function () {
|
|
45
|
-
let port;
|
|
46
|
-
|
|
47
|
-
function mockProxy(opts = {}) {
|
|
48
|
-
opts = {
|
|
49
|
-
server: _helpers.TEST_HOST,
|
|
50
|
-
port,
|
|
51
|
-
...opts
|
|
52
|
-
};
|
|
53
|
-
let proxy = new _lib.JWProxy(opts);
|
|
54
|
-
|
|
55
|
-
proxy.request = async function (...args) {
|
|
56
|
-
return await (0, _mockRequest.default)(...args);
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
return proxy;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
before(async function () {
|
|
63
|
-
port = await (0, _helpers.getTestPort)();
|
|
64
|
-
});
|
|
65
|
-
it('should override default params', function () {
|
|
66
|
-
let j = mockProxy({
|
|
67
|
-
server: '127.0.0.2',
|
|
68
|
-
port
|
|
69
|
-
});
|
|
70
|
-
j.server.should.equal('127.0.0.2');
|
|
71
|
-
j.port.should.equal(port);
|
|
72
|
-
});
|
|
73
|
-
it('should save session id on session creation', async function () {
|
|
74
|
-
let j = mockProxy();
|
|
75
|
-
let [res, body] = await j.proxy('/session', 'POST', {
|
|
76
|
-
desiredCapabilities: {}
|
|
77
|
-
});
|
|
78
|
-
res.statusCode.should.equal(200);
|
|
79
|
-
body.should.eql({
|
|
80
|
-
status: 0,
|
|
81
|
-
sessionId: '123',
|
|
82
|
-
value: {
|
|
83
|
-
browserName: 'boo'
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
j.sessionId.should.equal('123');
|
|
87
|
-
});
|
|
88
|
-
describe('getUrlForProxy', function () {
|
|
89
|
-
it('should modify session id, host, and port', function () {
|
|
90
|
-
let j = mockProxy({
|
|
91
|
-
sessionId: '123'
|
|
92
|
-
});
|
|
93
|
-
j.getUrlForProxy('http://host.com:1234/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
|
|
94
|
-
});
|
|
95
|
-
it('should prepend scheme, host and port if not provided', function () {
|
|
96
|
-
let j = mockProxy({
|
|
97
|
-
sessionId: '123'
|
|
98
|
-
});
|
|
99
|
-
j.getUrlForProxy('/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
|
|
100
|
-
});
|
|
101
|
-
it('should respect nonstandard incoming request base path', function () {
|
|
102
|
-
let j = mockProxy({
|
|
103
|
-
sessionId: '123',
|
|
104
|
-
reqBasePath: ''
|
|
105
|
-
});
|
|
106
|
-
j.getUrlForProxy('/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
|
|
107
|
-
j = mockProxy({
|
|
108
|
-
sessionId: '123',
|
|
109
|
-
reqBasePath: '/my/base/path'
|
|
110
|
-
});
|
|
111
|
-
j.getUrlForProxy('/my/base/path/session/456/element/200/value').should.eql(`http://${_helpers.TEST_HOST}:${port}/session/123/element/200/value`);
|
|
112
|
-
});
|
|
113
|
-
it('should work with urls which do not have session ids', function () {
|
|
114
|
-
let j = mockProxy({
|
|
115
|
-
sessionId: '123'
|
|
116
|
-
});
|
|
117
|
-
j.getUrlForProxy('http://host.com:1234/session').should.eql(`http://${_helpers.TEST_HOST}:${port}/session`);
|
|
118
|
-
let newUrl = j.getUrlForProxy('/session');
|
|
119
|
-
newUrl.should.eql(`http://${_helpers.TEST_HOST}:${port}/session`);
|
|
120
|
-
});
|
|
121
|
-
it('should throw an error if url requires a sessionId but its null', function () {
|
|
122
|
-
let j = mockProxy();
|
|
123
|
-
let e;
|
|
124
|
-
|
|
125
|
-
try {
|
|
126
|
-
j.getUrlForProxy('/session/456/element/200/value');
|
|
127
|
-
} catch (err) {
|
|
128
|
-
e = err;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
should.exist(e);
|
|
132
|
-
e.message.should.contain('without session id');
|
|
133
|
-
});
|
|
134
|
-
it('should not throw an error if url does not require a session id and its null', function () {
|
|
135
|
-
let j = mockProxy();
|
|
136
|
-
let newUrl = j.getUrlForProxy('/status');
|
|
137
|
-
should.exist(newUrl);
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
describe('straight proxy', function () {
|
|
141
|
-
it('should successfully proxy straight', async function () {
|
|
142
|
-
let j = mockProxy();
|
|
143
|
-
let [res, body] = await j.proxy('/status', 'GET');
|
|
144
|
-
res.statusCode.should.equal(200);
|
|
145
|
-
body.should.eql({
|
|
146
|
-
status: 0,
|
|
147
|
-
value: {
|
|
148
|
-
foo: 'bar'
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
it('should pass along request errors', function () {
|
|
153
|
-
let j = mockProxy({
|
|
154
|
-
sessionId: '123'
|
|
155
|
-
});
|
|
156
|
-
j.proxy('/badurl', 'GET').should.eventually.be.rejectedWith('Could not proxy');
|
|
157
|
-
});
|
|
158
|
-
it('should proxy error responses and codes', async function () {
|
|
159
|
-
let j = mockProxy({
|
|
160
|
-
sessionId: '123'
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
try {
|
|
164
|
-
await j.proxy('/element/bad/text', 'GET');
|
|
165
|
-
} catch (e) {
|
|
166
|
-
(0, _errors.isErrorType)(e.getActualError(), _errors.errors.ElementNotVisibleError).should.be.true;
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
describe('command proxy', function () {
|
|
171
|
-
it('should successfully proxy command', async function () {
|
|
172
|
-
let j = mockProxy();
|
|
173
|
-
let res = await j.command('/status', 'GET');
|
|
174
|
-
res.should.eql({
|
|
175
|
-
foo: 'bar'
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
it('should pass along request errors', function () {
|
|
179
|
-
let j = mockProxy({
|
|
180
|
-
sessionId: '123'
|
|
181
|
-
});
|
|
182
|
-
j.command('/badurl', 'GET').should.eventually.be.rejectedWith('Could not proxy');
|
|
183
|
-
});
|
|
184
|
-
it('should throw when a command fails', async function () {
|
|
185
|
-
let j = mockProxy({
|
|
186
|
-
sessionId: '123'
|
|
187
|
-
});
|
|
188
|
-
let e = null;
|
|
189
|
-
|
|
190
|
-
try {
|
|
191
|
-
await j.command('/element/bad/text', 'GET');
|
|
192
|
-
} catch (err) {
|
|
193
|
-
e = err;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
should.exist(e);
|
|
197
|
-
e.message.should.contain('Invisible element');
|
|
198
|
-
});
|
|
199
|
-
it('should throw when a command fails with a 200 because the status is not 0', async function () {
|
|
200
|
-
let j = mockProxy({
|
|
201
|
-
sessionId: '123'
|
|
202
|
-
});
|
|
203
|
-
let e = null;
|
|
204
|
-
|
|
205
|
-
try {
|
|
206
|
-
await j.command('/element/200/text', 'GET');
|
|
207
|
-
} catch (err) {
|
|
208
|
-
e = err;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
should.exist(e);
|
|
212
|
-
e.error.should.eql('element not visible');
|
|
213
|
-
});
|
|
214
|
-
it('should throw when a command fails with a 100', async function () {
|
|
215
|
-
let j = mockProxy({
|
|
216
|
-
sessionId: '123'
|
|
217
|
-
});
|
|
218
|
-
let e = null;
|
|
219
|
-
|
|
220
|
-
try {
|
|
221
|
-
await j.command('/session/badchrome/nochrome', 'GET');
|
|
222
|
-
} catch (err) {
|
|
223
|
-
e = err;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
should.exist(e);
|
|
227
|
-
e.message.should.contain('chrome not reachable');
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
describe('req/res proxy', function () {
|
|
231
|
-
it('should successfully proxy via req and send to res', async function () {
|
|
232
|
-
let j = mockProxy();
|
|
233
|
-
let [req, res] = buildReqRes('/status', 'GET');
|
|
234
|
-
await j.proxyReqRes(req, res);
|
|
235
|
-
res.headers['content-type'].should.equal('application/json; charset=utf-8');
|
|
236
|
-
res.sentCode.should.equal(200);
|
|
237
|
-
res.sentBody.should.eql({
|
|
238
|
-
value: {
|
|
239
|
-
foo: 'bar'
|
|
240
|
-
}
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
it('should rewrite the inner session id so it doesnt change', async function () {
|
|
244
|
-
let j = mockProxy({
|
|
245
|
-
sessionId: '123'
|
|
246
|
-
});
|
|
247
|
-
let [req, res] = buildReqRes('/element/200/value', 'GET');
|
|
248
|
-
await j.proxyReqRes(req, res);
|
|
249
|
-
res.sentBody.should.eql({
|
|
250
|
-
value: 'foobar',
|
|
251
|
-
sessionId: '123'
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
it('should rewrite the inner session id with sessionId in url', async function () {
|
|
255
|
-
let j = mockProxy({
|
|
256
|
-
sessionId: '123'
|
|
257
|
-
});
|
|
258
|
-
let [req, res] = buildReqRes('/session/456/element/200/value', 'POST');
|
|
259
|
-
await j.proxyReqRes(req, res);
|
|
260
|
-
res.sentBody.should.eql({
|
|
261
|
-
value: 'foobar',
|
|
262
|
-
sessionId: '456'
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
it('should pass through urls that do not require session IDs', async function () {
|
|
266
|
-
let j = mockProxy({
|
|
267
|
-
sessionId: '123'
|
|
268
|
-
});
|
|
269
|
-
let [req, res] = buildReqRes('/status', 'GET');
|
|
270
|
-
await j.proxyReqRes(req, res);
|
|
271
|
-
res.sentBody.should.eql({
|
|
272
|
-
value: {
|
|
273
|
-
'foo': 'bar'
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
it('should proxy strange responses', async function () {
|
|
278
|
-
let j = mockProxy({
|
|
279
|
-
sessionId: '123'
|
|
280
|
-
});
|
|
281
|
-
let [req, res] = buildReqRes('/nochrome', 'GET');
|
|
282
|
-
await j.proxyReqRes(req, res);
|
|
283
|
-
res.sentCode.should.equal(100);
|
|
284
|
-
res.sentBody.should.eql({
|
|
285
|
-
value: {
|
|
286
|
-
message: 'chrome not reachable'
|
|
287
|
-
}
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
});
|
|
291
|
-
});require('source-map-support').install();
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvanNvbndwLXByb3h5L3Byb3h5LXNwZWNzLmpzIl0sIm5hbWVzIjpbImJ1aWxkUmVxUmVzIiwidXJsIiwibWV0aG9kIiwiYm9keSIsInJlcSIsIm9yaWdpbmFsVXJsIiwicmVzIiwiaGVhZGVycyIsInNldCIsImsiLCJ2Iiwic3RhdHVzIiwiY29kZSIsInNlbnRDb2RlIiwic2VuZCIsIkpTT04iLCJwYXJzZSIsImUiLCJzZW50Qm9keSIsImRlc2NyaWJlIiwicG9ydCIsIm1vY2tQcm94eSIsIm9wdHMiLCJzZXJ2ZXIiLCJURVNUX0hPU1QiLCJwcm94eSIsIkpXUHJveHkiLCJyZXF1ZXN0IiwiYXJncyIsImJlZm9yZSIsIml0IiwiaiIsInNob3VsZCIsImVxdWFsIiwiZGVzaXJlZENhcGFiaWxpdGllcyIsInN0YXR1c0NvZGUiLCJlcWwiLCJzZXNzaW9uSWQiLCJ2YWx1ZSIsImJyb3dzZXJOYW1lIiwiZ2V0VXJsRm9yUHJveHkiLCJyZXFCYXNlUGF0aCIsIm5ld1VybCIsImVyciIsImV4aXN0IiwibWVzc2FnZSIsImNvbnRhaW4iLCJmb28iLCJldmVudHVhbGx5IiwiYmUiLCJyZWplY3RlZFdpdGgiLCJnZXRBY3R1YWxFcnJvciIsImVycm9ycyIsIkVsZW1lbnROb3RWaXNpYmxlRXJyb3IiLCJ0cnVlIiwiY29tbWFuZCIsImVycm9yIiwicHJveHlSZXFSZXMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLFNBQVNBLFdBQVQsQ0FBc0JDLEdBQXRCLEVBQTJCQyxNQUEzQixFQUFtQ0MsSUFBbkMsRUFBeUM7QUFDdkMsTUFBSUMsR0FBRyxHQUFHO0FBQUNDLElBQUFBLFdBQVcsRUFBRUosR0FBZDtBQUFtQkMsSUFBQUEsTUFBbkI7QUFBMkJDLElBQUFBO0FBQTNCLEdBQVY7QUFDQSxNQUFJRyxHQUFHLEdBQUcsRUFBVjtBQUNBQSxFQUFBQSxHQUFHLENBQUNDLE9BQUosR0FBYyxFQUFkOztBQUNBRCxFQUFBQSxH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QUFGLENBQWNyRCxHQUFkLEVBQW1CRSxHQUFuQixDQUFOO0FBQ0FBLE1BQUFBLEdBQUcsQ0FBQ08sUUFBSixDQUFhbUIsTUFBYixDQUFvQkMsS0FBcEIsQ0FBMEIsR0FBMUI7QUFDQTNCLE1BQUFBLEdBQUcsQ0FBQ1ksUUFBSixDQUFhYyxNQUFiLENBQW9CSSxHQUFwQixDQUF3QjtBQUFDRSxRQUFBQSxLQUFLLEVBQUU7QUFBQ08sVUFBQUEsT0FBTyxFQUFFO0FBQVY7QUFBUixPQUF4QjtBQUNELEtBTkMsQ0FBRjtBQU9ELEdBbENPLENBQVI7QUFtQ0QsQ0E5S08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQgeyBKV1Byb3h5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4vbW9jay1yZXF1ZXN0JztcbmltcG9ydCB7IGlzRXJyb3JUeXBlLCBlcnJvcnMgfSBmcm9tICcuLi8uLi9saWIvcHJvdG9jb2wvZXJyb3JzJztcbmltcG9ydCB7IGdldFRlc3RQb3J0LCBURVNUX0hPU1QgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZnVuY3Rpb24gYnVpbGRSZXFSZXMgKHVybCwgbWV0aG9kLCBib2R5KSB7XG4gIGxldCByZXEgPSB7b3JpZ2luYWxVcmw6IHVybCwgbWV0aG9kLCBib2R5fTtcbiAgbGV0IHJlcyA9IHt9O1xuICByZXMuaGVhZGVycyA9IHt9O1xuICByZXMuc2V0ID0gKGssIHYpID0+IHsgcmVzW2tdID0gdjsgfTtcbiAgcmVzLnN0YXR1cyA9IChjb2RlKSA9PiB7XG4gICAgcmVzLnNlbnRDb2RlID0gY29kZTtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuICByZXMuc2VuZCA9IChib2R5KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmVzLnNlbnRCb2R5ID0gYm9keTtcbiAgfTtcbiAgcmV0dXJuIFtyZXEsIHJlc107XG59XG5cbmRlc2NyaWJlKCdwcm94eScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHBvcnQ7XG5cbiAgZnVuY3Rpb24gbW9ja1Byb3h5IChvcHRzID0ge30pIHtcbiAgICAvLyBzZXRzIGRlZmF1bHQgc2VydmVyL3BvcnRcbiAgICBvcHRzID0ge3NlcnZlcjogVEVTVF9IT1NULCBwb3J0LCAuLi5vcHRzfTtcbiAgICBsZXQgcHJveHkgPSBuZXcgSldQcm94eShvcHRzKTtcbiAgICBwcm94eS5yZXF1ZXN0ID0gYXN5bmMgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXF1ZXN0KC4uLmFyZ3MpO1xuICAgIH07XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBwb3J0ID0gYXdhaXQgZ2V0VGVzdFBvcnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBvdmVycmlkZSBkZWZhdWx0IHBhcmFtcycsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2VydmVyOiAnMTI3LjAuMC4yJywgcG9ydH0pO1xuICAgIGouc2VydmVyLnNob3VsZC5lcXVhbCgnMTI3LjAuMC4yJyk7XG4gICAgai5wb3J0LnNob3VsZC5lcXVhbChwb3J0KTtcbiAgfSk7XG4gIGl0KCdzaG91bGQgc2F2ZSBzZXNzaW9uIGlkIG9uIHNlc3Npb24gY3JlYXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGogPSBtb2NrUHJveHkoKTtcbiAgICBsZXQgW3JlcywgYm9keV0gPSBhd2FpdCBqLnByb3h5KCcvc2Vzc2lvbicsICdQT1NUJywge2Rlc2lyZWRDYXBhYmlsaXRpZXM6IHt9fSk7XG4gICAgcmVzLnN0YXR1c0NvZGUuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgYm9keS5zaG91bGQuZXFsKHtzdGF0dXM6IDAsIHNlc3Npb25JZDogJzEyMycsIHZhbHVlOiB7YnJvd3Nlck5hbWU6ICdib28nfX0pO1xuICAgIGouc2Vzc2lvbklkLnNob3VsZC5lcXVhbCgnMTIzJyk7XG4gIH0pO1xuICBkZXNjcmliZSgnZ2V0VXJsRm9yUHJveHknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBtb2RpZnkgc2Vzc2lvbiBpZCwgaG9zdCwgYW5kIHBvcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgai5nZXRVcmxGb3JQcm94eSgnaHR0cDovL2hvc3QuY29tOjEyMzQvc2Vzc2lvbi80NTYvZWxlbWVudC8yMDAvdmFsdWUnKVxuICAgICAgIC5zaG91bGQuZXFsKGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vc2Vzc2lvbi8xMjMvZWxlbWVudC8yMDAvdmFsdWVgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHByZXBlbmQgc2NoZW1lLCBob3N0IGFuZCBwb3J0IGlmIG5vdCBwcm92aWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICBqLmdldFVybEZvclByb3h5KCcvc2Vzc2lvbi80NTYvZWxlbWVudC8yMDAvdmFsdWUnKVxuICAgICAgIC5zaG91bGQuZXFsKGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vc2Vzc2lvbi8xMjMvZWxlbWVudC8yMDAvdmFsdWVgKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlc3BlY3Qgbm9uc3RhbmRhcmQgaW5jb21pbmcgcmVxdWVzdCBiYXNlIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJywgcmVxQmFzZVBhdGg6ICcnfSk7XG4gICAgICBqLmdldFVybEZvclByb3h5KCcvc2Vzc2lvbi80NTYvZWxlbWVudC8yMDAvdmFsdWUnKVxuICAgICAgIC5zaG91bGQuZXFsKGBodHRwOi8vJHtURVNUX0hPU1R9OiR7cG9ydH0vc2Vzc2lvbi8xMjMvZWxlbWVudC8yMDAvdmFsdWVgKTtcblxuICAgICAgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJywgcmVxQmFzZVBhdGg6ICcvbXkvYmFzZS9wYXRoJ30pO1xuICAgICAgai5nZXRVcmxGb3JQcm94eSgnL215L2Jhc2UvcGF0aC9zZXNzaW9uLzQ1Ni9lbGVtZW50LzIwMC92YWx1ZScpXG4gICAgICAgLnNob3VsZC5lcWwoYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9zZXNzaW9uLzEyMy9lbGVtZW50LzIwMC92YWx1ZWApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgd29yayB3aXRoIHVybHMgd2hpY2ggZG8gbm90IGhhdmUgc2Vzc2lvbiBpZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgai5nZXRVcmxGb3JQcm94eSgnaHR0cDovL2hvc3QuY29tOjEyMzQvc2Vzc2lvbicpXG4gICAgICAgLnNob3VsZC5lcWwoYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9zZXNzaW9uYCk7XG5cbiAgICAgIGxldCBuZXdVcmwgPSBqLmdldFVybEZvclByb3h5KCcvc2Vzc2lvbicpO1xuICAgICAgbmV3VXJsLnNob3VsZC5lcWwoYGh0dHA6Ly8ke1RFU1RfSE9TVH06JHtwb3J0fS9zZXNzaW9uYCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBpZiB1cmwgcmVxdWlyZXMgYSBzZXNzaW9uSWQgYnV0IGl0cyBudWxsJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoKTtcbiAgICAgIGxldCBlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgai5nZXRVcmxGb3JQcm94eSgnL3Nlc3Npb24vNDU2L2VsZW1lbnQvMjAwL3ZhbHVlJyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZSA9IGVycjtcbiAgICAgIH1cbiAgICAgIHNob3VsZC5leGlzdChlKTtcbiAgICAgIGUubWVzc2FnZS5zaG91bGQuY29udGFpbignd2l0aG91dCBzZXNzaW9uIGlkJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdXJsIGRvZXMgbm90IHJlcXVpcmUgYSBzZXNzaW9uIGlkIGFuZCBpdHMgbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KCk7XG4gICAgICBsZXQgbmV3VXJsID0gai5nZXRVcmxGb3JQcm94eSgnL3N0YXR1cycpO1xuXG4gICAgICBzaG91bGQuZXhpc3QobmV3VXJsKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdzdHJhaWdodCBwcm94eScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwcm94eSBzdHJhaWdodCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KCk7XG4gICAgICBsZXQgW3JlcywgYm9keV0gPSBhd2FpdCBqLnByb3h5KCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgcmVzLnN0YXR1c0NvZGUuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICBib2R5LnNob3VsZC5lcWwoe3N0YXR1czogMCwgdmFsdWU6IHtmb286ICdiYXInfX0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBhbG9uZyByZXF1ZXN0IGVycm9ycycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICBqLnByb3h5KCcvYmFkdXJsJywgJ0dFVCcpLnNob3VsZC5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aCgnQ291bGQgbm90IHByb3h5Jyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwcm94eSBlcnJvciByZXNwb25zZXMgYW5kIGNvZGVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGoucHJveHkoJy9lbGVtZW50L2JhZC90ZXh0JywgJ0dFVCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpc0Vycm9yVHlwZShlLmdldEFjdHVhbEVycm9yKCksIGVycm9ycy5FbGVtZW50Tm90VmlzaWJsZUVycm9yKS5zaG91bGQuYmUudHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdjb21tYW5kIHByb3h5JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHByb3h5IGNvbW1hbmQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSgpO1xuICAgICAgbGV0IHJlcyA9IGF3YWl0IGouY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICAgIHJlcy5zaG91bGQuZXFsKHtmb286ICdiYXInfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwYXNzIGFsb25nIHJlcXVlc3QgZXJyb3JzJywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGouY29tbWFuZCgnL2JhZHVybCcsICdHRVQnKS5zaG91bGQuZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoJ0NvdWxkIG5vdCBwcm94eScpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBhIGNvbW1hbmQgZmFpbHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgbGV0IGUgPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgai5jb21tYW5kKCcvZWxlbWVudC9iYWQvdGV4dCcsICdHRVQnKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlID0gZXJyO1xuICAgICAgfVxuICAgICAgc2hvdWxkLmV4aXN0KGUpO1xuICAgICAgZS5tZXNzYWdlLnNob3VsZC5jb250YWluKCdJbnZpc2libGUgZWxlbWVudCcpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBhIGNvbW1hbmQgZmFpbHMgd2l0aCBhIDIwMCBiZWNhdXNlIHRoZSBzdGF0dXMgaXMgbm90IDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgbGV0IGUgPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgai5jb21tYW5kKCcvZWxlbWVudC8yMDAvdGV4dCcsICdHRVQnKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBlID0gZXJyO1xuICAgICAgfVxuICAgICAgc2hvdWxkLmV4aXN0KGUpO1xuICAgICAgZS5lcnJvci5zaG91bGQuZXFsKCdlbGVtZW50IG5vdCB2aXNpYmxlJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGEgY29tbWFuZCBmYWlscyB3aXRoIGEgMTAwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGxldCBlID0gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGouY29tbWFuZCgnL3Nlc3Npb24vYmFkY2hyb21lL25vY2hyb21lJywgJ0dFVCcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGUgPSBlcnI7XG4gICAgICB9XG4gICAgICBzaG91bGQuZXhpc3QoZSk7XG4gICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW4oJ2Nocm9tZSBub3QgcmVhY2hhYmxlJyk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgncmVxL3JlcyBwcm94eScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSBwcm94eSB2aWEgcmVxIGFuZCBzZW5kIHRvIHJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KCk7XG4gICAgICBsZXQgW3JlcSwgcmVzXSA9IGJ1aWxkUmVxUmVzKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgYXdhaXQgai5wcm94eVJlcVJlcyhyZXEsIHJlcyk7XG4gICAgICByZXMuaGVhZGVyc1snY29udGVudC10eXBlJ10uc2hvdWxkLmVxdWFsKCdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICByZXMuc2VudENvZGUuc2hvdWxkLmVxdWFsKDIwMCk7XG4gICAgICByZXMuc2VudEJvZHkuc2hvdWxkLmVxbCh7dmFsdWU6IHtmb286ICdiYXInfX0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmV3cml0ZSB0aGUgaW5uZXIgc2Vzc2lvbiBpZCBzbyBpdCBkb2VzbnQgY2hhbmdlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGogPSBtb2NrUHJveHkoe3Nlc3Npb25JZDogJzEyMyd9KTtcbiAgICAgIGxldCBbcmVxLCByZXNdID0gYnVpbGRSZXFSZXMoJy9lbGVtZW50LzIwMC92YWx1ZScsICdHRVQnKTtcbiAgICAgIGF3YWl0IGoucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICAgICAgcmVzLnNlbnRCb2R5LnNob3VsZC5lcWwoe3ZhbHVlOiAnZm9vYmFyJywgc2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmV3cml0ZSB0aGUgaW5uZXIgc2Vzc2lvbiBpZCB3aXRoIHNlc3Npb25JZCBpbiB1cmwnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBsZXQgaiA9IG1vY2tQcm94eSh7c2Vzc2lvbklkOiAnMTIzJ30pO1xuICAgICAgbGV0IFtyZXEsIHJlc10gPSBidWlsZFJlcVJlcygnL3Nlc3Npb24vNDU2L2VsZW1lbnQvMjAwL3ZhbHVlJywgJ1BPU1QnKTtcbiAgICAgIGF3YWl0IGoucHJveHlSZXFSZXMocmVxLCByZXMpO1xuICAgICAgcmVzLnNlbnRCb2R5LnNob3VsZC5lcWwoe3ZhbHVlOiAnZm9vYmFyJywgc2Vzc2lvbklkOiAnNDU2J30pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyB0aHJvdWdoIHVybHMgdGhhdCBkbyBub3QgcmVxdWlyZSBzZXNzaW9uIElEcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICBsZXQgW3JlcSwgcmVzXSA9IGJ1aWxkUmVxUmVzKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgYXdhaXQgai5wcm94eVJlcVJlcyhyZXEsIHJlcyk7XG4gICAgICByZXMuc2VudEJvZHkuc2hvdWxkLmVxbCh7dmFsdWU6IHsnZm9vJzogJ2Jhcid9fSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBwcm94eSBzdHJhbmdlIHJlc3BvbnNlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBqID0gbW9ja1Byb3h5KHtzZXNzaW9uSWQ6ICcxMjMnfSk7XG4gICAgICBsZXQgW3JlcSwgcmVzXSA9IGJ1aWxkUmVxUmVzKCcvbm9jaHJvbWUnLCAnR0VUJyk7XG4gICAgICBhd2FpdCBqLnByb3h5UmVxUmVzKHJlcSwgcmVzKTtcbiAgICAgIHJlcy5zZW50Q29kZS5zaG91bGQuZXF1YWwoMTAwKTtcbiAgICAgIHJlcy5zZW50Qm9keS5zaG91bGQuZXFsKHt2YWx1ZToge21lc3NhZ2U6ICdjaHJvbWUgbm90IHJlYWNoYWJsZSd9fSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvanNvbndwLXByb3h5L3Byb3h5LXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|