Files
gradle-build-tools-actions/sources/test/jest/cache-cleanup.test.ts
T

111 lines
4.8 KiB
TypeScript
Raw Normal View History

2022-06-12 09:53:04 -06:00
import * as exec from '@actions/exec'
2024-03-21 19:03:05 -06:00
import * as glob from '@actions/glob'
2022-06-12 09:53:04 -06:00
import fs from 'fs'
import path from 'path'
import {expect, test, jest} from '@jest/globals'
2024-04-08 13:29:58 -06:00
import {CacheCleaner} from '../../src/caching/cache-cleaner'
2022-06-12 09:53:04 -06:00
jest.setTimeout(120000)
test('will cleanup unused dependency jars and build-cache entries', async () => {
const projectRoot = prepareTestProject()
const gradleUserHome = path.resolve(projectRoot, 'HOME')
const tmpDir = path.resolve(projectRoot, 'tmp')
const cacheCleaner = new CacheCleaner(gradleUserHome, tmpDir)
await runGradleBuild(projectRoot, 'build', '3.1')
2024-03-21 19:03:05 -06:00
const timestamp = await cacheCleaner.prepare()
2022-06-12 09:53:04 -06:00
await runGradleBuild(projectRoot, 'build', '3.1.1')
const commonsMath31 = path.resolve(gradleUserHome, "caches/modules-2/files-2.1/org.apache.commons/commons-math3/3.1")
const commonsMath311 = path.resolve(gradleUserHome, "caches/modules-2/files-2.1/org.apache.commons/commons-math3/3.1.1")
const buildCacheDir = path.resolve(gradleUserHome, "caches/build-cache-1")
expect(fs.existsSync(commonsMath31)).toBe(true)
expect(fs.existsSync(commonsMath311)).toBe(true)
2024-06-13 08:17:42 -06:00
expect(fs.readdirSync(buildCacheDir).length).toBe(4) // gc.properties, build-cache-1.lock, and 2 task entries
2022-06-12 09:53:04 -06:00
await cacheCleaner.forceCleanupFilesOlderThan(timestamp, 'gradle')
2022-06-12 09:53:04 -06:00
expect(fs.existsSync(commonsMath31)).toBe(false)
expect(fs.existsSync(commonsMath311)).toBe(true)
2024-06-13 08:17:42 -06:00
expect(fs.readdirSync(buildCacheDir).length).toBe(3) // 1 task entry has been cleaned up
2022-06-12 09:53:04 -06:00
})
test('will cleanup unused gradle versions', async () => {
const projectRoot = prepareTestProject()
const gradleUserHome = path.resolve(projectRoot, 'HOME')
const tmpDir = path.resolve(projectRoot, 'tmp')
const cacheCleaner = new CacheCleaner(gradleUserHome, tmpDir)
// Initialize HOME with 2 different Gradle versions
await runGradleWrapperBuild(projectRoot, 'build')
await runGradleBuild(projectRoot, 'build')
2024-03-21 19:03:05 -06:00
const timestamp = await cacheCleaner.prepare()
2022-06-12 09:53:04 -06:00
// Run with only one of these versions
await runGradleBuild(projectRoot, 'build')
2023-04-22 12:56:45 -06:00
const gradle802 = path.resolve(gradleUserHome, "caches/8.0.2")
2024-03-21 19:03:05 -06:00
const transforms3 = path.resolve(gradleUserHome, "caches/transforms-3")
const metadata100 = path.resolve(gradleUserHome, "caches/modules-2/metadata-2.100")
2023-04-22 12:56:45 -06:00
const wrapper802 = path.resolve(gradleUserHome, "wrapper/dists/gradle-8.0.2-bin")
2025-06-06 02:47:30 +00:00
const gradleCurrent = path.resolve(gradleUserHome, "caches/8.14.2")
const metadataCurrent = path.resolve(gradleUserHome, "caches/modules-2/metadata-2.107")
2022-06-12 09:53:04 -06:00
2023-04-22 12:56:45 -06:00
expect(fs.existsSync(gradle802)).toBe(true)
2024-03-21 19:03:05 -06:00
expect(fs.existsSync(transforms3)).toBe(true)
expect(fs.existsSync(metadata100)).toBe(true)
2023-04-22 12:56:45 -06:00
expect(fs.existsSync(wrapper802)).toBe(true)
2024-03-21 19:03:05 -06:00
2022-06-12 09:53:04 -06:00
expect(fs.existsSync(gradleCurrent)).toBe(true)
2024-03-21 19:03:05 -06:00
expect(fs.existsSync(metadataCurrent)).toBe(true)
2022-06-12 09:53:04 -06:00
2024-03-21 19:03:05 -06:00
// The wrapper won't be removed if it was recently downloaded. Age it.
setUtimes(wrapper802, new Date(Date.now() - 48 * 60 * 60 * 1000))
await cacheCleaner.forceCleanupFilesOlderThan(timestamp, 'gradle')
2022-06-12 09:53:04 -06:00
2023-04-22 12:56:45 -06:00
expect(fs.existsSync(gradle802)).toBe(false)
2024-03-21 19:03:05 -06:00
expect(fs.existsSync(transforms3)).toBe(false)
expect(fs.existsSync(metadata100)).toBe(false)
2023-04-22 12:56:45 -06:00
expect(fs.existsSync(wrapper802)).toBe(false)
2024-03-21 19:03:05 -06:00
2022-06-12 09:53:04 -06:00
expect(fs.existsSync(gradleCurrent)).toBe(true)
2024-03-21 19:03:05 -06:00
expect(fs.existsSync(metadataCurrent)).toBe(true)
2022-06-12 09:53:04 -06:00
})
async function runGradleBuild(projectRoot: string, args: string, version: string = '3.1'): Promise<void> {
2025-04-09 16:40:33 -06:00
await exec.exec(`gradle -g HOME --no-daemon --build-cache -Dcommons_math3_version="${version}" ${args}`, [], {
2022-06-12 09:53:04 -06:00
cwd: projectRoot
})
2022-08-24 08:19:52 -06:00
console.log(`Gradle User Home initialized with commons_math3_version=${version} ${args}`)
2022-06-12 09:53:04 -06:00
}
async function runGradleWrapperBuild(projectRoot: string, args: string, version: string = '3.1'): Promise<void> {
2025-04-09 16:40:33 -06:00
await exec.exec(`./gradlew -g HOME --no-daemon --build-cache -Dcommons_math3_version="${version}" ${args}`, [], {
2022-06-12 09:53:04 -06:00
cwd: projectRoot
})
2022-08-24 09:02:56 -06:00
console.log(`Gradle User Home initialized with commons_math3_version="${version}" ${args}`)
2022-06-12 09:53:04 -06:00
}
function prepareTestProject(): string {
const projectRoot = 'test/jest/resources/cache-cleanup'
fs.rmSync(path.resolve(projectRoot, 'HOME'), { recursive: true, force: true })
fs.rmSync(path.resolve(projectRoot, 'tmp'), { recursive: true, force: true })
fs.rmSync(path.resolve(projectRoot, 'build'), { recursive: true, force: true })
fs.rmSync(path.resolve(projectRoot, '.gradle'), { recursive: true, force: true })
return projectRoot
}
2024-03-21 19:03:05 -06:00
async function setUtimes(pattern: string, timestamp: Date): Promise<void> {
const globber = await glob.create(pattern)
for await (const file of globber.globGenerator()) {
fs.utimesSync(file, timestamp, timestamp)
}
}