Skip to content
Closed
Show file tree
Hide file tree
Changes from 13 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .evergreen/buildvariants-and-tasks.in.yml
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,7 @@ tasks:
- func: bootstrap
vars:
scope: 'compass-e2e-tests'
- func: spawn-compass-mongodb-com
- func: smoketest-packaged-app
vars:
mongodb_version: latest-enterprise
Expand Down
1 change: 1 addition & 0 deletions .evergreen/buildvariants-and-tasks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,7 @@ tasks:
- func: bootstrap
vars:
scope: compass-e2e-tests
- func: spawn-compass-mongodb-com
- func: smoketest-packaged-app
vars:
mongodb_version: latest-enterprise
Expand Down
16 changes: 16 additions & 0 deletions .evergreen/functions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,22 @@ functions:

npm run --unsafe-perm --workspace compass-e2e-tests test-packaged-ci

spawn-compass-mongodb-com:
- command: git.get_project
type: system
params:
directory: compass-mongodb-com
- command: shell.exec
type: setup
params:
working_dir: src
shell: bash
script: |
set -e

docker build -t compass/web ./
docker run -p 8080:8080 -t -e PORT=8080 -e UPDATE_CHECKER_ALLOW_DOWNGRADES=true -d compass/web
Copy link
Contributor Author

@lerouxb lerouxb Jan 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The plan is to run two of these: One that will downgrade the newly packaged compass to the most recent release like this, the other will upgrade from the most recent release to this newly packaged one. This newly packaged version isn't released yet, so we'll have to make some changes to compass-mongodb-com to be able to tell it about the new package. See https://jira.mongodb.org/browse/COMPASS-8761


smoketest-packaged-app:
- command: shell.exec
# Fail the task if it's idle for 10 mins
Expand Down
6 changes: 3 additions & 3 deletions .evergreen/preinstall.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ echo "APPDATA: $APPDATA"
echo "PATH: $PATH"

# these are super useful if you want to run the smoke tests locally
echo "DEV_VERSION_IDENTIFIER: $DEV_VERSION_IDENTIFIER"
echo "EVERGREEN_BUCKET_NAME: $EVERGREEN_BUCKET_NAME"
echo "EVERGREEN_BUCKET_KEY_PREFIX: $EVERGREEN_BUCKET_KEY_PREFIX"
echo "export DEV_VERSION_IDENTIFIER=$DEV_VERSION_IDENTIFIER"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to make it easy to copy/paste these into your local shell when working on the smoketests. Otherwise you have to transform the string manually every time.

echo "export EVERGREEN_BUCKET_KEY_PREFIX=$EVERGREEN_BUCKET_KEY_PREFIX"
echo "export EVERGREEN_BUCKET_NAME=$EVERGREEN_BUCKET_NAME"

echo "IS_OSX: $IS_OSX"
echo "IS_LINUX: $IS_LINUX"
Expand Down
8 changes: 8 additions & 0 deletions packages/compass-e2e-tests/helpers/selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1430,3 +1430,11 @@ export const GlobalWrites = {
SampleFindingDocuments: '[data-testid="sample-finding-documents"]',
SampleInsertingDocuments: '[data-testid="sample-inserting-documents"]',
};

export const AutoUpdateToast = '[data-testid="toast-compass-update"]';
export const AutoUpdateRestartButton =
'[data-testid="auto-update-restart-button"]';
export const AutoUpdateDownloadLink =
'[data-testid="auto-update-download-link"]';
export const AutoUpdateReleaseNotesLink =
'[data-testid="auto-update-release-notes-link"]';
12 changes: 12 additions & 0 deletions packages/compass-e2e-tests/installers/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,20 @@ export function execute(
): Promise<void> {
return new Promise((resolve, reject) => {
console.log(command, ...args);

const p = spawn(command, args, {
stdio: 'inherit',
...options,
});

p.on('error', (err: any) => {
reject(err);
});

p.on('close', (code: number | null, signal: NodeJS.Signals | null) => {
process.off('exit', killChild);
process.off('SIGINT', interruptChild);

if (code !== null) {
if (code === 0) {
resolve();
Expand All @@ -41,5 +47,11 @@ export function execute(
}
}
});

// Exit child process if main process exits
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copied from https://github.com/kraenhansen/bufout which we should probably just use.

const killChild = () => p.kill();
const interruptChild = () => p.kill('SIGINT');
process.once('exit', killChild);
process.once('SIGINT', interruptChild);
});
}
1 change: 1 addition & 0 deletions packages/compass-e2e-tests/installers/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export type Package = {
packageFilepath: string;
// TODO: once we can download the most recent release
//releaseFilepath: string;
updatable: boolean;
installer: Installer;
};

Expand Down
51 changes: 11 additions & 40 deletions packages/compass-e2e-tests/smoke-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@ import { hideBin } from 'yargs/helpers';
import https from 'https';
import { pick } from 'lodash';
import { handler as writeBuildInfo } from 'hadron-build/commands/info';
import type { InstalledAppInfo, Package, Installer } from './installers/types';
import type { Package, Installer } from './installers/types';
import { installMacDMG } from './installers/mac-dmg';
import { execute } from './installers/helpers';
import {
assertBuildInfoIsOSX,
assertBuildInfoIsRHEL,
assertBuildInfoIsUbuntu,
assertBuildInfoIsWindows,
assertCommonBuildInfo,
} from './helpers/buildinfo';
import { testAutoUpdateFrom } from './smoketests/auto-update-from';

const SUPPORTED_PLATFORMS = ['win32', 'darwin', 'linux'] as const;
const SUPPORTED_ARCHS = ['x64', 'arm64'] as const;
Expand Down Expand Up @@ -232,13 +232,15 @@ async function run() {
}

if (match) {
const pkg = {
const pkg: Package = {
// we need appName because it is the name of the executable inside the
// package, regardless of what the package filename is named or where it
// gets installed
appName: buildInfo.productName,
packageFilepath: path.join(compassDir, 'dist', match.filename),
// TODO: releaseFilepath once we download the most recent released version too
updatable: match.updatable,
// TODO(COMPASS-8532): releaseFilepath once we download the most recent
// released version too
installer: match.installer,
};

Expand All @@ -252,7 +254,8 @@ async function run() {
console.log(url);
await downloadFile(url, pkg.packageFilepath);

// TODO: we need to also download releaseFilepath once we have that
// TODO(COMPASS-8532): we need to also download releaseFilepath once we
// have that
}

if (!existsSync(pkg.packageFilepath)) {
Expand All @@ -261,16 +264,9 @@ async function run() {
);
}

// TODO: installing either the packaged file or the released file is better
// done as part of tests so we can also clean up and install one after the
// other, but that's for a separate PR.
console.log('installing', pkg.packageFilepath);
const installedInfo = await pkg.installer({
appName: pkg.appName,
filepath: pkg.packageFilepath,
});
console.log('testing', installedInfo.appPath);
await testInstalledApp(pkg, installedInfo);
await testAutoUpdateFrom(pkg);
// TODO(COMPASS-8535)
//await testAutoUpdateTo(pkg);
} else {
throw new Error(`${context.package} not implemented`);
}
Expand Down Expand Up @@ -308,31 +304,6 @@ async function downloadFile(url: string, targetFile: string): Promise<void> {
});
}

function testInstalledApp(
pkg: Package,
appInfo: InstalledAppInfo
): Promise<void> {
return execute(
'npm',
[
'run',
'--unsafe-perm',
'test-packaged',
'--workspace',
'compass-e2e-tests',
'--',
'--test-filter=time-to-first-query',
],
{
env: {
...process.env,
COMPASS_APP_NAME: pkg.appName,
COMPASS_APP_PATH: appInfo.appPath,
},
}
);
}

run()
.then(function () {
console.log('done');
Expand Down
52 changes: 52 additions & 0 deletions packages/compass-e2e-tests/smoketests/auto-update-from.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { execute } from '../installers/helpers';
import type { Package } from '../installers/types';

// TODO: move this since we'll use the same for testing TO
function testInstalledApp(
pkg: Package,
appPath: string,
env: Record<string, string>
): Promise<void> {
return execute(
'npm',
[
'run',
'--unsafe-perm',
'test-packaged',
'--workspace',
'compass-e2e-tests',
'--',
'--test-filter=auto-update',
],
{
env: {
...process.env,
HADRON_AUTO_UPDATE_ENDPOINT_OVERRIDE: 'http://localhost:8080',
AUTO_UPDATE_UPDATABLE: pkg.updatable.toString(),
COMPASS_APP_NAME: pkg.appName,
COMPASS_APP_PATH: appPath,
...env,
},
}
);
}

export async function testAutoUpdateFrom(pkg: Package) {
// install the app
console.log(`installing ${pkg.packageFilepath}`);
const { appPath, uninstall } = await pkg.installer({
appName: pkg.appName,
filepath: pkg.packageFilepath,
});

console.log(appPath);

try {
await testInstalledApp(pkg, appPath, {
AUTO_UPDATE_FROM: 'true',
});
} finally {
// remove the app
await uninstall();
}
}
75 changes: 75 additions & 0 deletions packages/compass-e2e-tests/tests/auto-update.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { expect } from 'chai';
import {
init,
cleanup,
Selectors,
screenshotPathName,
} from '../helpers/compass';

describe('Auto-update', function () {
it('auto-update from', async function () {
if (!process.env.AUTO_UPDATE_FROM) {
// we don't want this test to execute along with all the others under
// normal circumstances because it is destructive - it overwrites Compass
// itself
this.skip();
}

// run the app and wait for it to auto-update
const compass = await init('auto-update from', { firstRun: true });
const { browser } = compass;
try {
await browser.$(Selectors.AutoUpdateToast).waitForDisplayed();

if (process.env.AUTO_UPDATE_UPDATABLE === 'true') {
const restartButton = browser.$(Selectors.AutoUpdateRestartButton);
await restartButton.waitForDisplayed();

// We could click the restart button to apply the update and restart the
// app, but restarting the app confuses webdriverio or at least our test
// helpers. So we're going to just restart the app manually.
} else {
// When auto-update is not supported the toast contains a link to
// download
const linkElement = browser.$(Selectors.AutoUpdateDownloadLink);
await linkElement.waitForDisplayed();
expect(await linkElement.getAttribute('href')).to.equal(
'https://www.mongodb.com/try/download/compass'
);
}
} finally {
await browser.screenshot(screenshotPathName('auto-update-from'));
await cleanup(compass);
}

if (process.env.AUTO_UPDATE_UPDATABLE === 'true') {
// run the app again and check that the version changed
const compass = await init('auto-update from restart', {
firstRun: false,
});
const { browser } = compass;
try {
await browser.$(Selectors.AutoUpdateToast).waitForDisplayed();
await browser
.$(Selectors.AutoUpdateReleaseNotesLink)
.waitForDisplayed();
} finally {
await browser.screenshot(
screenshotPathName('auto-update-from-restart')
);
await cleanup(compass);
}
}
});

it('auto-update to', function () {
if (!process.env.AUTO_UPDATE_TO) {
// we don't want this test to execute along with all the others under
// normal circumstances because it is destructive - it overwrites Compass
// itself
this.skip();
}

// TODO
});
});
Loading