Skip to content
125 changes: 53 additions & 72 deletions internal/cas/benchmark_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ import (
"github.com/gruntwork-io/terragrunt/internal/cas"
"github.com/gruntwork-io/terragrunt/internal/git"
"github.com/gruntwork-io/terragrunt/test/helpers/logger"
"github.com/stretchr/testify/require"
)

func BenchmarkClone(b *testing.B) {
// Use a small, public repository for consistent results
repo := "https://github.com/gruntwork-io/terragrunt.git"
repoURL := startBenchServer(b)

l := logger.CreateLogger()

Expand All @@ -31,20 +31,15 @@ func BenchmarkClone(b *testing.B) {
storePath := filepath.Join(tempDir, "store", strconv.Itoa(i))
targetPath := filepath.Join(tempDir, "repo", strconv.Itoa(i))

c, err := cas.New(cas.Options{
StorePath: storePath,
})
if err != nil {
b.Fatal(err)
}
c, err := cas.New(cas.WithStorePath(storePath))
require.NoError(b, err)

b.StartTimer()

if err := c.Clone(b.Context(), l, &cas.CloneOptions{
Dir: targetPath,
}, repo); err != nil {
b.Fatal(err)
}
require.NoError(b, c.Clone(b.Context(), l, &cas.CloneOptions{
Dir: targetPath,
Depth: -1,
}, repoURL))
}
})

Expand All @@ -53,18 +48,13 @@ func BenchmarkClone(b *testing.B) {
storePath := filepath.Join(tempDir, "store")

// First clone to populate store
c, err := cas.New(cas.Options{
StorePath: storePath,
})
if err != nil {
b.Fatal(err)
}
c, err := cas.New(cas.WithStorePath(storePath))
require.NoError(b, err)

if err := c.Clone(b.Context(), l, &cas.CloneOptions{
Dir: filepath.Join(tempDir, "initial"),
}, repo); err != nil {
b.Fatal(err)
}
require.NoError(b, c.Clone(b.Context(), l, &cas.CloneOptions{
Dir: filepath.Join(tempDir, "initial"),
Depth: -1,
}, repoURL))

b.ResetTimer()

Expand All @@ -73,20 +63,15 @@ func BenchmarkClone(b *testing.B) {

targetPath := filepath.Join(tempDir, "repo", strconv.Itoa(i))

c, err := cas.New(cas.Options{
StorePath: storePath,
})
if err != nil {
b.Fatal(err)
}
c, err := cas.New(cas.WithStorePath(storePath))
require.NoError(b, err)

b.StartTimer()

if err := c.Clone(b.Context(), l, &cas.CloneOptions{
Dir: targetPath,
}, repo); err != nil {
b.Fatal(err)
}
require.NoError(b, c.Clone(b.Context(), l, &cas.CloneOptions{
Dir: targetPath,
Depth: -1,
}, repoURL))
}
})
}
Expand All @@ -109,9 +94,7 @@ func BenchmarkContent(b *testing.B) {

b.StartTimer()

if err := content.Store(l, hash, testData); err != nil {
b.Fatal(err)
}
require.NoError(b, content.Store(l, hash, testData))
}
})

Expand Down Expand Up @@ -148,37 +131,29 @@ func BenchmarkContent(b *testing.B) {
}

func BenchmarkGitOperations(b *testing.B) {
// Setup a git repository for testing
repoURL := startBenchServer(b)

// Clone the repo locally for tree operations
repoDir := b.TempDir()

g, err := git.NewGitRunner()
if err != nil {
b.Fatal(err)
}
require.NoError(b, err)

g = g.WithWorkDir(repoDir)

ctx := b.Context()

if err = g.Clone(ctx, "https://github.com/gruntwork-io/terragrunt.git", false, 1, "main"); err != nil {
b.Fatal(err)
}
require.NoError(b, g.Clone(ctx, repoURL, false, 0, ""))

b.Run("ls-remote", func(b *testing.B) {
g, err = git.NewGitRunner()
if err != nil {
b.Fatal(err)
}

g = g.WithWorkDir(repoDir)
runner, err := git.NewGitRunner()
require.NoError(b, err)

b.ResetTimer()

for b.Loop() {
_, err := g.LsRemote(ctx, "https://github.com/gruntwork-io/terragrunt.git", "HEAD")
if err != nil {
b.Fatal(err)
}
_, err := runner.LsRemote(ctx, repoURL, "HEAD")
require.NoError(b, err)
}
})

Expand All @@ -187,31 +162,21 @@ func BenchmarkGitOperations(b *testing.B) {

for b.Loop() {
_, err := g.LsTreeRecursive(ctx, "HEAD")
if err != nil {
b.Fatal(err)
}
require.NoError(b, err)
}
})

b.Run("cat-file", func(b *testing.B) {
// First get a valid hash
tree, err := g.LsTreeRecursive(ctx, "HEAD")
if err != nil {
b.Fatal(err)
}

if len(tree.Entries()) == 0 {
b.Fatal("no entries in tree")
}
require.NoError(b, err)
require.NotEmpty(b, tree.Entries(), "no entries in tree")

hash := tree.Entries()[0].Hash

tmpFile := b.TempDir() + "/cat-file"

tmp, err := os.Create(tmpFile)
if err != nil {
b.Fatal(err)
}
require.NoError(b, err)

defer os.Remove(tmpFile)
defer tmp.Close()
Expand All @@ -220,9 +185,25 @@ func BenchmarkGitOperations(b *testing.B) {

for b.Loop() {
err := g.CatFile(ctx, hash, tmp)
if err != nil {
b.Fatal(err)
}
require.NoError(b, err)
}
})
}

func startBenchServer(b *testing.B) string {
b.Helper()

srv, err := git.NewServer()
require.NoError(b, err)

b.Cleanup(func() { _ = srv.Close() })

require.NoError(b, srv.CommitFile("README.md", []byte("# test repo"), "add readme"))
require.NoError(b, srv.CommitFile("main.tf", []byte(`resource "null_resource" "test" {}`), "add main.tf"))
require.NoError(b, srv.CommitFile("test/integration_test.go", []byte("package test"), "add test file"))

url, err := srv.Start(b.Context())
require.NoError(b, err)

return url
}
Loading
Loading