mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-11-02 15:31:03 +00:00
cmd/dump.go uses os.Readdir to list the directory.
This is fine on its own, but TestAddRecursiveExclude in cmd/dump_test.go
depends on the order of the directory listing, which is where the issue
lays.
Directory listings using os.Readdir (lstat) don't actually guarantee an
order. They can differ due to a number of factors. Most notably the OS,
file system and settings.
As such, the test should not check the /order of the files/ added to the
archive, but instead simply check whether the archive /contains/ them.
So this is precisely what this commit does.
Note that only TestAddRecursiveExclude/File_inside_directory/No_exclude
has been observed to fail due to this, but all TestAddRecursiveExclude
subtests have been updated for consistency.
(cherry picked from commit 230a677c74)
117 lines
3.3 KiB
Go
117 lines
3.3 KiB
Go
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/mholt/archiver/v3"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
type mockArchiver struct {
|
|
addedFiles []string
|
|
}
|
|
|
|
func (mockArchiver) Create(out io.Writer) error {
|
|
return nil
|
|
}
|
|
|
|
func (m *mockArchiver) Write(f archiver.File) error {
|
|
m.addedFiles = append(m.addedFiles, f.Name())
|
|
return nil
|
|
}
|
|
|
|
func (mockArchiver) Close() error {
|
|
return nil
|
|
}
|
|
|
|
func TestAddRecursiveExclude(t *testing.T) {
|
|
t.Run("Empty", func(t *testing.T) {
|
|
dir := t.TempDir()
|
|
archiver := &mockArchiver{}
|
|
|
|
err := addRecursiveExclude(archiver, "", dir, []string{}, false)
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, archiver.addedFiles)
|
|
})
|
|
|
|
t.Run("Single file", func(t *testing.T) {
|
|
dir := t.TempDir()
|
|
err := os.WriteFile(dir+"/example", nil, 0o666)
|
|
assert.NoError(t, err)
|
|
|
|
t.Run("No exclude", func(t *testing.T) {
|
|
archiver := &mockArchiver{}
|
|
|
|
err = addRecursiveExclude(archiver, "", dir, nil, false)
|
|
assert.NoError(t, err)
|
|
assert.Len(t, archiver.addedFiles, 1)
|
|
assert.Contains(t, archiver.addedFiles, "example")
|
|
})
|
|
|
|
t.Run("With exclude", func(t *testing.T) {
|
|
archiver := &mockArchiver{}
|
|
|
|
err = addRecursiveExclude(archiver, "", dir, []string{dir + "/example"}, false)
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, archiver.addedFiles)
|
|
})
|
|
})
|
|
|
|
t.Run("File inside directory", func(t *testing.T) {
|
|
dir := t.TempDir()
|
|
err := os.MkdirAll(dir+"/deep/nested/folder", 0o750)
|
|
assert.NoError(t, err)
|
|
err = os.WriteFile(dir+"/deep/nested/folder/example", nil, 0o666)
|
|
assert.NoError(t, err)
|
|
err = os.WriteFile(dir+"/deep/nested/folder/another-file", nil, 0o666)
|
|
assert.NoError(t, err)
|
|
|
|
t.Run("No exclude", func(t *testing.T) {
|
|
archiver := &mockArchiver{}
|
|
|
|
err = addRecursiveExclude(archiver, "", dir, nil, false)
|
|
assert.NoError(t, err)
|
|
assert.Len(t, archiver.addedFiles, 5)
|
|
assert.Contains(t, archiver.addedFiles, "deep")
|
|
assert.Contains(t, archiver.addedFiles, "deep/nested")
|
|
assert.Contains(t, archiver.addedFiles, "deep/nested/folder")
|
|
assert.Contains(t, archiver.addedFiles, "deep/nested/folder/example")
|
|
assert.Contains(t, archiver.addedFiles, "deep/nested/folder/another-file")
|
|
})
|
|
|
|
t.Run("Exclude first directory", func(t *testing.T) {
|
|
archiver := &mockArchiver{}
|
|
|
|
err = addRecursiveExclude(archiver, "", dir, []string{dir + "/deep"}, false)
|
|
assert.NoError(t, err)
|
|
assert.Empty(t, archiver.addedFiles)
|
|
})
|
|
|
|
t.Run("Exclude nested directory", func(t *testing.T) {
|
|
archiver := &mockArchiver{}
|
|
|
|
err = addRecursiveExclude(archiver, "", dir, []string{dir + "/deep/nested/folder"}, false)
|
|
assert.NoError(t, err)
|
|
assert.Len(t, archiver.addedFiles, 2)
|
|
assert.Contains(t, archiver.addedFiles, "deep")
|
|
assert.Contains(t, archiver.addedFiles, "deep/nested")
|
|
})
|
|
|
|
t.Run("Exclude file", func(t *testing.T) {
|
|
archiver := &mockArchiver{}
|
|
|
|
err = addRecursiveExclude(archiver, "", dir, []string{dir + "/deep/nested/folder/example"}, false)
|
|
assert.NoError(t, err)
|
|
assert.Len(t, archiver.addedFiles, 4)
|
|
assert.Contains(t, archiver.addedFiles, "deep")
|
|
assert.Contains(t, archiver.addedFiles, "deep/nested")
|
|
assert.Contains(t, archiver.addedFiles, "deep/nested/folder")
|
|
assert.Contains(t, archiver.addedFiles, "deep/nested/folder/another-file")
|
|
})
|
|
})
|
|
}
|