This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / knotmirror / xrpc / gitea / blob_test.go
3.1 kB 92 lines
1package gitea 2 3import ( 4 "context" 5 "fmt" 6 "os" 7 "os/exec" 8 "path/filepath" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13) 14 15func initRepo(t *testing.T) (string, func(args ...string) []byte) { 16 t.Helper() 17 repo := t.TempDir() 18 runGit := func(args ...string) []byte { 19 t.Helper() 20 cmd := exec.Command("git", args...) 21 cmd.Dir = repo 22 out, err := cmd.CombinedOutput() 23 require.NoError(t, err, string(out)) 24 return out 25 } 26 runGit("init") 27 runGit("config", "user.name", "nel") 28 runGit("config", "user.email", "nel@oyster.cafe") 29 return repo, runGit 30} 31 32func sizesByName(t *testing.T, repo string) map[string]int64 { 33 t.Helper() 34 ctx := context.Background() 35 tree, err := GetTree(ctx, repo, "HEAD^{tree}") 36 require.NoError(t, err) 37 38 sizes, err := EntrySizes(ctx, repo, tree.Entries) 39 require.NoError(t, err, "the batch survives an entry pointing outside this repo") 40 require.Len(t, sizes, len(tree.Entries)) 41 42 byName := map[string]int64{} 43 for i, entry := range tree.Entries { 44 byName[entry.Name] = sizes[i] 45 } 46 return byName 47} 48 49func TestEntrySizesReportsEveryEntryKind(t *testing.T) { 50 repo, runGit := initRepo(t) 51 require.NoError(t, os.WriteFile(filepath.Join(repo, "conch.txt"), make([]byte, 10), 0o644)) 52 require.NoError(t, os.WriteFile(filepath.Join(repo, "kelp.txt"), make([]byte, 9000), 0o644)) 53 require.NoError(t, os.Mkdir(filepath.Join(repo, "limpet"), 0o755)) 54 require.NoError(t, os.WriteFile(filepath.Join(repo, "limpet", "uni.txt"), make([]byte, 3), 0o644)) 55 require.NoError(t, os.Symlink("conch.txt", filepath.Join(repo, "cuttle.txt"))) 56 runGit("add", ".") 57 runGit("update-index", "--add", "--cacheinfo", 58 "160000,0000000000000000000000000000000000000001,mussel") 59 require.NoError(t, os.WriteFile(filepath.Join(repo, "zzz-nautilus.txt"), make([]byte, 4096), 0o644)) 60 runGit("add", "zzz-nautilus.txt") 61 runGit("commit", "-m", "initial") 62 63 byName := sizesByName(t, repo) 64 assert.Equal(t, int64(10), byName["conch.txt"]) 65 assert.Equal(t, int64(9000), byName["kelp.txt"]) 66 assert.Equal(t, int64(0), byName["limpet"], "a tree doesn't have a blob size") 67 assert.Equal(t, int64(len("conch.txt")), byName["cuttle.txt"], "a symlink is its target's length") 68 assert.Equal(t, int64(0), byName["mussel"], "a submodule doesn't have a blob size") 69 assert.Equal(t, int64(4096), byName["zzz-nautilus.txt"], "entries after a submodule keep their size") 70 71 sizes, err := EntrySizes(context.Background(), repo, nil) 72 require.NoError(t, err) 73 assert.Empty(t, sizes, "we don't spawn a git process for an empty tree") 74} 75 76func TestEntrySizesReadsATreeLargerThanThePipeBuffer(t *testing.T) { 77 repo, runGit := initRepo(t) 78 const entries = 2000 79 for i := range entries { 80 name := fmt.Sprintf("scallop-%04d.txt", i) 81 require.NoError(t, os.WriteFile(filepath.Join(repo, name), make([]byte, i), 0o644)) 82 } 83 runGit("add", ".") 84 runGit("commit", "-m", "initial") 85 86 byName := sizesByName(t, repo) 87 require.Len(t, byName, entries) 88 for i := range entries { 89 name := fmt.Sprintf("scallop-%04d.txt", i) 90 require.Equal(t, int64(i), byName[name], name) 91 } 92}