mukan-ignite/ignite/pkg/dirchange/dirchange_test.go
Mukan Erkin Törük 26b204bd04
Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
feat: fork Ignite CLI v29 as Mukan Ignite — remove cosmos-sdk restrictions
2026-05-11 03:31:37 +03:00

161 lines
5.1 KiB
Go

package dirchange_test
import (
"crypto/rand"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
"github.com/ignite/cli/v29/ignite/pkg/cache"
"github.com/ignite/cli/v29/ignite/pkg/dirchange"
)
const (
TmpPattern = "starport-dirchange"
ChecksumKey = "checksum"
)
func randomBytes(t *testing.T, n int) []byte {
t.Helper()
bytes := make([]byte, n)
_, err := rand.Read(bytes)
require.NoError(t, err)
return bytes
}
func TestHasDirChecksumChanged(t *testing.T) {
tempDir := os.TempDir()
cacheDir := os.TempDir()
cacheStorage, err := cache.NewStorage(filepath.Join(cacheDir, "testcache.db"))
require.NoError(t, err)
c := cache.New[[]byte](cacheStorage, "testnamespace")
// Create directory tree
dir1 := filepath.Join(tempDir, "foo1")
err = os.MkdirAll(dir1, 0o700)
require.NoError(t, err)
defer os.RemoveAll(dir1)
dir2 := filepath.Join(tempDir, "foo2")
err = os.MkdirAll(dir2, 0o700)
require.NoError(t, err)
defer os.RemoveAll(dir2)
dir3 := filepath.Join(tempDir, "foo3")
err = os.MkdirAll(dir3, 0o700)
require.NoError(t, err)
defer os.RemoveAll(dir3)
dir11, err := os.MkdirTemp(dir1, TmpPattern)
require.NoError(t, err)
dir12, err := os.MkdirTemp(dir1, TmpPattern)
require.NoError(t, err)
dir21, err := os.MkdirTemp(dir2, TmpPattern)
require.NoError(t, err)
// Create files
err = os.WriteFile(filepath.Join(dir1, "foo"), []byte("some bytes"), 0o644)
require.NoError(t, err)
err = os.WriteFile(filepath.Join(dir11, "foo"), randomBytes(t, 15), 0o644)
require.NoError(t, err)
err = os.WriteFile(filepath.Join(dir12, "foo"), randomBytes(t, 20), 0o644)
require.NoError(t, err)
err = os.WriteFile(filepath.Join(dir21, "foo"), randomBytes(t, 20), 0o644)
require.NoError(t, err)
err = os.WriteFile(filepath.Join(dir3, "foo1"), randomBytes(t, 10), 0o644)
require.NoError(t, err)
err = os.WriteFile(filepath.Join(dir3, "foo2"), randomBytes(t, 10), 0o644)
require.NoError(t, err)
// Check checksum
paths := []string{dir1, dir2, dir3}
checksum, err := dirchange.ChecksumFromPaths("", paths...)
require.NoError(t, err)
// sha256 checksum is 32 bytes
require.Len(t, checksum, 32)
// Checksum remains the same if a file is deleted and recreated with the same content
err = os.Remove(filepath.Join(dir1, "foo"))
require.NoError(t, err)
err = os.WriteFile(filepath.Join(dir1, "foo"), []byte("some bytes"), 0o644)
require.NoError(t, err)
tmpChecksum, err := dirchange.ChecksumFromPaths("", paths...)
require.NoError(t, err)
require.Equal(t, checksum, tmpChecksum)
// Can compute the checksum from a specific workdir
pathNames := []string{"foo1", "foo2", "foo3"}
tmpChecksum, err = dirchange.ChecksumFromPaths(tempDir, pathNames...)
require.NoError(t, err)
require.Equal(t, checksum, tmpChecksum)
// Ignore non existent dir
pathNames = append(pathNames, "nonexistent")
tmpChecksum, err = dirchange.ChecksumFromPaths(tempDir, pathNames...)
require.NoError(t, err)
require.Equal(t, checksum, tmpChecksum)
// Checksum from a subdir is different
tmpChecksum, err = dirchange.ChecksumFromPaths("", dir1, dir2)
require.NoError(t, err)
require.NotEqual(t, checksum, tmpChecksum)
// Checksum changes if a file is modified
err = os.WriteFile(filepath.Join(dir3, "foo1"), randomBytes(t, 10), 0o644)
require.NoError(t, err)
newChecksum, err := dirchange.ChecksumFromPaths("", paths...)
require.NoError(t, err)
require.NotEqual(t, checksum, newChecksum)
// Error if no files in the specified dirs
empty1 := filepath.Join(tempDir, "empty1")
err = os.MkdirAll(empty1, 0o700)
require.NoError(t, err)
defer os.RemoveAll(empty1)
empty2 := filepath.Join(tempDir, "empty2")
err = os.MkdirAll(empty2, 0o700)
require.NoError(t, err)
defer os.RemoveAll(empty2)
_, err = dirchange.ChecksumFromPaths("", empty1, empty2)
require.Error(t, err)
// SaveDirChecksum saves the checksum in the cache
saveDir, err := os.MkdirTemp(tempDir, TmpPattern)
require.NoError(t, err)
defer os.RemoveAll(saveDir)
err = dirchange.SaveDirChecksum(c, ChecksumKey, "", paths...)
require.NoError(t, err)
savedChecksum, err := c.Get(ChecksumKey)
require.NoError(t, err)
require.Equal(t, newChecksum, savedChecksum)
// Error if the paths contains no file
err = dirchange.SaveDirChecksum(c, ChecksumKey, "", empty1, empty2)
require.Error(t, err)
// HasDirChecksumChanged returns false if the directory has not changed
changed, err := dirchange.HasDirChecksumChanged(c, ChecksumKey, "", paths...)
require.NoError(t, err)
require.False(t, changed)
// Return true if cache entry doesn't exist
err = c.Delete(ChecksumKey)
require.NoError(t, err)
changed, err = dirchange.HasDirChecksumChanged(c, ChecksumKey, "", paths...)
require.NoError(t, err)
require.True(t, changed)
// Return true if the paths contains no file
changed, err = dirchange.HasDirChecksumChanged(c, ChecksumKey, "", empty1, empty2)
require.NoError(t, err)
require.True(t, changed)
// Return true if it has been changed
err = os.WriteFile(filepath.Join(dir21, "bar"), randomBytes(t, 20), 0o644)
require.NoError(t, err)
changed, err = dirchange.HasDirChecksumChanged(c, ChecksumKey, "", paths...)
require.NoError(t, err)
require.True(t, changed)
}