summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gui/package.json2
-rw-r--r--gui/src/renderer/components/ConnectionPanel.tsx2
-rw-r--r--gui/test/e2e/installed/playwright.config.ts2
-rw-r--r--gui/test/e2e/installed/state-dependent/disconnected.spec.ts4
-rw-r--r--gui/test/e2e/installed/state-dependent/login.spec.ts4
-rw-r--r--gui/test/e2e/installed/state-dependent/tunnel-state.spec.ts63
-rw-r--r--gui/test/e2e/mocked/tunnel-state.spec.ts12
-rw-r--r--gui/test/e2e/shared/tunnel-state.ts30
8 files changed, 60 insertions, 59 deletions
diff --git a/gui/package.json b/gui/package.json
index 0d8fadc2f8..12b15be57d 100644
--- a/gui/package.json
+++ b/gui/package.json
@@ -98,7 +98,7 @@
"e2e": "npm run build && npm run e2e:no-build",
"e2e:no-build": "xvfb-maybe -- playwright test mocked",
"e2e:sequential": "npm run build && npm run e2e:sequential:no-build",
- "e2e:sequential:no-build": "xvfb-maybe -- playwright test --workers 1",
+ "e2e:sequential:no-build": "xvfb-maybe -- playwright test -c test/e2e/installed/playwright.config.ts --workers 1",
"e2e:update-snapshots": "npm run e2e:no-build -- --update-snapshots",
"develop": "gulp develop",
"test": "cross-env NODE_ENV=test electron-mocha --renderer --reporter spec --require ts-node/register --require \"test/unit/setup.ts\" \"test/unit/**/*.{ts,tsx}\"",
diff --git a/gui/src/renderer/components/ConnectionPanel.tsx b/gui/src/renderer/components/ConnectionPanel.tsx
index a366a9058d..07547363a0 100644
--- a/gui/src/renderer/components/ConnectionPanel.tsx
+++ b/gui/src/renderer/components/ConnectionPanel.tsx
@@ -111,7 +111,7 @@ export default class ConnectionPanel extends React.Component<IProps> {
{entryPoint && (
<Row>
<Caption>{messages.pgettext('connection-info', 'In')}</Caption>
- <Text>
+ <Text data-testid="in-ip">
{`${entryPoint.ip}:${entryPoint.port} ${entryPoint.protocol.toUpperCase()}`}
</Text>
</Row>
diff --git a/gui/test/e2e/installed/playwright.config.ts b/gui/test/e2e/installed/playwright.config.ts
index 209838beb1..9c1fa7fb87 100644
--- a/gui/test/e2e/installed/playwright.config.ts
+++ b/gui/test/e2e/installed/playwright.config.ts
@@ -4,6 +4,8 @@ export default defineConfig({
testDir: process.cwd(),
timeout: 60_000,
workers: 1,
+ reportSlowTests: null,
+ maxFailures: 1,
expect: {
timeout: 30_000,
},
diff --git a/gui/test/e2e/installed/state-dependent/disconnected.spec.ts b/gui/test/e2e/installed/state-dependent/disconnected.spec.ts
index a26b61279c..360a88338d 100644
--- a/gui/test/e2e/installed/state-dependent/disconnected.spec.ts
+++ b/gui/test/e2e/installed/state-dependent/disconnected.spec.ts
@@ -1,6 +1,6 @@
import { test } from '@playwright/test';
import { Page } from 'playwright';
-import { assertDisconnected } from '../../shared/tunnel-state';
+import { expectDisconnected } from '../../shared/tunnel-state';
import { startInstalledApp } from '../installed-utils';
@@ -18,5 +18,5 @@ test.afterAll(async () => {
});
test('App should show disconnected tunnel state', async () => {
- await assertDisconnected(page);
+ await expectDisconnected(page);
});
diff --git a/gui/test/e2e/installed/state-dependent/login.spec.ts b/gui/test/e2e/installed/state-dependent/login.spec.ts
index b860de010c..4c6bc76dd4 100644
--- a/gui/test/e2e/installed/state-dependent/login.spec.ts
+++ b/gui/test/e2e/installed/state-dependent/login.spec.ts
@@ -5,7 +5,7 @@ import { RoutePath } from '../../../../src/renderer/lib/routes';
import { TestUtils } from '../../utils';
import { startInstalledApp } from '../installed-utils';
-import { assertDisconnected } from '../../shared/tunnel-state';
+import { expectDisconnected } from '../../shared/tunnel-state';
// This test expects the daemon to be logged out.
// Env parameters:
@@ -87,7 +87,7 @@ test('App should log in', async () => {
await expect(subtitle).toHaveText('Valid account number');
expect(await util.waitForNavigation()).toEqual(RoutePath.main);
- await assertDisconnected(page);
+ await expectDisconnected(page);
});
test('App should log out', async () => {
diff --git a/gui/test/e2e/installed/state-dependent/tunnel-state.spec.ts b/gui/test/e2e/installed/state-dependent/tunnel-state.spec.ts
index b2c196b8dd..00535ad863 100644
--- a/gui/test/e2e/installed/state-dependent/tunnel-state.spec.ts
+++ b/gui/test/e2e/installed/state-dependent/tunnel-state.spec.ts
@@ -3,13 +3,10 @@ import { promisify } from 'util';
import { expect, test } from '@playwright/test';
import { Page } from 'playwright';
import {
- assertConnected,
- assertConnectedPq,
- assertConnecting,
- assertConnectingPq,
- assertDisconnected,
- assertDisconnecting,
- assertError,
+ expectConnected,
+ expectConnectedPq,
+ expectDisconnected,
+ expectError,
} from '../../shared/tunnel-state';
import { startInstalledApp } from '../installed-utils';
@@ -34,14 +31,12 @@ test.afterAll(async () => {
});
test('App should show disconnected tunnel state', async () => {
- await assertDisconnected(page);
+ await expectDisconnected(page);
});
test('App should connect', async () => {
await page.getByText('Secure my connection').click();
-
- await assertConnecting(page);
- await assertConnected(page);
+ await expectConnected(page);
const relay = page.getByTestId('hostname-line');
const inIp = page.locator(':text("In") + span');
@@ -63,28 +58,30 @@ test('App should connect', async () => {
});
test('App should show correct WireGuard port', async () => {
- const inData = page.locator(':text("In") + span');
+ const inData = page.getByTestId('in-ip');
await expect(inData).toContainText(new RegExp(':[0-9]+'));
await exec('mullvad relay set tunnel wireguard --port=53');
- await assertConnected(page);
+ await expectConnected(page);
await expect(inData).toContainText(new RegExp(':53'));
await exec('mullvad relay set tunnel wireguard --port=51820');
- await assertConnected(page);
+ await expectConnected(page);
await expect(inData).toContainText(new RegExp(':51820'));
await exec('mullvad relay set tunnel wireguard --port=any');
});
test('App should show correct WireGuard transport protocol', async () => {
- const inData = page.locator(':text("In") + span');
+ const inData = page.getByTestId('in-ip');
await exec('mullvad obfuscation set mode udp2tcp');
+ await expectConnected(page);
await expect(inData).toContainText(new RegExp('TCP'));
await exec('mullvad obfuscation set mode off');
+ await expectConnected(page);
await expect(inData).toContainText(new RegExp('UDP$'));
});
@@ -94,33 +91,34 @@ test('App should show correct tunnel protocol', async () => {
await exec('mullvad relay set tunnel-protocol openvpn');
await exec('mullvad relay set location se');
- await assertConnected(page);
+ await expectConnected(page);
await expect(tunnelProtocol).toHaveText('OpenVPN');
});
test('App should show correct OpenVPN transport protocol and port', async () => {
- const inData = page.locator(':text("In") + span');
+ const inData = page.getByTestId('in-ip');
await expect(inData).toContainText(new RegExp(':[0-9]+'));
await expect(inData).toContainText(new RegExp('(TCP|UDP)$'));
await exec('mullvad relay set tunnel openvpn --transport-protocol udp --port 1195');
- await assertConnected(page);
+ await expectConnected(page);
await expect(inData).toContainText(new RegExp(':1195'));
await exec('mullvad relay set tunnel openvpn --transport-protocol udp --port 1300');
- await assertConnected(page);
+ await expectConnected(page);
await expect(inData).toContainText(new RegExp(':1300'));
await exec('mullvad relay set tunnel openvpn --transport-protocol tcp --port any');
+ await expectConnected(page);
await expect(inData).toContainText(new RegExp(':[0-9]+'));
await expect(inData).toContainText(new RegExp('TCP$'));
await exec('mullvad relay set tunnel openvpn --transport-protocol tcp --port 80');
- await assertConnected(page);
+ await expectConnected(page);
await expect(inData).toContainText(new RegExp(':80'));
await exec('mullvad relay set tunnel openvpn --transport-protocol tcp --port 443');
- await assertConnected(page);
+ await expectConnected(page);
await expect(inData).toContainText(new RegExp(':443'));
await exec('mullvad relay set tunnel openvpn --transport-protocol any');
@@ -128,6 +126,7 @@ test('App should show correct OpenVPN transport protocol and port', async () =>
test('App should show bridge mode', async () => {
await exec('mullvad bridge set state on');
+ await expectConnected(page);
const relay = page.getByTestId('hostname-line');
await expect(relay).toHaveText(new RegExp(' via ', 'i'));
await exec('mullvad bridge set state off');
@@ -137,27 +136,27 @@ test('App should show bridge mode', async () => {
test('App should enter blocked state', async () => {
await exec('mullvad relay set location xx');
- await assertError(page);
+ await expectError(page);
- await exec(`mullvad relay set hostname ${process.env.HOSTNAME}`);
- await assertConnected(page);
+ await exec(`mullvad relay set location ${process.env.HOSTNAME}`);
+ await expectConnected(page);
});
test('App should disconnect', async () => {
await page.getByText('Disconnect').click();
- await assertDisconnected(page);
+ await expectDisconnected(page);
});
test('App should create quantum secure connection', async () => {
await exec('mullvad tunnel set wireguard --quantum-resistant on');
await page.getByText('Secure my connection').click();
- await assertConnectingPq(page);
- await assertConnectedPq(page);
+ await expectConnectedPq(page);
});
test('App should show multihop', async () => {
await exec('mullvad relay set tunnel wireguard --use-multihop=on');
+ await expectConnectedPq(page);
const relay = page.getByTestId('hostname-line');
await expect(relay).toHaveText(new RegExp('^' + escapeRegExp(`${process.env.HOSTNAME} via`), 'i'));
await exec('mullvad relay set tunnel wireguard --use-multihop=off');
@@ -168,10 +167,10 @@ test('App should show multihop', async () => {
test('App should become connected when other frontend connects', async () => {
- await assertDisconnected(page);
- await Promise.all([assertConnecting(page), exec('mullvad connect')]);
- await assertConnected(page);
+ await expectDisconnected(page);
+ await exec('mullvad connect');
+ await expectConnected(page);
- await Promise.all([assertDisconnecting(page), exec('mullvad disconnect')]);
- await assertDisconnected(page);
+ await exec('mullvad disconnect');
+ await expectDisconnected(page);
});
diff --git a/gui/test/e2e/mocked/tunnel-state.spec.ts b/gui/test/e2e/mocked/tunnel-state.spec.ts
index c729fa27af..db919e09d3 100644
--- a/gui/test/e2e/mocked/tunnel-state.spec.ts
+++ b/gui/test/e2e/mocked/tunnel-state.spec.ts
@@ -3,7 +3,7 @@ import { Page } from 'playwright';
import { MockedTestUtils, startMockedApp } from './mocked-utils';
import { ErrorStateCause, ILocation, ITunnelEndpoint, TunnelState } from '../../../src/shared/daemon-rpc-types';
-import { assertConnected, assertConnecting, assertDisconnected, assertDisconnecting, assertError } from '../shared/tunnel-state';
+import { expectConnected, expectConnecting, expectDisconnected, expectDisconnecting, expectError } from '../shared/tunnel-state';
const mockLocation: ILocation = {
country: 'Sweden',
@@ -36,7 +36,7 @@ test('App should show disconnected tunnel state', async () => {
channel: 'tunnel-',
response: { state: 'disconnected' },
});
- await assertDisconnected(page);
+ await expectDisconnected(page);
});
/**
@@ -51,7 +51,7 @@ test('App should show connecting tunnel state', async () => {
channel: 'tunnel-',
response: { state: 'connecting' },
});
- await assertConnecting(page);
+ await expectConnecting(page);
});
/**
@@ -75,7 +75,7 @@ test('App should show connected tunnel state', async () => {
response: { state: 'connected', details: { endpoint, location } },
});
- await assertConnected(page);
+ await expectConnected(page);
});
/**
@@ -90,7 +90,7 @@ test('App should show disconnecting tunnel state', async () => {
channel: 'tunnel-',
response: { state: 'disconnecting', details: 'nothing' },
});
- await assertDisconnecting(page);
+ await expectDisconnecting(page);
});
/**
@@ -105,5 +105,5 @@ test('App should show error tunnel state', async () => {
channel: 'tunnel-',
response: { state: 'error', details: { cause: ErrorStateCause.isOffline } },
});
- await assertError(page);
+ await expectError(page);
});
diff --git a/gui/test/e2e/shared/tunnel-state.ts b/gui/test/e2e/shared/tunnel-state.ts
index 09cbcd4999..db7b7e3658 100644
--- a/gui/test/e2e/shared/tunnel-state.ts
+++ b/gui/test/e2e/shared/tunnel-state.ts
@@ -13,8 +13,8 @@ const SECURE_BUTTON_COLOR = anyOf(colors.green, colors.green90);
const getLabel = (page: Page) => page.locator('span[role="status"]');
const getHeader = (page: Page) => page.locator('header');
-export async function assertDisconnected(page: Page) {
- await assertTunnelState(page, {
+export async function expectDisconnected(page: Page) {
+ await expectTunnelState(page, {
labelText: 'unsecured connection',
labelColor: UNSECURED_COLOR,
headerColor: UNSECURED_COLOR,
@@ -23,8 +23,8 @@ export async function assertDisconnected(page: Page) {
});
}
-export async function assertConnecting(page: Page) {
- await assertTunnelState(page, {
+export async function expectConnecting(page: Page) {
+ await expectTunnelState(page, {
labelText: 'creating secure connection',
labelColor: WHITE_COLOR,
headerColor: SECURE_COLOR,
@@ -33,8 +33,8 @@ export async function assertConnecting(page: Page) {
});
}
-export async function assertConnected(page: Page) {
- await assertTunnelState(page, {
+export async function expectConnected(page: Page) {
+ await expectTunnelState(page, {
labelText: 'secure connection',
labelColor: SECURE_COLOR,
headerColor: SECURE_COLOR,
@@ -43,24 +43,24 @@ export async function assertConnected(page: Page) {
});
}
-export async function assertDisconnecting(page: Page) {
- await assertTunnelState(page, {
+export async function expectDisconnecting(page: Page) {
+ await expectTunnelState(page, {
headerColor: UNSECURED_COLOR,
buttonText: 'secure my connection',
buttonColor: SECURE_BUTTON_COLOR,
});
}
-export async function assertError(page: Page) {
- await assertTunnelState(page, {
+export async function expectError(page: Page) {
+ await expectTunnelState(page, {
labelText: 'blocked connection',
labelColor: WHITE_COLOR,
headerColor: SECURE_COLOR,
});
}
-export async function assertConnectingPq(page: Page) {
- await assertTunnelState(page, {
+export async function expectConnectingPq(page: Page) {
+ await expectTunnelState(page, {
labelText: 'creating quantum secure connection',
labelColor: WHITE_COLOR,
headerColor: SECURE_COLOR,
@@ -69,8 +69,8 @@ export async function assertConnectingPq(page: Page) {
});
}
-export async function assertConnectedPq(page: Page) {
- await assertTunnelState(page, {
+export async function expectConnectedPq(page: Page) {
+ await expectTunnelState(page, {
labelText: 'quantum secure connection',
labelColor: SECURE_COLOR,
headerColor: SECURE_COLOR,
@@ -87,7 +87,7 @@ interface TunnelStateContent {
buttonColor?: string | RegExp;
}
-export async function assertTunnelState(page: Page, content: TunnelStateContent) {
+export async function expectTunnelState(page: Page, content: TunnelStateContent) {
const statusLabel = getLabel(page);
if (content.labelText && content.labelColor) {
await expect(statusLabel).toContainText(new RegExp(content.labelText, 'i'));