snapshot.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import { spawn } from 'child_process';
  2. import { createServer } from 'http';
  3. import { join, resolve } from 'path';
  4. import * as connect from 'connect';
  5. import { task } from 'gulp';
  6. import * as serveStatic from 'serve-static';
  7. import { argv } from 'yargs';
  8. import { DIST_E2E_COMPONENTS_ROOT, PROJECT_ROOT, SCRIPTS_ROOT } from '../constants';
  9. import { mergeObjects } from '../util';
  10. task('snapshot', ['e2e.prod'], (done: Function) => {
  11. snapshot(false, done);
  12. });
  13. task('snapshot.skipBuild', (done: Function) => {
  14. snapshot(false, done);
  15. });
  16. function snapshot(quickMode: boolean, callback: Function) {
  17. const snapshotConfig = require('../../snapshot/snapshot.config').config;
  18. const protractorConfigFile = resolve(SCRIPTS_ROOT, 'snapshot/protractor.config.js');
  19. const snapshotDefaults = snapshotConfig.platformDefaults || {};
  20. const snapshotValues: any = mergeObjects(snapshotDefaults, argv || {});
  21. if (!snapshotConfig.accessKey || !snapshotConfig.accessKey.length) {
  22. console.error('Missing IONIC_SNAPSHOT_KEY environment variable');
  23. return callback(new Error('Missing IONIC_SNAPSHOT_KEY environment variable'));
  24. }
  25. let component = '*';
  26. let e2eSpecs = '*';
  27. const folderArg: string = argv.folder || argv.f;
  28. if (folderArg && folderArg.length) {
  29. const folderArgPaths = folderArg.split('/');
  30. component = folderArgPaths[0];
  31. if (folderArgPaths.length > 1) {
  32. e2eSpecs = folderArgPaths[1];
  33. }
  34. }
  35. const specs = join(DIST_E2E_COMPONENTS_ROOT, component, 'test', e2eSpecs, 'www', '*e2e.js');
  36. console.log('[snapshot] Running with', 'Production', 'build');
  37. console.log(`[snapshot] Specs: ${specs}`);
  38. const testId = generateTestId();
  39. console.log(`[snapshot] TestId: ${testId}`);
  40. snapshotValues.params.test_id = testId;
  41. snapshotValues.params.upload = !quickMode;
  42. var protractorArgs = [
  43. '--browser ' + snapshotValues.browser,
  44. '--platform ' + snapshotValues.platform,
  45. '--params.platform_id=' + snapshotValues.params.platform_id,
  46. '--params.platform_index=' + snapshotValues.params.platform_index,
  47. '--params.platform_count=' + snapshotValues.params.platform_count,
  48. '--params.width=' + snapshotValues.params.width,
  49. '--params.height=' + snapshotValues.params.height,
  50. '--params.test_id=' + snapshotValues.params.test_id,
  51. '--params.upload=' + snapshotValues.params.upload,
  52. '--specs=' + specs
  53. ];
  54. return protractor(callback, [protractorConfigFile].concat(protractorArgs), testId);
  55. }
  56. function protractor(callback, args, testId: string) {
  57. const buildConfig = require('../../build/config');
  58. const app = connect().use(serveStatic(PROJECT_ROOT));
  59. const protractorHttpServer = createServer(app).listen(buildConfig.protractorPort);
  60. console.log(`Serving ${process.cwd()} on http://localhost:${buildConfig.protractorPort}`);
  61. let spawnCommand = process.platform === 'win32' ? 'protractor.cmd' : 'protractor';
  62. const child = spawn(spawnCommand, args, {
  63. stdio: [process.stdin, process.stdout, 'pipe']
  64. });
  65. let errored = false;
  66. let callbackCalled = false;
  67. child.stderr.on('data', function(data) {
  68. protractorHttpServer.close();
  69. console.error(data.toString());
  70. if (!errored) {
  71. errored = true;
  72. if (!callbackCalled) {
  73. callback('Protractor tests failed.');
  74. callbackCalled = true;
  75. }
  76. }
  77. });
  78. child.on('exit', function() {
  79. protractorHttpServer.close();
  80. if (!callbackCalled) {
  81. console.log(`[snapshot] TestId: ${testId}`);
  82. callback();
  83. callbackCalled = true;
  84. }
  85. });
  86. }
  87. function generateTestId() {
  88. let chars = 'abcdefghjkmnpqrstuvwxyz';
  89. let id = chars.charAt(Math.floor(Math.random() * chars.length));
  90. chars += '0123456789';
  91. while (id.length < 3) {
  92. id += chars.charAt(Math.floor(Math.random() * chars.length));
  93. }
  94. return id;
  95. }