appium-instruments
Version:
IOS Instruments + instruments-without-delay launcher used by Appium
298 lines (246 loc) • 19.2 kB
JavaScript
require('source-map-support').install();
;
var _regeneratorRuntime = require('babel-runtime/regenerator')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
var _this = this;
var _libStreams = require('../lib/streams');
var _stream = require('stream');
var _stream2 = _interopRequireDefault(_stream);
var _chai = require('chai');
var _chai2 = _interopRequireDefault(_chai);
var _chaiAsPromised = require('chai-as-promised');
var _chaiAsPromised2 = _interopRequireDefault(_chaiAsPromised);
var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
var _sinon = require('sinon');
var _sinon2 = _interopRequireDefault(_sinon);
_chai2['default'].should();
_chai2['default'].use(_chaiAsPromised2['default']);
describe('streams', function () {
function runThroughStream(stream, text) {
return _regeneratorRuntime.async(function runThroughStream$(context$2$0) {
while (1) switch (context$2$0.prev = context$2$0.next) {
case 0:
return context$2$0.abrupt('return', new _bluebird2['default'](function (resolve) {
stream.on('data', function (data) {
resolve(data);
});
stream.write(text);
}));
case 1:
case 'end':
return context$2$0.stop();
}
}, null, this);
}
describe('outputStream', function () {
var stream = undefined;
beforeEach(function () {
stream = (0, _libStreams.outputStream)();
});
it('should return a stream', function () {
stream.should.be.an['instanceof'](_stream2['default']);
});
it('should append [INST] to the output', function callee$2$0() {
var text, output;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
text = 'Some output';
context$3$0.next = 3;
return _regeneratorRuntime.awrap(runThroughStream(stream, text));
case 3:
output = context$3$0.sent;
output.should.include('[INST] Some output');
case 5:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should remove beginning * from output', function callee$2$0() {
var text, output;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
text = '***Some output***';
context$3$0.next = 3;
return _regeneratorRuntime.awrap(runThroughStream(stream, text));
case 3:
output = context$3$0.sent;
output.should.include('Some output***');
case 5:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should remove final newlines', function callee$2$0() {
var text, output;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
text = 'Some output\n';
context$3$0.next = 3;
return _regeneratorRuntime.awrap(runThroughStream(stream, text));
case 3:
output = context$3$0.sent;
output.should.not.include('\n');
case 5:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should indent internal newlines', function callee$2$0() {
var text, output;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
text = 'Some output\non multiple lines';
context$3$0.next = 3;
return _regeneratorRuntime.awrap(runThroughStream(stream, text));
case 3:
output = context$3$0.sent;
output.should.include('Some output\n on multiple lines');
case 5:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
});
describe('errorStream', function () {
var stream = undefined;
beforeEach(function () {
stream = (0, _libStreams.errorStream)();
});
it('should return a stream', function () {
stream.should.be.an['instanceof'](_stream2['default']);
});
it('should append [INST STDERR] to the output', function callee$2$0() {
var text, output;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
text = 'Some output';
context$3$0.next = 3;
return _regeneratorRuntime.awrap(runThroughStream(stream, text));
case 3:
output = context$3$0.sent;
output.should.include('[INST STDERR] Some output');
case 5:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should remove beginning * from output', function callee$2$0() {
var text, output;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
text = '***Some output***';
context$3$0.next = 3;
return _regeneratorRuntime.awrap(runThroughStream(stream, text));
case 3:
output = context$3$0.sent;
output.should.include('Some output***');
case 5:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should remove final newlines', function callee$2$0() {
var text, output;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
text = 'Some output\n';
context$3$0.next = 3;
return _regeneratorRuntime.awrap(runThroughStream(stream, text));
case 3:
output = context$3$0.sent;
output.should.not.include('\n');
case 5:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
});
describe('webSocketAlertStream', function () {
var webSocket = {
sockets: {
emit: function emit() {}
}
};
var webSocketSpy = _sinon2['default'].spy(webSocket.sockets, 'emit');
afterEach(function () {
webSocketSpy.reset();
});
it('should return a stream', function () {
(0, _libStreams.webSocketAlertStream)().should.be.an['instanceof'](_stream2['default']);
});
it('should queue data', function callee$2$0() {
var text, output;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
text = 'Some output';
context$3$0.next = 3;
return _regeneratorRuntime.awrap(runThroughStream((0, _libStreams.webSocketAlertStream)(), text));
case 3:
output = context$3$0.sent;
output.should.equal(text);
case 5:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should send data to websocket when appropriate', function callee$2$0() {
var text;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
text = 'Call to onAlert returned \'YES\'\nSome output';
context$3$0.next = 3;
return _regeneratorRuntime.awrap(runThroughStream((0, _libStreams.webSocketAlertStream)(webSocket), text));
case 3:
webSocketSpy.calledWith('alert', { message: text });
case 4:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
it('should not send data to websocket when inappropriate', function callee$2$0() {
var text;
return _regeneratorRuntime.async(function callee$2$0$(context$3$0) {
while (1) switch (context$3$0.prev = context$3$0.next) {
case 0:
text = 'Some output';
context$3$0.next = 3;
return _regeneratorRuntime.awrap(runThroughStream((0, _libStreams.webSocketAlertStream)(webSocket), text));
case 3:
webSocketSpy.called.should.be['false'];
case 4:
case 'end':
return context$3$0.stop();
}
}, null, _this);
});
});
describe('dumpStream', function () {
var stream = undefined;
beforeEach(function () {
stream = (0, _libStreams.dumpStream)();
});
it('should return a stream', function () {
stream.should.be.an['instanceof'](_stream2['default']);
});
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3Qvc3RyZWFtcy1zcGVjcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OzBCQUU0RSxnQkFBZ0I7O3NCQUN6RSxRQUFROzs7O29CQUNWLE1BQU07Ozs7OEJBQ0ksa0JBQWtCOzs7O3dCQUMvQixVQUFVOzs7O3FCQUNOLE9BQU87Ozs7QUFHekIsa0JBQUssTUFBTSxFQUFFLENBQUM7QUFDZCxrQkFBSyxHQUFHLDZCQUFnQixDQUFDOztBQUV6QixRQUFRLENBQUMsU0FBUyxFQUFFLFlBQU07QUFDeEIsV0FBZSxnQkFBZ0IsQ0FBRSxNQUFNLEVBQUUsSUFBSTs7Ozs4Q0FDcEMsMEJBQU0sVUFBVSxPQUFPLEVBQUU7QUFDOUIsa0JBQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQUMsSUFBSSxFQUFLO0FBQzFCLHFCQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDZixDQUFDLENBQUM7QUFDSCxrQkFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztXQUNwQixDQUFDOzs7Ozs7O0dBQ0g7O0FBRUQsVUFBUSxDQUFDLGNBQWMsRUFBRSxZQUFNO0FBQzdCLFFBQUksTUFBTSxZQUFBLENBQUM7QUFDWCxjQUFVLENBQUMsWUFBTTtBQUNmLFlBQU0sR0FBRywrQkFBYyxDQUFDO0tBQ3pCLENBQUMsQ0FBQztBQUNILE1BQUUsQ0FBQyx3QkFBd0IsRUFBRSxZQUFNO0FBQ2pDLFlBQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsY0FBVyxxQkFBUSxDQUFDO0tBQ3hDLENBQUMsQ0FBQztBQUNILE1BQUUsQ0FBQyxvQ0FBb0MsRUFBRTtVQUNuQyxJQUFJLEVBQ0osTUFBTTs7OztBQUROLGdCQUFJLEdBQUcsYUFBYTs7NkNBQ0wsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQzs7O0FBQTdDLGtCQUFNOztBQUVWLGtCQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDOzs7Ozs7O0tB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LENBQUMsQ0FBQztDQUNKLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0L3N0cmVhbXMtc3BlY3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bW9jaGFcblxuaW1wb3J0IHsgb3V0cHV0U3RyZWFtLCBlcnJvclN0cmVhbSwgd2ViU29ja2V0QWxlcnRTdHJlYW0sIGR1bXBTdHJlYW0gfSBmcm9tICcuLi9saWIvc3RyZWFtcyc7XG5pbXBvcnQgU3RyZWFtIGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCBjaGFpQXNQcm9taXNlZCBmcm9tICdjaGFpLWFzLXByb21pc2VkJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cblxuY2hhaS5zaG91bGQoKTtcbmNoYWkudXNlKGNoYWlBc1Byb21pc2VkKTtcblxuZGVzY3JpYmUoJ3N0cmVhbXMnLCAoKSA9PiB7XG4gIGFzeW5jIGZ1bmN0aW9uIHJ1blRocm91Z2hTdHJlYW0gKHN0cmVhbSwgdGV4dCkge1xuICAgIHJldHVybiBuZXcgQihmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgc3RyZWFtLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0pO1xuICAgICAgc3RyZWFtLndyaXRlKHRleHQpO1xuICAgIH0pO1xuICB9XG5cbiAgZGVzY3JpYmUoJ291dHB1dFN0cmVhbScsICgpID0+IHtcbiAgICBsZXQgc3RyZWFtO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc3RyZWFtID0gb3V0cHV0U3RyZWFtKCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzdHJlYW0nLCAoKSA9PiB7XG4gICAgICBzdHJlYW0uc2hvdWxkLmJlLmFuLmluc3RhbmNlb2YoU3RyZWFtKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGFwcGVuZCBbSU5TVF0gdG8gdGhlIG91dHB1dCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB0ZXh0ID0gJ1NvbWUgb3V0cHV0JztcbiAgICAgIGxldCBvdXRwdXQgPSBhd2FpdCBydW5UaHJvdWdoU3RyZWFtKHN0cmVhbSwgdGV4dCk7XG5cbiAgICAgIG91dHB1dC5zaG91bGQuaW5jbHVkZSgnW0lOU1RdIFNvbWUgb3V0cHV0Jyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgYmVnaW5uaW5nICogZnJvbSBvdXRwdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdGV4dCA9ICcqKipTb21lIG91dHB1dCoqKic7XG4gICAgICBsZXQgb3V0cHV0ID0gYXdhaXQgcnVuVGhyb3VnaFN0cmVhbShzdHJlYW0sIHRleHQpO1xuXG4gICAgICBvdXRwdXQuc2hvdWxkLmluY2x1ZGUoJ1NvbWUgb3V0cHV0KioqJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgZmluYWwgbmV3bGluZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdGV4dCA9ICdTb21lIG91dHB1dFxcbic7XG4gICAgICBsZXQgb3V0cHV0ID0gYXdhaXQgcnVuVGhyb3VnaFN0cmVhbShzdHJlYW0sIHRleHQpO1xuXG4gICAgICBvdXRwdXQuc2hvdWxkLm5vdC5pbmNsdWRlKCdcXG4nKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGluZGVudCBpbnRlcm5hbCBuZXdsaW5lcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB0ZXh0ID0gJ1NvbWUgb3V0cHV0XFxub24gbXVsdGlwbGUgbGluZXMnO1xuICAgICAgbGV0IG91dHB1dCA9IGF3YWl0IHJ1blRocm91Z2hTdHJlYW0oc3RyZWFtLCB0ZXh0KTtcblxuICAgICAgb3V0cHV0LnNob3VsZC5pbmNsdWRlKCdTb21lIG91dHB1dFxcbiAgICAgICBvbiBtdWx0aXBsZSBsaW5lcycpO1xuICAgIH0pO1xuICB9KTtcbiAgZGVzY3JpYmUoJ2Vycm9yU3RyZWFtJywgKCkgPT4ge1xuICAgIGxldCBzdHJlYW07XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBzdHJlYW0gPSBlcnJvclN0cmVhbSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgc3RyZWFtJywgKCkgPT4ge1xuICAgICAgc3RyZWFtLnNob3VsZC5iZS5hbi5pbnN0YW5jZW9mKFN0cmVhbSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBhcHBlbmQgW0lOU1QgU1RERVJSXSB0byB0aGUgb3V0cHV0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHRleHQgPSAnU29tZSBvdXRwdXQnO1xuICAgICAgbGV0IG91dHB1dCA9IGF3YWl0IHJ1blRocm91Z2hTdHJlYW0oc3RyZWFtLCB0ZXh0KTtcblxuICAgICAgb3V0cHV0LnNob3VsZC5pbmNsdWRlKCdbSU5TVCBTVERFUlJdIFNvbWUgb3V0cHV0Jyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgYmVnaW5uaW5nICogZnJvbSBvdXRwdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdGV4dCA9ICcqKipTb21lIG91dHB1dCoqKic7XG4gICAgICBsZXQgb3V0cHV0ID0gYXdhaXQgcnVuVGhyb3VnaFN0cmVhbShzdHJlYW0sIHRleHQpO1xuXG4gICAgICBvdXRwdXQuc2hvdWxkLmluY2x1ZGUoJ1NvbWUgb3V0cHV0KioqJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgZmluYWwgbmV3bGluZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdGV4dCA9ICdTb21lIG91dHB1dFxcbic7XG4gICAgICBsZXQgb3V0cHV0ID0gYXdhaXQgcnVuVGhyb3VnaFN0cmVhbShzdHJlYW0sIHRleHQpO1xuXG4gICAgICBvdXRwdXQuc2hvdWxkLm5vdC5pbmNsdWRlKCdcXG4nKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCd3ZWJTb2NrZXRBbGVydFN0cmVhbScsICgpID0+IHtcbiAgICBsZXQgd2ViU29ja2V0ID0ge1xuICAgICAgc29ja2V0czoge1xuICAgICAgICBlbWl0OiAoKSA9PiB7fVxuICAgICAgfVxuICAgIH07XG4gICAgbGV0IHdlYlNvY2tldFNweSA9IHNpbm9uLnNweSh3ZWJTb2NrZXQuc29ja2V0cywgJ2VtaXQnKTtcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICB3ZWJTb2NrZXRTcHkucmVzZXQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgc3RyZWFtJywgKCkgPT4ge1xuICAgICAgd2ViU29ja2V0QWxlcnRTdHJlYW0oKS5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihTdHJlYW0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcXVldWUgZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB0ZXh0ID0gJ1NvbWUgb3V0cHV0JztcbiAgICAgIGxldCBvdXRwdXQgPSBhd2FpdCBydW5UaHJvdWdoU3RyZWFtKHdlYlNvY2tldEFsZXJ0U3RyZWFtKCksIHRleHQpO1xuXG4gICAgICBvdXRwdXQuc2hvdWxkLmVxdWFsKHRleHQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgc2VuZCBkYXRhIHRvIHdlYnNvY2tldCB3aGVuIGFwcHJvcHJpYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHRleHQgPSAnQ2FsbCB0byBvbkFsZXJ0IHJldHVybmVkIFxcJ1lFU1xcJ1xcblNvbWUgb3V0cHV0JztcblxuICAgICAgYXdhaXQgcnVuVGhyb3VnaFN0cmVhbSh3ZWJTb2NrZXRBbGVydFN0cmVhbSh3ZWJTb2NrZXQpLCB0ZXh0KTtcblxuICAgICAgd2ViU29ja2V0U3B5LmNhbGxlZFdpdGgoJ2FsZXJ0Jywge21lc3NhZ2U6IHRleHR9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG5vdCBzZW5kIGRhdGEgdG8gd2Vic29ja2V0IHdoZW4gaW5hcHByb3ByaWF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGxldCB0ZXh0ID0gJ1NvbWUgb3V0cHV0JztcblxuICAgICAgYXdhaXQgcnVuVGhyb3VnaFN0cmVhbSh3ZWJTb2NrZXRBbGVydFN0cmVhbSh3ZWJTb2NrZXQpLCB0ZXh0KTtcblxuICAgICAgd2ViU29ja2V0U3B5LmNhbGxlZC5zaG91bGQuYmUuZmFsc2U7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnZHVtcFN0cmVhbScsICgpID0+IHtcbiAgICBsZXQgc3RyZWFtO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgc3RyZWFtID0gZHVtcFN0cmVhbSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgc3RyZWFtJywgKCkgPT4ge1xuICAgICAgc3RyZWFtLnNob3VsZC5iZS5hbi5pbnN0YW5jZW9mKFN0cmVhbSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwic291cmNlUm9vdCI6Ii4uLy4uIn0=