369 lines
15 KiB
JavaScript
369 lines
15 KiB
JavaScript
/**
|
|
* Unit tests for npm/install.js
|
|
* Tests that correct download patterns are selected for different OS/arch combinations
|
|
*/
|
|
|
|
/* eslint-env jest */
|
|
/* global describe, it, expect, beforeAll */
|
|
|
|
const https = require('https')
|
|
const {
|
|
isWindows7OrEarlier,
|
|
isMacOS10,
|
|
isLinuxLegacy,
|
|
getDownloadPattern
|
|
} = require('../../npm/install')
|
|
|
|
// Cache for version - fetched once from electerm website
|
|
let cachedVersion = null
|
|
|
|
async function getVersion () {
|
|
if (cachedVersion) {
|
|
return cachedVersion
|
|
}
|
|
cachedVersion = await new Promise((resolve, reject) => {
|
|
https.get('https://electerm.org/version.html', (res) => {
|
|
let data = ''
|
|
res.on('data', chunk => { data += chunk })
|
|
res.on('end', () => resolve(data.trim().replace('v', '')))
|
|
res.on('error', reject)
|
|
}).on('error', reject)
|
|
})
|
|
return cachedVersion
|
|
}
|
|
|
|
// Fetch version once before all tests
|
|
beforeAll(async () => {
|
|
await getVersion()
|
|
})
|
|
|
|
describe('npm/install.js', () => {
|
|
describe('isWindows7OrEarlier', () => {
|
|
it('should return false for non-Windows platforms', () => {
|
|
expect(isWindows7OrEarlier('darwin', '21.0.0')).toBe(false)
|
|
expect(isWindows7OrEarlier('linux', '5.4.0')).toBe(false)
|
|
})
|
|
|
|
it('should return true for Windows 7 (NT 6.1)', () => {
|
|
expect(isWindows7OrEarlier('win32', '6.1.7601')).toBe(true)
|
|
})
|
|
|
|
it('should return true for Windows Vista (NT 6.0)', () => {
|
|
expect(isWindows7OrEarlier('win32', '6.0.6000')).toBe(true)
|
|
})
|
|
|
|
it('should return true for Windows XP (NT 5.1)', () => {
|
|
expect(isWindows7OrEarlier('win32', '5.1.2600')).toBe(true)
|
|
})
|
|
|
|
it('should return false for Windows 8 (NT 6.2)', () => {
|
|
expect(isWindows7OrEarlier('win32', '6.2.9200')).toBe(false)
|
|
})
|
|
|
|
it('should return false for Windows 8.1 (NT 6.3)', () => {
|
|
expect(isWindows7OrEarlier('win32', '6.3.9600')).toBe(false)
|
|
})
|
|
|
|
it('should return false for Windows 10 (NT 10.0)', () => {
|
|
expect(isWindows7OrEarlier('win32', '10.0.19041')).toBe(false)
|
|
})
|
|
|
|
it('should return false for Windows 11 (NT 10.0)', () => {
|
|
expect(isWindows7OrEarlier('win32', '10.0.22000')).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('isMacOS10', () => {
|
|
it('should return false for non-macOS platforms', () => {
|
|
expect(isMacOS10('win32', '10.0.19041')).toBe(false)
|
|
expect(isMacOS10('linux', '5.4.0')).toBe(false)
|
|
})
|
|
|
|
it('should return true for macOS 10.15 Catalina (Darwin 19.x)', () => {
|
|
expect(isMacOS10('darwin', '19.6.0')).toBe(true)
|
|
})
|
|
|
|
it('should return true for macOS 10.14 Mojave (Darwin 18.x)', () => {
|
|
expect(isMacOS10('darwin', '18.7.0')).toBe(true)
|
|
})
|
|
|
|
it('should return true for macOS 10.13 High Sierra (Darwin 17.x)', () => {
|
|
expect(isMacOS10('darwin', '17.7.0')).toBe(true)
|
|
})
|
|
|
|
it('should return false for macOS 11 Big Sur (Darwin 20.x)', () => {
|
|
expect(isMacOS10('darwin', '20.6.0')).toBe(false)
|
|
})
|
|
|
|
it('should return false for macOS 12 Monterey (Darwin 21.x)', () => {
|
|
expect(isMacOS10('darwin', '21.6.0')).toBe(false)
|
|
})
|
|
|
|
it('should return false for macOS 13 Ventura (Darwin 22.x)', () => {
|
|
expect(isMacOS10('darwin', '22.1.0')).toBe(false)
|
|
})
|
|
|
|
it('should return false for macOS 14 Sonoma (Darwin 23.x)', () => {
|
|
expect(isMacOS10('darwin', '23.0.0')).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('isLinuxLegacy', () => {
|
|
it('should return false for non-Linux platforms', () => {
|
|
expect(isLinuxLegacy('win32', 2.31)).toBe(false)
|
|
expect(isLinuxLegacy('darwin', 2.31)).toBe(false)
|
|
})
|
|
|
|
it('should return true for glibc < 2.34', () => {
|
|
expect(isLinuxLegacy('linux', 2.31)).toBe(true)
|
|
expect(isLinuxLegacy('linux', 2.17)).toBe(true)
|
|
expect(isLinuxLegacy('linux', 2.33)).toBe(true)
|
|
})
|
|
|
|
it('should return false for glibc >= 2.34', () => {
|
|
expect(isLinuxLegacy('linux', 2.34)).toBe(false)
|
|
expect(isLinuxLegacy('linux', 2.35)).toBe(false)
|
|
expect(isLinuxLegacy('linux', 2.38)).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('getDownloadPattern', () => {
|
|
describe('Windows', () => {
|
|
it('should return win-x64 pattern for Windows x64', () => {
|
|
const result = getDownloadPattern('win32', 'x64', {})
|
|
expect(result.type).toBe('win-x64')
|
|
expect(result.pattern.test('electerm-2.3.151-win-x64.tar.gz')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-win-arm64.tar.gz')).toBe(false)
|
|
})
|
|
|
|
it('should return win-arm64 pattern for Windows arm64', () => {
|
|
const result = getDownloadPattern('win32', 'arm64', {})
|
|
expect(result.type).toBe('win-arm64')
|
|
expect(result.pattern.test('electerm-2.3.151-win-arm64.tar.gz')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-win-x64.tar.gz')).toBe(false)
|
|
})
|
|
|
|
it('should return win7 pattern for Windows 7', () => {
|
|
const result = getDownloadPattern('win32', 'x64', { win7: true })
|
|
expect(result.type).toBe('win7')
|
|
expect(result.pattern.test('electerm-2.3.151-win7.tar.gz')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-win-x64.tar.gz')).toBe(false)
|
|
})
|
|
|
|
it('should prefer win7 over arm64 when win7 flag is set', () => {
|
|
const result = getDownloadPattern('win32', 'arm64', { win7: true })
|
|
expect(result.type).toBe('win7')
|
|
})
|
|
})
|
|
|
|
describe('macOS', () => {
|
|
it('should return mac-x64 pattern for macOS x64', () => {
|
|
const result = getDownloadPattern('darwin', 'x64', {})
|
|
expect(result.type).toBe('mac-x64')
|
|
expect(result.pattern.test('electerm-2.3.151-mac-x64.dmg')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-mac-arm64.dmg')).toBe(false)
|
|
})
|
|
|
|
it('should return mac-arm64 pattern for macOS arm64 (Apple Silicon)', () => {
|
|
const result = getDownloadPattern('darwin', 'arm64', {})
|
|
expect(result.type).toBe('mac-arm64')
|
|
expect(result.pattern.test('electerm-2.3.151-mac-arm64.dmg')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-mac-x64.dmg')).toBe(false)
|
|
})
|
|
|
|
it('should return mac10-x64 pattern for macOS 10.x', () => {
|
|
const result = getDownloadPattern('darwin', 'x64', { mac10: true })
|
|
expect(result.type).toBe('mac10-x64')
|
|
expect(result.pattern.test('electerm-2.3.151-mac10-x64.dmg')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-mac-x64.dmg')).toBe(false)
|
|
})
|
|
|
|
it('should prefer mac10 over arm64 when mac10 flag is set', () => {
|
|
const result = getDownloadPattern('darwin', 'arm64', { mac10: true })
|
|
expect(result.type).toBe('mac10-x64')
|
|
})
|
|
})
|
|
|
|
describe('Linux', () => {
|
|
it('should return linux-x64 pattern for Linux x64', () => {
|
|
const result = getDownloadPattern('linux', 'x64', {})
|
|
expect(result.type).toBe('linux-x64')
|
|
expect(result.pattern.test('electerm-2.3.151-linux-x64.tar.gz')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-linux-x64-legacy.tar.gz')).toBe(false)
|
|
})
|
|
|
|
it('should return linux-arm64 pattern for Linux arm64', () => {
|
|
const result = getDownloadPattern('linux', 'arm64', {})
|
|
expect(result.type).toBe('linux-arm64')
|
|
expect(result.pattern.test('electerm-2.3.151-linux-arm64.tar.gz')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-linux-arm64-legacy.tar.gz')).toBe(false)
|
|
})
|
|
|
|
it('should return linux-armv7l pattern for Linux arm', () => {
|
|
const result = getDownloadPattern('linux', 'arm', {})
|
|
expect(result.type).toBe('linux-armv7l')
|
|
expect(result.pattern.test('electerm-2.3.151-linux-armv7l.tar.gz')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-linux-armv7l-legacy.tar.gz')).toBe(false)
|
|
})
|
|
|
|
it('should return linux-x64-legacy pattern for Linux x64 with old glibc', () => {
|
|
const result = getDownloadPattern('linux', 'x64', { linuxLegacy: true })
|
|
expect(result.type).toBe('linux-x64-legacy')
|
|
expect(result.pattern.test('electerm-2.3.151-linux-x64-legacy.tar.gz')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-linux-x64.tar.gz')).toBe(false)
|
|
})
|
|
|
|
it('should return linux-arm64-legacy pattern for Linux arm64 with old glibc', () => {
|
|
const result = getDownloadPattern('linux', 'arm64', { linuxLegacy: true })
|
|
expect(result.type).toBe('linux-arm64-legacy')
|
|
expect(result.pattern.test('electerm-2.3.151-linux-arm64-legacy.tar.gz')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-linux-arm64.tar.gz')).toBe(false)
|
|
})
|
|
|
|
it('should return linux-armv7l-legacy pattern for Linux arm with old glibc', () => {
|
|
const result = getDownloadPattern('linux', 'arm', { linuxLegacy: true })
|
|
expect(result.type).toBe('linux-armv7l-legacy')
|
|
expect(result.pattern.test('electerm-2.3.151-linux-armv7l-legacy.tar.gz')).toBe(true)
|
|
expect(result.pattern.test('electerm-2.3.151-linux-armv7l.tar.gz')).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('Unsupported platforms', () => {
|
|
it('should return unsupported for unknown platforms', () => {
|
|
const result = getDownloadPattern('freebsd', 'x64', {})
|
|
expect(result.type).toBe('unsupported')
|
|
expect(result.pattern).toBe(null)
|
|
})
|
|
|
|
it('should return unsupported for aix', () => {
|
|
const result = getDownloadPattern('aix', 'ppc64', {})
|
|
expect(result.type).toBe('unsupported')
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('Pattern matching with actual release filenames', () => {
|
|
// Release files with current version from website
|
|
let releaseFiles = []
|
|
|
|
beforeAll(() => {
|
|
const v = cachedVersion
|
|
releaseFiles = [
|
|
`electerm-${v}-linux-aarch64-legacy.rpm`,
|
|
`electerm-${v}-linux-aarch64.rpm`,
|
|
`electerm-${v}-linux-amd64-legacy.deb`,
|
|
`electerm-${v}-linux-amd64.deb`,
|
|
`electerm-${v}-linux-amd64.snap`,
|
|
`electerm-${v}-linux-arm64-legacy.AppImage`,
|
|
`electerm-${v}-linux-arm64-legacy.deb`,
|
|
`electerm-${v}-linux-arm64-legacy.tar.gz`,
|
|
`electerm-${v}-linux-arm64.AppImage`,
|
|
`electerm-${v}-linux-arm64.deb`,
|
|
`electerm-${v}-linux-arm64.tar.gz`,
|
|
`electerm-${v}-linux-armv7l-legacy.AppImage`,
|
|
`electerm-${v}-linux-armv7l-legacy.deb`,
|
|
`electerm-${v}-linux-armv7l-legacy.rpm`,
|
|
`electerm-${v}-linux-armv7l-legacy.tar.gz`,
|
|
`electerm-${v}-linux-armv7l.AppImage`,
|
|
`electerm-${v}-linux-armv7l.deb`,
|
|
`electerm-${v}-linux-armv7l.rpm`,
|
|
`electerm-${v}-linux-armv7l.tar.gz`,
|
|
`electerm-${v}-linux-x64-legacy.tar.gz`,
|
|
`electerm-${v}-linux-x64.tar.gz`,
|
|
`electerm-${v}-linux-x86_64-legacy.AppImage`,
|
|
`electerm-${v}-linux-x86_64-legacy.rpm`,
|
|
`electerm-${v}-linux-x86_64.AppImage`,
|
|
`electerm-${v}-linux-x86_64.rpm`,
|
|
`electerm-${v}-mac-arm64.dmg`,
|
|
`electerm-${v}-mac-arm64.dmg.blockmap`,
|
|
`electerm-${v}-mac-x64.dmg`,
|
|
`electerm-${v}-mac-x64.dmg.blockmap`,
|
|
`electerm-${v}-mac10-x64.dmg`,
|
|
`electerm-${v}-mac10-x64.dmg.blockmap`,
|
|
`electerm-${v}-win-arm64-installer.exe`,
|
|
`electerm-${v}-win-arm64-installer.exe.blockmap`,
|
|
`electerm-${v}-win-arm64.tar.gz`,
|
|
`electerm-${v}-win-x64-installer.exe`,
|
|
`electerm-${v}-win-x64-installer.exe.blockmap`,
|
|
`electerm-${v}-win-x64-loose.tar.gz`,
|
|
`electerm-${v}-win-x64-portable.tar.gz`,
|
|
`electerm-${v}-win-x64.appx`,
|
|
`electerm-${v}-win-x64.tar.gz`,
|
|
`electerm-${v}-win7.tar.gz`
|
|
]
|
|
})
|
|
|
|
it('should match exactly one tar.gz file for win-x64', () => {
|
|
const { pattern } = getDownloadPattern('win32', 'x64', {})
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-win-x64.tar.gz`])
|
|
})
|
|
|
|
it('should match exactly one tar.gz file for win-arm64', () => {
|
|
const { pattern } = getDownloadPattern('win32', 'arm64', {})
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-win-arm64.tar.gz`])
|
|
})
|
|
|
|
it('should match exactly one tar.gz file for win7', () => {
|
|
const { pattern } = getDownloadPattern('win32', 'x64', { win7: true })
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-win7.tar.gz`])
|
|
})
|
|
|
|
it('should match exactly one dmg file for mac-x64', () => {
|
|
const { pattern } = getDownloadPattern('darwin', 'x64', {})
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-mac-x64.dmg`])
|
|
})
|
|
|
|
it('should match exactly one dmg file for mac-arm64', () => {
|
|
const { pattern } = getDownloadPattern('darwin', 'arm64', {})
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-mac-arm64.dmg`])
|
|
})
|
|
|
|
it('should match exactly one dmg file for mac10-x64', () => {
|
|
const { pattern } = getDownloadPattern('darwin', 'x64', { mac10: true })
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-mac10-x64.dmg`])
|
|
})
|
|
|
|
it('should match exactly one tar.gz file for linux-x64', () => {
|
|
const { pattern } = getDownloadPattern('linux', 'x64', {})
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-linux-x64.tar.gz`])
|
|
})
|
|
|
|
it('should match exactly one tar.gz file for linux-x64-legacy', () => {
|
|
const { pattern } = getDownloadPattern('linux', 'x64', { linuxLegacy: true })
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-linux-x64-legacy.tar.gz`])
|
|
})
|
|
|
|
it('should match exactly one tar.gz file for linux-arm64', () => {
|
|
const { pattern } = getDownloadPattern('linux', 'arm64', {})
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-linux-arm64.tar.gz`])
|
|
})
|
|
|
|
it('should match exactly one tar.gz file for linux-arm64-legacy', () => {
|
|
const { pattern } = getDownloadPattern('linux', 'arm64', { linuxLegacy: true })
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-linux-arm64-legacy.tar.gz`])
|
|
})
|
|
|
|
it('should match exactly one tar.gz file for linux-armv7l', () => {
|
|
const { pattern } = getDownloadPattern('linux', 'arm', {})
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-linux-armv7l.tar.gz`])
|
|
})
|
|
|
|
it('should match exactly one tar.gz file for linux-armv7l-legacy', () => {
|
|
const { pattern } = getDownloadPattern('linux', 'arm', { linuxLegacy: true })
|
|
const matches = releaseFiles.filter(f => pattern.test(f))
|
|
expect(matches).toEqual([`electerm-${cachedVersion}-linux-armv7l-legacy.tar.gz`])
|
|
})
|
|
})
|
|
})
|