mirror of
https://github.com/balena-os/balena-supervisor.git
synced 2024-12-22 15:02:23 +00:00
213 lines
4.6 KiB
TypeScript
213 lines
4.6 KiB
TypeScript
|
import { assert, expect } from 'chai';
|
||
|
|
||
|
import * as semver from 'balena-semver';
|
||
|
|
||
|
import * as constants from '../src/lib/constants';
|
||
|
import { containerContractsFulfilled } from '../src/lib/contracts';
|
||
|
import * as osRelease from '../src/lib/os-release';
|
||
|
import supervisorVersion = require('../src/lib/supervisor-version');
|
||
|
|
||
|
describe('Container contracts', () => {
|
||
|
// Because the supervisor version will change whenever the
|
||
|
// package.json will, we generate values which are above
|
||
|
// and below the current value, and use these to reason
|
||
|
// about the contract engine results
|
||
|
const supervisorVersionGreater = `${semver.major(supervisorVersion)! +
|
||
|
1}.0.0`;
|
||
|
const supervisorVersionLesser = `${semver.major(supervisorVersion)! - 1}.0.0`;
|
||
|
|
||
|
before(async () => {
|
||
|
// We ensure that the versions we're using for testing
|
||
|
// are the same as the time of implementation, otherwise
|
||
|
// these tests could fail or succeed when they shouldn't
|
||
|
expect(await osRelease.getOSSemver(constants.hostOSVersionPath)).to.equal(
|
||
|
'2.0.6',
|
||
|
);
|
||
|
assert(semver.gt(supervisorVersionGreater, supervisorVersion));
|
||
|
assert(semver.lt(supervisorVersionLesser, supervisorVersion));
|
||
|
});
|
||
|
|
||
|
it('Should correctly run containers with no requirements', async () => {
|
||
|
expect(
|
||
|
await containerContractsFulfilled([
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container',
|
||
|
slug: 'user-container',
|
||
|
},
|
||
|
]),
|
||
|
).to.equal(true);
|
||
|
expect(
|
||
|
await containerContractsFulfilled([
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container',
|
||
|
slug: 'user-container1',
|
||
|
},
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container',
|
||
|
slug: 'user-container2',
|
||
|
},
|
||
|
]),
|
||
|
).to.equal(true);
|
||
|
});
|
||
|
|
||
|
it('should correctly run containers whose requirements are satisfied', async () => {
|
||
|
expect(
|
||
|
await containerContractsFulfilled([
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container',
|
||
|
slug: 'user-container',
|
||
|
requires: [
|
||
|
{
|
||
|
type: 'sw.os',
|
||
|
version: '>2.0.0',
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]),
|
||
|
).to.equal(true);
|
||
|
|
||
|
expect(
|
||
|
await containerContractsFulfilled([
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container',
|
||
|
slug: 'user-container',
|
||
|
requires: [
|
||
|
{
|
||
|
type: 'sw.supervisor',
|
||
|
version: `<${supervisorVersionGreater}`,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]),
|
||
|
).to.equal(true);
|
||
|
expect(
|
||
|
await containerContractsFulfilled([
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container',
|
||
|
slug: 'user-container',
|
||
|
requires: [
|
||
|
{
|
||
|
type: 'sw.supervisor',
|
||
|
version: `>${supervisorVersionLesser}`,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]),
|
||
|
).to.equal(true);
|
||
|
expect(
|
||
|
await containerContractsFulfilled([
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container',
|
||
|
slug: 'user-container',
|
||
|
requires: [
|
||
|
{
|
||
|
type: 'sw.supervisor',
|
||
|
version: `>${supervisorVersionLesser}`,
|
||
|
},
|
||
|
{
|
||
|
type: 'sw.os',
|
||
|
version: '<3.0.0',
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]),
|
||
|
).to.equal(true);
|
||
|
expect(
|
||
|
await containerContractsFulfilled([
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container1',
|
||
|
slug: 'user-container1',
|
||
|
requires: [
|
||
|
{
|
||
|
type: 'sw.supervisor',
|
||
|
version: `>${supervisorVersionLesser}`,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container1',
|
||
|
slug: 'user-container1',
|
||
|
requires: [
|
||
|
{
|
||
|
type: 'sw.os',
|
||
|
version: '<3.0.0',
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]),
|
||
|
).to.equal(true);
|
||
|
});
|
||
|
|
||
|
it('Should refuse to run containers whose requirements are not satisfied', async () => {
|
||
|
expect(
|
||
|
await containerContractsFulfilled([
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container',
|
||
|
slug: 'user-container',
|
||
|
requires: [
|
||
|
{
|
||
|
type: 'sw.os',
|
||
|
version: '>=3.0.0',
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]),
|
||
|
).to.equal(false);
|
||
|
expect(
|
||
|
await containerContractsFulfilled([
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container2',
|
||
|
slug: 'user-container2',
|
||
|
requires: [
|
||
|
{
|
||
|
type: 'sw.supervisor',
|
||
|
version: `>=${supervisorVersionLesser}`,
|
||
|
},
|
||
|
{
|
||
|
type: 'sw.os',
|
||
|
version: '>3.0.0',
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]),
|
||
|
).to.equal(false);
|
||
|
expect(
|
||
|
await containerContractsFulfilled([
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container1',
|
||
|
slug: 'user-container1',
|
||
|
requires: [
|
||
|
{
|
||
|
type: 'sw.supervisor',
|
||
|
version: `>=${supervisorVersionLesser}`,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
type: 'sw.container',
|
||
|
name: 'user-container2',
|
||
|
slug: 'user-container2',
|
||
|
requires: [
|
||
|
{
|
||
|
type: 'sw.supervisor',
|
||
|
version: `<=${supervisorVersionLesser}`,
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
]),
|
||
|
).to.equal(false);
|
||
|
});
|
||
|
});
|