package delivery import ( "crypto/sha256" "encoding/hex" "fmt" "os" "path/filepath" "testing" "gitea.maximumdirect.net/eric/ReleaseKit/internal/artifact" internalbuild "gitea.maximumdirect.net/eric/ReleaseKit/internal/build" "gitea.maximumdirect.net/eric/ReleaseKit/internal/gitea" ) const performanceArtifactSize = 16 << 20 func BenchmarkPerformanceAssetPreflight(b *testing.B) { result, totalBytes := performanceBuildResult(b) declarations, err := declaredBuildAssets(result) if err != nil { b.Fatal(err) } b.Run("Declarations", func(b *testing.B) { b.ReportAllocs() b.SetBytes(totalBytes) b.ResetTimer() b.ReportMetric(float64(totalBytes), "bytes/op") for i := 0; i < b.N; i++ { assets, err := declaredBuildAssets(result) if err != nil || len(assets) != len(declarations) { b.Fatalf("declaredBuildAssets() returned %d assets, err %v", len(assets), err) } } }) b.Run("DeclarationsAndLocalVerification", func(b *testing.B) { b.ReportAllocs() b.SetBytes(totalBytes) b.ResetTimer() b.ReportMetric(float64(totalBytes), "bytes/op") for i := 0; i < b.N; i++ { assets, err := declaredBuildAssets(result) if err != nil { b.Fatal(err) } if err := gitea.VerifyLocalAssets(assets); err != nil { b.Fatal(err) } } }) } func performanceBuildResult(b *testing.B) (internalbuild.Result, int64) { b.Helper() outputDir := b.TempDir() data := make([]byte, performanceArtifactSize) for i := range data { data[i] = byte((i*31 + i/251 + 17) % 251) } digest := sha256.Sum256(data) result := internalbuild.Result{ Version: "v1.2.3", Settings: artifact.NormalizeSettings("./cmd/releasekit", "releasekit", []artifact.Target{ {OS: "linux", Arch: "amd64"}, {OS: "windows", Arch: "amd64"}, }), } for _, target := range result.Settings.Targets { name := fmt.Sprintf("releasekit-v1.2.3-%s-%s", target.OS, target.Arch) if target.OS == "windows" { name += ".exe" } path := filepath.Join(outputDir, name) if err := os.WriteFile(path, data, 0o600); err != nil { b.Fatal(err) } result.Artifacts = append(result.Artifacts, internalbuild.Artifact{ Path: path, Filename: name, Target: target, SHA256: hex.EncodeToString(digest[:]), }) } return result, 2 * performanceArtifactSize }