From 5b94394a1a6d471f897d14ac62fe7bec5f9a74c2 Mon Sep 17 00:00:00 2001
From: Chocobozzz <me@florianbigard.com>
Date: Mon, 27 Feb 2023 10:44:32 +0100
Subject: [PATCH] Fix E2E with firefox

---
 client/e2e/src/po/login.po.ts                 |  4 +++
 .../e2e/src/suites-local/signup.e2e-spec.ts   |  6 ++---
 client/e2e/src/utils/hooks.ts                 |  2 +-
 client/e2e/src/utils/mock-smtp.ts             | 17 ++++++------
 client/e2e/wdio.local-test.conf.ts            | 26 ++++++++++++-------
 client/e2e/wdio.local.conf.ts                 | 14 ++++++----
 client/package.json                           |  2 +-
 client/yarn.lock                              | 18 ++++++-------
 .../tests/shared/mock-servers/mock-email.ts   | 15 +++++------
 support/doc/development/tests.md              |  2 +-
 10 files changed, 60 insertions(+), 46 deletions(-)

diff --git a/client/e2e/src/po/login.po.ts b/client/e2e/src/po/login.po.ts
index f1d13a2b0..30469cf1b 100644
--- a/client/e2e/src/po/login.po.ts
+++ b/client/e2e/src/po/login.po.ts
@@ -60,6 +60,10 @@ export class LoginPage {
   }
 
   loginOnPeerTube2 () {
+    if (!process.env.PEERTUBE2_E2E_PASSWORD) {
+      throw new Error('PEERTUBE2_E2E_PASSWORD env is missing for user e2e on peertube2.cpy.re')
+    }
+
     return this.login({ username: 'e2e', password: process.env.PEERTUBE2_E2E_PASSWORD, url: 'https://peertube2.cpy.re/login' })
   }
 
diff --git a/client/e2e/src/suites-local/signup.e2e-spec.ts b/client/e2e/src/suites-local/signup.e2e-spec.ts
index 7c822a6e6..ad0cc218e 100644
--- a/client/e2e/src/suites-local/signup.e2e-spec.ts
+++ b/client/e2e/src/suites-local/signup.e2e-spec.ts
@@ -244,9 +244,9 @@ describe('Signup', () => {
 
     before(async () => {
       // FIXME: typings are wrong, get returns a promise
-      emailPort = await browser.sharedStore.get('emailPort') as unknown as number
+      emailPort = await (browser.sharedStore.get(browser.config.baseUrl + '-emailPort') as unknown as Promise<number>)
 
-      MockSMTPServer.Instance.collectEmails(emailPort, emails)
+      await MockSMTPServer.Instance.collectEmails(emailPort, emails)
     })
 
     describe('Direct registration', function () {
@@ -404,7 +404,7 @@ describe('Signup', () => {
       })
     })
 
-    before(() => {
+    after(() => {
       MockSMTPServer.Instance.kill()
     })
   })
diff --git a/client/e2e/src/utils/hooks.ts b/client/e2e/src/utils/hooks.ts
index e57584b44..1daff5fcc 100644
--- a/client/e2e/src/utils/hooks.ts
+++ b/client/e2e/src/utils/hooks.ts
@@ -32,7 +32,7 @@ async function beforeLocalSession (config: { baseUrl: string }, capabilities: {
 
   config.baseUrl = 'http://localhost:900' + appInstance
 
-  await setValue('emailPort', emailPort)
+  await setValue(config.baseUrl + '-emailPort', emailPort)
 }
 
 async function onBrowserStackPrepare () {
diff --git a/client/e2e/src/utils/mock-smtp.ts b/client/e2e/src/utils/mock-smtp.ts
index 614477d7d..be6f8b259 100644
--- a/client/e2e/src/utils/mock-smtp.ts
+++ b/client/e2e/src/utils/mock-smtp.ts
@@ -1,11 +1,10 @@
-import { ChildProcess } from 'child_process'
 import MailDev from '@peertube/maildev'
 
 class MockSMTPServer {
 
   private static instance: MockSMTPServer
   private started = false
-  private emailChildProcess: ChildProcess
+  private maildev: any
   private emails: object[]
 
   collectEmails (port: number, emailsCollection: object[]) {
@@ -16,18 +15,20 @@ class MockSMTPServer {
         return res(undefined)
       }
 
-      const maildev = new MailDev({
+      this.maildev = new MailDev({
         ip: '127.0.0.1',
         smtp: port,
         disableWeb: true,
         silent: true
       })
 
-      maildev.on('new', email => {
+      this.maildev.on('new', email => {
         this.emails.push(email)
+
+        console.log('pushed email', email)
       })
 
-      maildev.listen(err => {
+      this.maildev.listen(err => {
         if (err) return rej(err)
 
         this.started = true
@@ -38,11 +39,11 @@ class MockSMTPServer {
   }
 
   kill () {
-    if (!this.emailChildProcess) return
+    if (!this.maildev) return
 
-    process.kill(this.emailChildProcess.pid)
+    this.maildev.close()
 
-    this.emailChildProcess = null
+    this.maildev = null
     MockSMTPServer.instance = null
   }
 
diff --git a/client/e2e/wdio.local-test.conf.ts b/client/e2e/wdio.local-test.conf.ts
index bc15123a0..3c19e4e9a 100644
--- a/client/e2e/wdio.local-test.conf.ts
+++ b/client/e2e/wdio.local-test.conf.ts
@@ -8,6 +8,12 @@ const prefs = {
 // Chrome headless does not support prefs
 process.env.LANG = 'en'
 
+// https://github.com/mozilla/geckodriver/issues/1354#issuecomment-479456411
+process.env.MOZ_HEADLESS_WIDTH = '1280'
+process.env.MOZ_HEADLESS_HEIGHT = '1024'
+
+const windowSizeArg = `--window-size=${process.env.MOZ_HEADLESS_WIDTH},${process.env.MOZ_HEADLESS_HEIGHT}`
+
 module.exports = {
   config: {
     ...mainConfig,
@@ -22,19 +28,19 @@ module.exports = {
         browserName: 'chrome',
         acceptInsecureCerts: true,
         'goog:chromeOptions': {
-          args: [ '--disable-gpu', '--window-size=1280,1024' ],
+          args: [ '--disable-gpu', windowSizeArg ],
+          prefs
+        }
+      },
+      {
+        browserName: 'firefox',
+        'moz:firefoxOptions': {
+          binary: '/usr/bin/firefox-developer-edition',
+          args: [ '--headless', windowSizeArg ],
+
           prefs
         }
       }
-      // {
-      //   browserName: 'firefox',
-      //   'moz:firefoxOptions': {
-      //     binary: '/usr/bin/firefox-developer-edition',
-      //     args: [ '--headless', '--window-size=1280,1024' ],
-
-      //     prefs
-      //   }
-      // }
     ],
 
     services: [ 'chromedriver', 'geckodriver', 'shared-store' ],
diff --git a/client/e2e/wdio.local.conf.ts b/client/e2e/wdio.local.conf.ts
index 27c6e867b..903235b86 100644
--- a/client/e2e/wdio.local.conf.ts
+++ b/client/e2e/wdio.local.conf.ts
@@ -1,11 +1,15 @@
 import { afterLocalSuite, beforeLocalSession, beforeLocalSuite } from './src/utils'
 import { config as mainConfig } from './wdio.main.conf'
 
-const prefs = {
-  'intl.accept_languages': 'en'
-}
+const prefs = { 'intl.accept_languages': 'en' }
 process.env.LANG = 'en'
 
+// https://github.com/mozilla/geckodriver/issues/1354#issuecomment-479456411
+process.env.MOZ_HEADLESS_WIDTH = '1280'
+process.env.MOZ_HEADLESS_HEIGHT = '1024'
+
+const windowSizeArg = `--window-size=${process.env.MOZ_HEADLESS_WIDTH},${process.env.MOZ_HEADLESS_HEIGHT}`
+
 module.exports = {
   config: {
     ...mainConfig,
@@ -18,7 +22,7 @@ module.exports = {
       {
         browserName: 'chrome',
         'goog:chromeOptions': {
-          args: [ '--headless', '--disable-gpu', '--window-size=1280,1024' ],
+          args: [ '--headless', '--disable-gpu', windowSizeArg ],
           prefs
         }
       },
@@ -26,7 +30,7 @@ module.exports = {
         browserName: 'firefox',
         'moz:firefoxOptions': {
           binary: '/usr/bin/firefox-developer-edition',
-          args: [ '--headless', '--window-size=1280,1024' ],
+          args: [ '--headless', windowSizeArg ],
 
           prefs
         }
diff --git a/client/package.json b/client/package.json
index 53fb02d12..9bad50362 100644
--- a/client/package.json
+++ b/client/package.json
@@ -86,7 +86,7 @@
     "cache-chunk-store": "^3.0.0",
     "chart.js": "^3.8.0",
     "chartjs-plugin-zoom": "~1.2.1",
-    "chromedriver": "^107.0.3",
+    "chromedriver": "^110.0.0",
     "core-js": "^3.22.8",
     "css-loader": "^6.2.0",
     "debug": "^4.3.1",
diff --git a/client/yarn.lock b/client/yarn.lock
index 227f6b522..d9cd8a7ef 100644
--- a/client/yarn.lock
+++ b/client/yarn.lock
@@ -3278,10 +3278,10 @@ aws4@^1.8.0:
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3"
   integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==
 
-axios@^1.1.3:
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.3.tgz#e7011384ba839b885007c9c9fae1ff23dceb295b"
-  integrity sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==
+axios@^1.2.1:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024"
+  integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==
   dependencies:
     follow-redirects "^1.15.0"
     form-data "^4.0.0"
@@ -3946,13 +3946,13 @@ chrome-trace-event@^1.0.2:
   resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
   integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
 
-chromedriver@^107.0.3:
-  version "107.0.3"
-  resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-107.0.3.tgz#330c0808bb14a53f13ab7e2b0c78adf3cdb4c14b"
-  integrity sha512-jmzpZgctCRnhYAn0l/NIjP4vYN3L8GFVbterTrRr2Ly3W5rFMb9H8EKGuM5JCViPKSit8FbE718kZTEt3Yvffg==
+chromedriver@^110.0.0:
+  version "110.0.0"
+  resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-110.0.0.tgz#d00a1a2976592d933faa8e9839e97692922834a4"
+  integrity sha512-Le6q8xrA/3fAt+g8qiN0YjsYxINIhQMC6wj9X3W5L77uN4NspEzklDrqYNwBcEVn7PcAEJ73nLlS7mTyZRspHA==
   dependencies:
     "@testim/chrome-version" "^1.1.3"
-    axios "^1.1.3"
+    axios "^1.2.1"
     compare-versions "^5.0.1"
     extract-zip "^2.0.1"
     https-proxy-agent "^5.0.1"
diff --git a/server/tests/shared/mock-servers/mock-email.ts b/server/tests/shared/mock-servers/mock-email.ts
index c518679c9..79bc22d58 100644
--- a/server/tests/shared/mock-servers/mock-email.ts
+++ b/server/tests/shared/mock-servers/mock-email.ts
@@ -1,4 +1,3 @@
-import { ChildProcess } from 'child_process'
 import MailDev from '@peertube/maildev'
 import { parallelTests, randomInt } from '@shared/core-utils'
 
@@ -6,7 +5,7 @@ class MockSmtpServer {
 
   private static instance: MockSmtpServer
   private started = false
-  private emailChildProcess: ChildProcess
+  private maildev: any
   private emails: object[]
 
   private constructor () { }
@@ -20,18 +19,18 @@ class MockSmtpServer {
         return res(undefined)
       }
 
-      const maildev = new MailDev({
+      this.maildev = new MailDev({
         ip: '127.0.0.1',
         smtp: port,
         disableWeb: true,
         silent: true
       })
 
-      maildev.on('new', email => {
+      this.maildev.on('new', email => {
         this.emails.push(email)
       })
 
-      maildev.listen(err => {
+      this.maildev.listen(err => {
         if (err) return rej(err)
 
         this.started = true
@@ -42,11 +41,11 @@ class MockSmtpServer {
   }
 
   kill () {
-    if (!this.emailChildProcess) return
+    if (!this.maildev) return
 
-    process.kill(this.emailChildProcess.pid)
+    this.maildev.shutdown()
 
-    this.emailChildProcess = null
+    this.maildev = null
     MockSmtpServer.instance = null
   }
 
diff --git a/support/doc/development/tests.md b/support/doc/development/tests.md
index 207d4f984..6eb499f0c 100644
--- a/support/doc/development/tests.md
+++ b/support/doc/development/tests.md
@@ -100,7 +100,7 @@ tail -f test1/logs/peertube.log | npm run parse-log -- --level debug --files -
 To run tests on local web browsers (comment web browsers you don't have in `client/e2e/wdio.local.conf.ts`):
 
 ```bash
-$ npm run e2e:local
+$ PEERTUBE2_E2E_PASSWORD=password npm run e2e:local
 ```
 
 ### Browserstack tests