@hashgraph/solo
Version:
An opinionated CLI tool to deploy and manage private Hedera Networks.
134 lines • 7.85 kB
JavaScript
/**
* SPDX-License-Identifier: Apache-2.0
*/
import { it, describe, before, after } from 'mocha';
import * as logging from '../../../../src/core/logging.js';
import { expect } from 'chai';
import { IntervalLease } from '../../../../src/core/lease/interval_lease.js';
import { LeaseHolder } from '../../../../src/core/lease/lease_holder.js';
import { sleep } from '../../../../src/core/helpers.js';
import { LeaseRelinquishmentError } from '../../../../src/core/lease/lease_errors.js';
import { NoopLeaseRenewalService } from './noop_lease_renewal_service.test.js';
import { Duration } from '../../../../src/core/time/duration.js';
import { container } from 'tsyringe-neo';
import { NamespaceName } from '../../../../src/core/kube/resources/namespace/namespace_name.js';
import { InjectTokens } from '../../../../src/core/dependency_injection/inject_tokens.js';
const defaultTimeout = Duration.ofMinutes(2).toMillis();
const leaseDuration = 4;
describe('Lease', async () => {
const testLogger = logging.NewLogger('debug', true);
const configManager = container.resolve(InjectTokens.ConfigManager);
const k8Factory = container.resolve(InjectTokens.K8Factory);
const testNamespace = NamespaceName.of('lease-e2e');
const renewalService = new NoopLeaseRenewalService();
before(async function () {
this.timeout(defaultTimeout);
if (await k8Factory.default().namespaces().has(testNamespace)) {
await k8Factory.default().namespaces().delete(testNamespace);
await sleep(Duration.ofSeconds(5));
}
await k8Factory.default().namespaces().create(testNamespace);
});
after(async function () {
this.timeout(defaultTimeout);
await k8Factory.default().namespaces().delete(testNamespace);
});
describe('acquire and release', async function () {
this.timeout(defaultTimeout);
it('non-expired lease', async () => {
const lease = new IntervalLease(k8Factory, renewalService, LeaseHolder.default(), testNamespace, null, leaseDuration);
await lease.acquire();
expect(await lease.isAcquired()).to.be.true;
await lease.release();
expect(await lease.isAcquired()).to.be.false;
});
it('non-expired lease held by another user should not be released', async () => {
const lease = new IntervalLease(k8Factory, renewalService, LeaseHolder.default(), testNamespace, null, leaseDuration);
const newLease = new IntervalLease(k8Factory, renewalService, LeaseHolder.of('other'), testNamespace, null, leaseDuration);
await lease.acquire();
expect(await lease.isAcquired()).to.be.true;
expect(await lease.isExpired()).to.be.false;
expect(newLease.release()).to.be.rejectedWith(LeaseRelinquishmentError);
expect(await lease.isAcquired()).to.be.true;
expect(await lease.isExpired()).to.be.false;
await lease.release();
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.false;
});
it('expired lease held by another user should be released', async () => {
const lease = new IntervalLease(k8Factory, renewalService, LeaseHolder.default(), testNamespace, null, leaseDuration);
const newLease = new IntervalLease(k8Factory, renewalService, LeaseHolder.of('other'), testNamespace, null, leaseDuration);
await lease.acquire();
expect(await lease.isAcquired()).to.be.true;
expect(await lease.isExpired()).to.be.false;
await sleep(Duration.ofSeconds(lease.durationSeconds).plusSeconds(1));
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.true;
await newLease.release();
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.false;
});
it('expired lease should be released', async () => {
const lease = new IntervalLease(k8Factory, renewalService, LeaseHolder.default(), testNamespace, null, leaseDuration);
await lease.acquire();
expect(await lease.isAcquired()).to.be.true;
await sleep(Duration.ofSeconds(lease.durationSeconds).plusSeconds(1));
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.true;
await lease.release();
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.false;
});
});
describe('tryAcquire and tryRelease', async function () {
this.timeout(defaultTimeout);
it('non-expired lease', async () => {
const lease = new IntervalLease(k8Factory, renewalService, LeaseHolder.default(), testNamespace, null, leaseDuration);
expect(await lease.tryAcquire()).to.be.true;
expect(await lease.isAcquired()).to.be.true;
expect(await lease.isExpired()).to.be.false;
expect(await lease.tryRelease()).to.be.true;
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.false;
});
it('non-expired lease held by another user should not be released', async () => {
const lease = new IntervalLease(k8Factory, renewalService, LeaseHolder.default(), testNamespace, null, leaseDuration);
const newLease = new IntervalLease(k8Factory, renewalService, LeaseHolder.of('other'), testNamespace, null, leaseDuration);
expect(await lease.tryAcquire()).to.be.true;
expect(await lease.isAcquired()).to.be.true;
expect(await lease.isExpired()).to.be.false;
expect(await newLease.tryRelease()).to.be.false;
expect(await lease.isAcquired()).to.be.true;
expect(await lease.isExpired()).to.be.false;
expect(await lease.tryRelease()).to.be.true;
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.false;
});
it('expired lease held by another user should be released', async () => {
const lease = new IntervalLease(k8Factory, renewalService, LeaseHolder.default(), testNamespace, null, leaseDuration);
const newLease = new IntervalLease(k8Factory, renewalService, LeaseHolder.of('other'), testNamespace, null, leaseDuration);
expect(await lease.tryAcquire()).to.be.true;
expect(await lease.isAcquired()).to.be.true;
expect(await lease.isExpired()).to.be.false;
await sleep(Duration.ofSeconds(lease.durationSeconds).plusSeconds(1));
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.true;
expect(await newLease.tryRelease()).to.be.true;
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.false;
});
it('expired lease should be released', async () => {
const lease = new IntervalLease(k8Factory, renewalService, LeaseHolder.default(), testNamespace, null, leaseDuration);
expect(await lease.tryAcquire()).to.be.true;
expect(await lease.isAcquired()).to.be.true;
expect(await lease.isExpired()).to.be.false;
await sleep(Duration.ofSeconds(lease.durationSeconds).plusSeconds(1));
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.true;
expect(await lease.tryRelease()).to.be.true;
expect(await lease.isAcquired()).to.be.false;
expect(await lease.isExpired()).to.be.false;
});
});
});
//# sourceMappingURL=lease.test.js.map