opentelemetry-js/api/test/common/internal/semver.test.ts

149 lines
4.2 KiB
TypeScript

/*
* Copyright The OpenTelemetry Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as assert from 'assert';
import {
isCompatible,
_makeCompatibilityCheck,
} from '../../../src/internal/semver';
import { VERSION } from '../../../src/version';
describe('semver', function () {
it('should be compatible if versions are equal', function () {
assert.ok(isCompatible(VERSION));
});
it('returns false if own version cannot be parsed', function () {
const check = _makeCompatibilityCheck('this is not semver');
assert.ok(!check('1.0.0'));
});
it('incompatible if other version cannot be parsed', function () {
const check = _makeCompatibilityCheck('0.1.2');
assert.ok(!check('this is not semver'));
});
describe('>= 1.0.0', function () {
const globalVersion = '5.5.5';
const vers: [string, boolean][] = [
// same major/minor run should be compatible
['5.5.5', true],
['5.5.6', true],
['5.5.4', true],
// prerelease version should not be compatible
['5.5.5-rc.0', false],
// if our version has a minor version increase, we may try to call methods which don't exist on the global
['5.6.5', false],
['5.6.6', false],
['5.6.4', false],
// if the global version is ahead of us by a minor revision, it has at least the methods we know about
['5.4.5', true],
['5.4.6', true],
['5.4.4', true],
// major version mismatch is always incompatible
['6.5.5', false],
['6.5.6', false],
['6.5.4', false],
['6.6.5', false],
['6.6.6', false],
['6.6.4', false],
['6.4.5', false],
['6.4.6', false],
['6.4.4', false],
['4.5.5', false],
['4.5.6', false],
['4.5.4', false],
['4.6.5', false],
['4.6.6', false],
['4.6.4', false],
['4.4.5', false],
['4.4.6', false],
['4.4.4', false],
];
test(globalVersion, vers);
});
describe('< 1.0.0', function () {
const globalVersion = '0.5.5';
const vers: [string, boolean][] = [
// same minor/patch should be compatible
['0.5.5', true],
// prerelease version should not be compatible
['0.5.5-rc.0', false],
// if our version has a patch version increase, we may try to call methods which don't exist on the global
['0.5.6', false],
// if the global version is ahead of us by a patch revision, it has at least the methods we know about
['0.5.4', true],
// minor version mismatch is always incompatible
['0.6.5', false],
['0.6.6', false],
['0.6.4', false],
['0.4.5', false],
['0.4.6', false],
['0.4.4', false],
// major version mismatch is always incompatible
['1.5.5', false],
['1.5.6', false],
['1.5.4', false],
['1.6.5', false],
['1.6.6', false],
['1.6.4', false],
['1.4.5', false],
['1.4.6', false],
['1.4.4', false],
];
test(globalVersion, vers);
});
describe('global version is prerelease', function () {
const globalVersion = '1.0.0-rc.3';
const vers: [string, boolean][] = [
// must match exactly
['1.0.0', false],
['1.0.0-rc.2', false],
['1.0.0-rc.4', false],
['1.0.0-rc.3', true],
];
test(globalVersion, vers);
});
});
function test(globalVersion: string, vers: [string, boolean][]) {
describe(`global version is ${globalVersion}`, function () {
for (const [version, compatible] of vers) {
it(`API version ${version} ${
compatible ? 'should' : 'should not'
} be able to access global`, function () {
const check = _makeCompatibilityCheck(version);
assert.strictEqual(check(globalVersion), compatible);
});
}
});
}