mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-07-25 16:03:48 +00:00
238 lines
6.6 KiB
Go
238 lines
6.6 KiB
Go
package git
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestRegisterPath(t *testing.T) {
|
|
// Create a temporary test directory
|
|
testDir, err := os.MkdirTemp("", "archive-cleaner-test")
|
|
require.NoError(t, err, "Failed to create test directory")
|
|
defer os.RemoveAll(testDir)
|
|
|
|
// Create a new archive cleaner
|
|
cleaner := newArchiveCleaner()
|
|
defer cleaner.Shutdown()
|
|
cleaner.RegisterPath(testDir)
|
|
|
|
assert.Equal(t, testDir, cleaner.path, "Path should match registered path")
|
|
assert.True(t, cleaner.enabled, "Cleaner should be enabled")
|
|
}
|
|
|
|
func TestRegisterUncleanPath(t *testing.T) {
|
|
// Create a temporary test directory
|
|
testDir, err := os.MkdirTemp("", "archive-cleaner-test")
|
|
require.NoError(t, err, "Failed to create test directory")
|
|
defer os.RemoveAll(testDir)
|
|
|
|
// Create a new archive cleaner
|
|
cleaner := newArchiveCleaner()
|
|
defer cleaner.Shutdown()
|
|
|
|
baseName := filepath.Base(testDir)
|
|
path := testDir + "/../" + baseName
|
|
|
|
cleaner.RegisterPath(path)
|
|
|
|
assert.Equal(t, testDir, cleaner.path, "Path should match clean path")
|
|
assert.True(t, cleaner.enabled, "Cleaner should be enabled")
|
|
}
|
|
|
|
func TestRegisterPathInvalid(t *testing.T) {
|
|
// Empty path
|
|
c := newArchiveCleaner()
|
|
c.RegisterPath("")
|
|
assert.False(t, c.enabled, "Cleaner should not be enabled with empty path")
|
|
c.Shutdown()
|
|
|
|
// Root path
|
|
c = newArchiveCleaner()
|
|
c.RegisterPath("/")
|
|
assert.False(t, c.enabled, "Cleaner should not be enabled with root path")
|
|
c.Shutdown()
|
|
}
|
|
|
|
func TestRegisterPathDuplicateCalls(t *testing.T) {
|
|
// Create a temporary test directory
|
|
testDir, err := os.MkdirTemp("", "archive-cleaner-test")
|
|
require.NoError(t, err, "Failed to create test directory")
|
|
defer os.RemoveAll(testDir)
|
|
|
|
c := newArchiveCleaner()
|
|
|
|
c.RegisterPath(testDir)
|
|
c.RegisterPath(testDir) // Should log but not error
|
|
|
|
// Test registering a different path
|
|
otherDir, err := os.MkdirTemp("", "other-dir")
|
|
require.NoError(t, err, "Failed to create other test directory")
|
|
defer os.RemoveAll(otherDir)
|
|
|
|
// This should log an error but not panic
|
|
c.RegisterPath(otherDir)
|
|
assert.Equal(t, testDir, c.path)
|
|
}
|
|
|
|
func TestCleanUpOldArchives(t *testing.T) {
|
|
// Create a temporary test directory
|
|
testDir, err := os.MkdirTemp("", "archive-cleaner-test")
|
|
require.NoError(t, err, "Failed to create test directory")
|
|
defer os.RemoveAll(testDir)
|
|
|
|
// Create test archive file structure:
|
|
// testDir/
|
|
// project-1/
|
|
// master/
|
|
// @v2/
|
|
// old-archive.zip (old - should be deleted)
|
|
// new-archive.zip (new - should be kept)
|
|
|
|
// Create directory structure
|
|
projectDir := filepath.Join(testDir, "project-1")
|
|
masterDir := filepath.Join(projectDir, "master")
|
|
v2Dir := filepath.Join(masterDir, "@v2")
|
|
|
|
createDirs(t, projectDir, masterDir, v2Dir)
|
|
|
|
// Create old file (should be deleted)
|
|
oldFilePath := filepath.Join(v2Dir, "old-archive.zip")
|
|
createFile(t, oldFilePath)
|
|
|
|
// Set old file's modification time to be older than the cutoff
|
|
oldTime := time.Now().Add(-time.Duration(lastModifiedTimeMins+10) * time.Minute)
|
|
err = os.Chtimes(oldFilePath, oldTime, oldTime)
|
|
require.NoError(t, err, "Failed to set old file time")
|
|
|
|
// Create new file (should be kept)
|
|
newFilePath := filepath.Join(v2Dir, "new-archive.zip")
|
|
createFile(t, newFilePath)
|
|
|
|
// Create a non-archive file (should be kept)
|
|
nonArchivePath := filepath.Join(v2Dir, "readme.txt")
|
|
createFile(t, nonArchivePath)
|
|
|
|
// Run the cleaner
|
|
c := newArchiveCleaner()
|
|
defer c.Shutdown()
|
|
|
|
c.RegisterPath(testDir)
|
|
c.execute()
|
|
|
|
// Check if old file was deleted
|
|
assert.False(t, fileExists(oldFilePath), "Old archive file should be deleted")
|
|
|
|
// Check if new file was kept
|
|
assert.True(t, fileExists(newFilePath), "New archive file should be kept")
|
|
|
|
// Check if non-archive file was kept
|
|
assert.True(t, fileExists(nonArchivePath), "Non-archive file should be kept")
|
|
}
|
|
|
|
func TestCleanUpEmptyDirectories(t *testing.T) {
|
|
// Create a temporary test directory
|
|
testDir, err := os.MkdirTemp("", "archive-cleaner-test")
|
|
require.NoError(t, err, "Failed to create test directory")
|
|
defer os.RemoveAll(testDir)
|
|
|
|
// Create test directory structure:
|
|
// testDir/
|
|
// empty1/ (should be deleted)
|
|
// empty2/
|
|
// empty3/ (should be deleted first, then empty2)
|
|
// nonempty1/
|
|
// file.txt (should be kept along with its directory)
|
|
|
|
// Create directories
|
|
empty1Dir := filepath.Join(testDir, "empty1")
|
|
empty2Dir := filepath.Join(testDir, "empty2")
|
|
empty3Dir := filepath.Join(empty2Dir, "empty3")
|
|
nonempty1Dir := filepath.Join(testDir, "nonempty1")
|
|
|
|
createDirs(t, empty1Dir, empty2Dir, empty3Dir, nonempty1Dir)
|
|
|
|
// Create a file in nonempty1
|
|
nonEmptyFilePath := filepath.Join(nonempty1Dir, "file.txt")
|
|
createFile(t, nonEmptyFilePath)
|
|
|
|
// Run the cleaner
|
|
c := newArchiveCleaner()
|
|
c.Shutdown()
|
|
|
|
c.RegisterPath(testDir)
|
|
c.execute()
|
|
|
|
// Check if empty directories were deleted
|
|
assert.False(t, dirExists(empty3Dir), "Empty directory should be deleted: %s", empty3Dir)
|
|
assert.False(t, dirExists(empty2Dir), "Empty directory should be deleted: %s", empty2Dir)
|
|
assert.False(t, dirExists(empty1Dir), "Empty directory should be deleted: %s", empty1Dir)
|
|
|
|
// Check if non-empty directory was kept
|
|
assert.True(t, dirExists(nonempty1Dir), "Non-empty directory should be kept")
|
|
|
|
// Check if file in non-empty directory was kept
|
|
assert.True(t, fileExists(nonEmptyFilePath), "File in non-empty directory should be kept")
|
|
}
|
|
|
|
func TestIsArchiveFile(t *testing.T) {
|
|
tests := []struct {
|
|
path string
|
|
expected bool
|
|
}{
|
|
{"file.zip", true},
|
|
{"file.tar", true},
|
|
{"file.tar.gz", true},
|
|
{"file.tgz", false},
|
|
{"file.gz", false},
|
|
{"file.tar.bz2", true},
|
|
{"file.tbz", false},
|
|
{"file.tbz2", false},
|
|
{"file.tb2", false},
|
|
{"file.bz2", true},
|
|
{"file.txt", false},
|
|
{"file.zip.txt", false},
|
|
{"archive.ZIP", true}, // Should be case insensitive
|
|
{"archive.TAR.GZ", true},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.path, func(t *testing.T) {
|
|
result := isArchiveFile(test.path)
|
|
assert.Equal(t, test.expected, result, "For %s, expected %v but got %v", test.path, test.expected, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func createDirs(t *testing.T, dirs ...string) {
|
|
for _, dir := range dirs {
|
|
err := os.MkdirAll(dir, 0755)
|
|
require.NoError(t, err, "Failed to create directory %s", dir)
|
|
}
|
|
}
|
|
|
|
func createFile(t *testing.T, path string) {
|
|
err := os.WriteFile(path, []byte("test content"), 0644)
|
|
require.NoError(t, err, "Failed to create file %s", path)
|
|
}
|
|
|
|
func fileExists(path string) bool {
|
|
info, err := os.Stat(path)
|
|
if os.IsNotExist(err) {
|
|
return false
|
|
}
|
|
return !info.IsDir()
|
|
}
|
|
|
|
func dirExists(path string) bool {
|
|
info, err := os.Stat(path)
|
|
if os.IsNotExist(err) {
|
|
return false
|
|
}
|
|
return info.IsDir()
|
|
}
|