blob: 758f3a1f22ae6a494fad42ce83e4a8d28948de64 [file] [log] [blame]
/*---------------------------------------------------------
* Copyright 2020 The Go Authors. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------*/
import * as assert from 'assert';
import { describe, it } from 'mocha';
import * as sinon from 'sinon';
import * as vscode from 'vscode';
import moment = require('moment');
import semver = require('semver');
import WebRequest = require('web-request');
import {
getLatestGoVersions,
GoEnvironmentOption,
latestGoVersionKey,
} from '../../src/goEnvironmentStatus';
import {
getGlobalState,
setGlobalState,
updateGlobalState,
} from '../../src/stateUtils';
import { MockMemento } from '../mocks/MockMemento';
describe('#getLatestGoVersion()', function () {
this.timeout(40000);
let sandbox: sinon.SinonSandbox | undefined;
let defaultMemento: vscode.Memento;
const webrequest = sinon.mock(WebRequest);
const mmnt = sinon.mock(moment);
const now = 100000000;
const oneday = 60 * 60 * 24 * 1000; // 24 hours in milliseconds
this.beforeAll(async () => {
defaultMemento = getGlobalState();
});
this.afterAll(async () => {
setGlobalState(defaultMemento);
});
this.beforeEach(() => {
sandbox = sinon.createSandbox();
setGlobalState(new MockMemento());
webrequest.expects('json')
.withArgs('https://golang.org/dl/?mode=json')
.returns([
{
version: 'go1.15.1',
stable: true,
},
{
version: 'go1.14.2',
stable: true,
},
]);
mmnt.expects('now')
.returns(now);
});
this.afterEach(async () => {
sandbox.restore();
});
it('should get latest go versions from golang.org/dl with empty cache', async () => {
const results = await getLatestGoVersions();
const want = [
{label: 'Go 1.15.1', binpath: 'go get golang.org/dl/go1.15.1'},
{label: 'Go 1.14.2', binpath: 'go get golang.org/dl/go1.14.2'},
];
assert(results.length === want.length);
for (let i = 0; i < results.length; i ++) {
assert(results[i].label === want[i].label);
assert(results[i].binpath === want[i].binpath);
}
});
const cacheVersions = [
new GoEnvironmentOption('go get golang.org/dl/go1.14.7', 'Go 1.14.7'),
new GoEnvironmentOption('go get golang.org/dl/go1.13.2', 'Go 1.13.2'),
];
it('should get latest go versions from golang.org/dl with timed out cache', async () => {
// add a timed out cache entry
await updateGlobalState(latestGoVersionKey, {
timestamp: now - (oneday + 1), // more than one day ago
goVersions: cacheVersions,
});
// run test
const results = await getLatestGoVersions();
const want = [
{label: 'Go 1.15.1', binpath: 'go get golang.org/dl/go1.15.1'},
{label: 'Go 1.14.2', binpath: 'go get golang.org/dl/go1.14.2'},
];
// check results
assert(results.length === want.length);
for (let i = 0; i < results.length; i ++) {
assert(results[i].label === want[i].label);
assert(results[i].binpath === want[i].binpath);
}
});
it('should get latest go versions from cache', async () => {
// add a valid cache entry
await updateGlobalState(latestGoVersionKey, {
timestamp: now - (oneday - 100), // less than one day ago
goVersions: cacheVersions,
});
// run test
const results = await getLatestGoVersions();
const want = [
{label: 'Go 1.14.7', binpath: 'go get golang.org/dl/go1.14.7'},
{label: 'Go 1.13.2', binpath: 'go get golang.org/dl/go1.13.2'},
];
// check results
assert(results.length === want.length);
for (let i = 0; i < results.length; i ++) {
assert(results[i].label === want[i].label);
assert(results[i].binpath === want[i].binpath);
}
});
});