UNPKG

appium-instruments

Version:

IOS Instruments + instruments-without-delay launcher used by Appium

298 lines (246 loc) 19.2 kB
require('source-map-support').install(); 'use strict'; 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=