From 84071ae4f9898c30267af2e8f85079e14f660147 Mon Sep 17 00:00:00 2001 From: Michael McLoughlin Date: Sun, 24 Apr 2022 20:20:11 -0700 Subject: [PATCH] tests/thirdparty: multiple packages per project (#262) --- .github/workflows/thirdparty.yml | 2 +- README.md | 16 +- doc/adopters.md | 12 +- internal/cmd/docgen/main.go | 12 +- internal/cmd/docgen/templates/adopters.tmpl | 3 +- internal/cmd/docgen/templates/readme.tmpl | 3 +- script/doc | 6 +- tests/thirdparty/config.go | 230 ++++-- tests/thirdparty/config_test.go | 91 ++- tests/thirdparty/make_workflow.go | 32 +- tests/thirdparty/metadata_test.go | 50 +- tests/thirdparty/packages.json | 685 ------------------ tests/thirdparty/packages_test.go | 40 +- tests/thirdparty/projects.json | 763 ++++++++++++++++++++ 14 files changed, 1051 insertions(+), 894 deletions(-) delete mode 100644 tests/thirdparty/packages.json create mode 100644 tests/thirdparty/projects.json diff --git a/.github/workflows/thirdparty.yml b/.github/workflows/thirdparty.yml index 83104b1..23ca192 100644 --- a/.github/workflows/thirdparty.yml +++ b/.github/workflows/thirdparty.yml @@ -29,4 +29,4 @@ jobs: persist-credentials: false - name: Run Third-Party Tests working-directory: tests/thirdparty - run: go test -net -pkgs packages.json + run: go test -net -prjs projects.json diff --git a/README.md b/README.md index 3397046..47acd36 100644 --- a/README.md +++ b/README.md @@ -193,23 +193,23 @@ Implementations of full algorithms: Popular projects using `avo`: [golang / **go**](https://github.com/golang/go) -:star: 98269 +:star: 98315 > The Go programming language - [klauspost / **compress**](https://github.com/klauspost/compress) / **s2** -:star: 2703 + [klauspost / **compress**](https://github.com/klauspost/compress) +:star: 2706 > Optimized Go Compression Packages - [golang / **crypto**](https://github.com/golang/crypto) / **curve25519** + [golang / **crypto**](https://github.com/golang/crypto) :star: 2402 > [mirror] Go supplementary cryptography libraries [klauspost / **reedsolomon**](https://github.com/klauspost/reedsolomon) -:star: 1437 +:star: 1438 > Reed-Solomon Erasure Coding in Go [segmentio / **asm**](https://github.com/segmentio/asm) -:star: 685 +:star: 686 > Go library providing algorithms optimized to leverage the characteristics of modern CPUs [zeebo / **blake3**](https://github.com/zeebo/blake3) @@ -217,7 +217,7 @@ Popular projects using `avo`: > Pure Go implementation of BLAKE3 with AVX2 and SSE4.1 acceleration [lukechampine / **blake3**](https://github.com/lukechampine/blake3) -:star: 278 +:star: 277 > A pure-Go implementation of the BLAKE3 cryptographic hash function [zeebo / **xxh3**](https://github.com/zeebo/xxh3) @@ -229,7 +229,7 @@ Popular projects using `avo`: > Bloom-filter based search index [minio / **md5-simd**](https://github.com/minio/md5-simd) -:star: 108 +:star: 109 > Accelerate aggregated MD5 hashing performance up to 8x for AVX512 and 4x for AVX2. Useful for server applications that need to compute many MD5 sums in parallel. See the [full list of projects using `avo`](doc/adopters.md). diff --git a/doc/adopters.md b/doc/adopters.md index 620d926..4595636 100644 --- a/doc/adopters.md +++ b/doc/adopters.md @@ -4,11 +4,11 @@ The Go programming language - [klauspost / **compress**](https://github.com/klauspost/compress) / **s2** + [klauspost / **compress**](https://github.com/klauspost/compress) Optimized Go Compression Packages - [golang / **crypto**](https://github.com/golang/crypto) / **curve25519** + [golang / **crypto**](https://github.com/golang/crypto) [mirror] Go supplementary cryptography libraries @@ -48,7 +48,7 @@ Go implementation of the BLS12-381 pairing filippo.io/edwards25519 — A safer, faster, and more powerful low-level edwards25519 Go implementation. - [lukechampine / **us**](https://github.com/lukechampine/us) / **merkle/blake2b** + [lukechampine / **us**](https://github.com/lukechampine/us) An alternative interface to Sia @@ -84,10 +84,6 @@ SPECK cipher go-chaskey: an implementation of chaskey, an efficient MAC for microcontrollers - [ericlagergren / **lwcrypto**](https://github.com/ericlagergren/lwcrypto) / **ascon** - -NIST Lightweight Cryptography finalists - - [ericlagergren / **lwcrypto**](https://github.com/ericlagergren/lwcrypto) / **grain** + [ericlagergren / **lwcrypto**](https://github.com/ericlagergren/lwcrypto) NIST Lightweight Cryptography finalists diff --git a/internal/cmd/docgen/main.go b/internal/cmd/docgen/main.go index b48c341..c93ddbe 100644 --- a/internal/cmd/docgen/main.go +++ b/internal/cmd/docgen/main.go @@ -32,7 +32,7 @@ var ( typ = flag.String("type", "", "documentation type") tmpl = flag.String("tmpl", "", "explicit template file (overrides -type)") output = flag.String("output", "", "path to output file (default stdout)") - pkgsfilename = flag.String("pkgs", "", "packages configuration") + prjsfilename = flag.String("prjs", "", "projects configuration") ) func mainerr() (err error) { @@ -57,19 +57,19 @@ func mainerr() (err error) { return err } - // Load third-party packages. - if *pkgsfilename == "" { - return errors.New("missing packages configuration") + // Load third-party projects. + if *prjsfilename == "" { + return errors.New("missing projects configuration") } - pkgs, err := thirdparty.LoadPackagesFile(*pkgsfilename) + prjs, err := thirdparty.LoadProjectsFile(*prjsfilename) if err != nil { return err } // Execute. data := map[string]interface{}{ - "Packages": pkgs, + "Projects": prjs, } var buf bytes.Buffer diff --git a/internal/cmd/docgen/templates/adopters.tmpl b/internal/cmd/docgen/templates/adopters.tmpl index 6bfb685..67ee562 100644 --- a/internal/cmd/docgen/templates/adopters.tmpl +++ b/internal/cmd/docgen/templates/adopters.tmpl @@ -1,7 +1,6 @@ # Adopters -{{ range .Packages.Ranked }} +{{ range .Projects.Ranked }} {{ avatar .Repository.Owner 28 }} [{{ .Repository.Owner }} / **{{ .Repository.Name }}**]({{ .Repository.URL }}) -{{- if .SubPackage }} / **{{ .SubPackage}}**{{ end }} {{ .Metadata.Description }} {{ end -}} diff --git a/internal/cmd/docgen/templates/readme.tmpl b/internal/cmd/docgen/templates/readme.tmpl index ad5e857..b5918c9 100644 --- a/internal/cmd/docgen/templates/readme.tmpl +++ b/internal/cmd/docgen/templates/readme.tmpl @@ -105,10 +105,9 @@ Implementations of full algorithms: Popular projects using `avo`: -{{ range .Packages.Top 10 -}} +{{ range .Projects.Top 10 -}} {{ if lt .Metadata.Stars 100 }}{{break}}{{ end -}} {{ avatar .Repository.Owner 24 }} [{{ .Repository.Owner }} / **{{ .Repository.Name }}**]({{ .Repository.URL }}) -{{- if .SubPackage }} / **{{ .SubPackage}}**{{ end }} :star: {{ .Metadata.Stars }} > {{ .Metadata.Description }} diff --git a/script/doc b/script/doc index 14b5ba7..0216e0b 100755 --- a/script/doc +++ b/script/doc @@ -3,9 +3,9 @@ # Generate some specific files with docgen. go install ./internal/cmd/docgen -pkgs="tests/thirdparty/packages.json" -docgen -pkgs "${pkgs}" -type readme -output README.md -docgen -pkgs "${pkgs}" -type adopters -output doc/adopters.md +prjs="tests/thirdparty/projects.json" +docgen -prjs "${prjs}" -type readme -output README.md +docgen -prjs "${prjs}" -type adopters -output doc/adopters.md # Process simple file embeddings with embedmd. find . -name '*.md' | xargs embedmd -w diff --git a/tests/thirdparty/config.go b/tests/thirdparty/config.go index ba6b8bc..c5dbc20 100644 --- a/tests/thirdparty/config.go +++ b/tests/thirdparty/config.go @@ -1,4 +1,4 @@ -// Package thirdparty executes integration tests based on third-party packages that use avo. +// Package thirdparty executes integration tests based on third-party projects that use avo. package thirdparty import ( @@ -45,6 +45,71 @@ type Metadata struct { Stars int `json:"stars,omitempty"` } +// Project defines an integration test based on a third-party project using avo. +type Project struct { + // Repository for the project. At the moment, all projects are available on + // github. + Repository GithubRepository `json:"repository"` + + // Repository metadata. + Metadata Metadata `json:"metadata"` + + // Default git branch. This is used when testing against the latest version. + DefaultBranch string `json:"default_branch,omitempty"` + + // Version as a git sha, tag or branch. + Version string `json:"version"` + + // If the project test has a known problem, record it by setting this to a + // non-zero avo issue number. If set, the project will be skipped in + // testing. + KnownIssue int `json:"known_issue,omitempty"` + + // Packages within the project to test. + Packages []*Package `json:"packages"` +} + +func (p *Project) defaults(set bool) { + for _, pkg := range p.Packages { + pkg.defaults(set) + } +} + +// Validate project definition. +func (p *Project) Validate() error { + if p.DefaultBranch == "" { + return errors.New("missing default branch") + } + if p.Version == "" { + return errors.New("missing version") + } + if len(p.Packages) == 0 { + return errors.New("missing packages") + } + for _, pkg := range p.Packages { + if err := pkg.Validate(); err != nil { + return fmt.Errorf("package %s: %w", pkg.Name(), err) + } + } + return nil +} + +// ID returns an identifier for the project. +func (p *Project) ID() string { + return strings.ReplaceAll(p.Repository.String(), "/", "-") +} + +// Skip reports whether the project test should be skipped. If skipped, a known +// issue will be set. +func (p *Project) Skip() bool { + return p.KnownIssue != 0 +} + +// Reason returns the reason why the test is skipped. +func (p *Project) Reason() string { + return fmt.Sprintf("https://github.com/mmcloughlin/avo/issues/%d", p.KnownIssue) +} + // Step represents a set of commands to run as part of the testing plan for a // third-party package. type Step struct { @@ -64,24 +129,11 @@ func (s *Step) Validate() error { return nil } -// Package defines an integration test based on a third-party package using avo. +// Package defines an integration test for a package within a project. type Package struct { - // Repository the package belongs to. At the moment, all packages are - // available on github. - Repository GithubRepository `json:"repository"` - - // Repository metadata. - Metadata Metadata `json:"metadata"` - - // Default git branch. This is used when testing against the latest version. - DefaultBranch string `json:"default_branch,omitempty"` - - // Version as a git sha, tag or branch. - Version string `json:"version"` - - // Sub-package within the repository under test. All file path references - // will be relative to this directory. If empty the root of the repository - // is used. + // Sub-package within the project under test. All file path references will + // be relative to this directory. If empty the root of the repository is + // used. SubPackage string `json:"pkg,omitempty"` // Path to the module file for the avo generator package. This is necessary @@ -95,32 +147,10 @@ type Package struct { Setup []*Step `json:"setup,omitempty"` // Steps to run the avo code generator. - Generate []*Step `json:"generate"` // generate commands to run + Generate []*Step `json:"generate"` // Test steps. If empty, defaults to "go test ./...". Test []*Step `json:"test,omitempty"` - - // If the package test has a known problem, record it by setting this to a - // non-zero avo issue number. If set, the package will be skipped in - // testing. - KnownIssue int `json:"known_issue,omitempty"` -} - -// ID returns an identifier for the package. -func (p *Package) ID() string { - pkgpath := path.Join(p.Repository.String(), p.SubPackage) - return strings.ReplaceAll(pkgpath, "/", "-") -} - -// Skip reports whether the package test should be skipped. If skipped, a known -// issue will be set. -func (p *Package) Skip() bool { - return p.KnownIssue != 0 -} - -// Reason returns the reason why the test is skipped. -func (p *Package) Reason() string { - return fmt.Sprintf("https://github.com/mmcloughlin/avo/issues/%d", p.KnownIssue) } // defaults sets or removes default field values. @@ -152,12 +182,6 @@ func applydefault(set bool, s, def string) string { // Validate package definition. func (p *Package) Validate() error { - if p.DefaultBranch == "" { - return errors.New("missing default branch") - } - if p.Version == "" { - return errors.New("missing version") - } if p.Module == "" { return errors.New("missing module") } @@ -181,6 +205,19 @@ func (p *Package) Validate() error { return nil } +// Name of the package. +func (p *Package) Name() string { + if p.IsRoot() { + return "root" + } + return p.SubPackage +} + +// IsRoot reports whether the package is the root of the containing project. +func (p *Package) IsRoot() bool { + return p.SubPackage == "" +} + // Context specifies execution environment parameters for a third-party test. type Context struct { // Path to the avo version under test. @@ -243,37 +280,72 @@ func (p *Package) Steps(c *Context) []*Step { return steps } -// Packages is a collection of third-party integration tests. -type Packages []*Package +// Test case for a given package within a project. +type Test struct { + Project *Project + Package *Package +} -func (p Packages) defaults(set bool) { - for _, pkg := range p { - pkg.defaults(set) +// ID returns an identifier for the test case. +func (t *Test) ID() string { + pkgpath := path.Join(t.Project.Repository.String(), t.Package.SubPackage) + return strings.ReplaceAll(pkgpath, "/", "-") +} + +// Projects is a collection of third-party integration tests. +type Projects []*Project + +func (p Projects) defaults(set bool) { + for _, prj := range p { + prj.defaults(set) } } -// Validate the package collection. -func (p Packages) Validate() error { - for _, pkg := range p { - if err := pkg.Validate(); err != nil { - return fmt.Errorf("package %s: %w", pkg.ID(), err) +// Validate the project collection. +func (p Projects) Validate() error { + seen := map[string]bool{} + for _, prj := range p { + // Project is valid. + if err := prj.Validate(); err != nil { + return fmt.Errorf("project %s: %w", prj.ID(), err) } + + // No duplicate entries. + id := prj.ID() + if seen[id] { + return fmt.Errorf("duplicate project %q", id) + } + seen[id] = true } return nil } -// Ranked returns a copy of the packages list ranked in desending order of +// Tests returns all test cases for the projects collection. +func (p Projects) Tests() []*Test { + var ts []*Test + for _, prj := range p { + for _, pkg := range prj.Packages { + ts = append(ts, &Test{ + Project: prj, + Package: pkg, + }) + } + } + return ts +} + +// Ranked returns a copy of the projects list ranked in desending order of // popularity. -func (p Packages) Ranked() Packages { - ranked := append(Packages(nil), p...) +func (p Projects) Ranked() Projects { + ranked := append(Projects(nil), p...) sort.SliceStable(ranked, func(i, j int) bool { return ranked[i].Metadata.Stars > ranked[j].Metadata.Stars }) return ranked } -// Top returns the top n most popular packages. -func (p Packages) Top(n int) Packages { +// Top returns the top n most popular projects. +func (p Projects) Top(n int) Projects { top := p.Ranked() if len(top) > n { top = top[:n] @@ -281,44 +353,44 @@ func (p Packages) Top(n int) Packages { return top } -// LoadPackages loads a list of package configurations from JSON format. -func LoadPackages(r io.Reader) (Packages, error) { - var pkgs Packages +// LoadProjects loads a list of project configurations from JSON format. +func LoadProjects(r io.Reader) (Projects, error) { + var prjs Projects d := json.NewDecoder(r) d.DisallowUnknownFields() - if err := d.Decode(&pkgs); err != nil { + if err := d.Decode(&prjs); err != nil { return nil, err } - pkgs.defaults(true) - return pkgs, nil + prjs.defaults(true) + return prjs, nil } -// LoadPackagesFile loads a list of package configurations from a JSON file. -func LoadPackagesFile(filename string) (Packages, error) { +// LoadProjectsFile loads a list of project configurations from a JSON file. +func LoadProjectsFile(filename string) (Projects, error) { f, err := os.Open(filename) if err != nil { return nil, err } defer f.Close() - return LoadPackages(f) + return LoadProjects(f) } -// StorePackages writes a list of package configurations in JSON format. -func StorePackages(w io.Writer, pkgs Packages) error { +// StoreProjects writes a list of project configurations in JSON format. +func StoreProjects(w io.Writer, prjs Projects) error { e := json.NewEncoder(w) e.SetIndent("", " ") - pkgs.defaults(false) - err := e.Encode(pkgs) - pkgs.defaults(true) + prjs.defaults(false) + err := e.Encode(prjs) + prjs.defaults(true) return err } -// StorePackagesFile writes a list of package configurations to a JSON file. -func StorePackagesFile(filename string, pkgs Packages) error { +// StoreProjectsFile writes a list of project configurations to a JSON file. +func StoreProjectsFile(filename string, prjs Projects) error { f, err := os.Create(filename) if err != nil { return err } defer f.Close() - return StorePackages(f, pkgs) + return StoreProjects(f, prjs) } diff --git a/tests/thirdparty/config_test.go b/tests/thirdparty/config_test.go index 6954b65..990c00c 100644 --- a/tests/thirdparty/config_test.go +++ b/tests/thirdparty/config_test.go @@ -26,46 +26,57 @@ func TestValidateErrors(t *testing.T) { ErrorSubstring: "missing commands", }, { - Name: "package_missing_default_branch", - Item: &Package{ + Name: "project_missing_default_branch", + Item: &Project{ Repository: GithubRepository{Owner: "octocat", Name: "hello-world"}, }, ErrorSubstring: "missing default branch", }, { - Name: "package_missing_version", - Item: &Package{ + Name: "project_missing_version", + Item: &Project{ Repository: GithubRepository{Owner: "octocat", Name: "hello-world"}, DefaultBranch: "main", }, ErrorSubstring: "missing version", }, { - Name: "package_missing_module", - Item: &Package{ + Name: "project_missing_packages", + Item: &Project{ Repository: GithubRepository{Owner: "octocat", Name: "hello-world"}, DefaultBranch: "main", - Version: "v1.0.1", + Version: "v0.1.1", }, + ErrorSubstring: "missing packages", + }, + { + Name: "project_package_error", + Item: &Project{ + Repository: GithubRepository{Owner: "octocat", Name: "hello-world"}, + DefaultBranch: "main", + Version: "v0.1.1", + Packages: []*Package{ + {}, + }, + }, + ErrorSubstring: "package root: missing module", + }, + { + Name: "package_missing_module", + Item: &Package{}, ErrorSubstring: "missing module", }, { Name: "package_no_generate_commands", Item: &Package{ - Repository: GithubRepository{Owner: "octocat", Name: "hello-world"}, - DefaultBranch: "main", - Version: "v1.0.1", - Module: "avo/go.mod", + Module: "avo/go.mod", }, ErrorSubstring: "no generate commands", }, { Name: "package_invalid_generate_commands", Item: &Package{ - Repository: GithubRepository{Owner: "octocat", Name: "hello-world"}, - DefaultBranch: "main", - Version: "v1.0.1", - Module: "avo/go.mod", + Module: "avo/go.mod", Generate: []*Step{ {}, }, @@ -73,8 +84,8 @@ func TestValidateErrors(t *testing.T) { ErrorSubstring: "generate step: missing name", }, { - Name: "packages_invalid_package", - Item: Packages{ + Name: "projects_invalid_package", + Item: Projects{ { Repository: GithubRepository{Owner: "octocat", Name: "hello-world"}, }, @@ -96,17 +107,17 @@ func TestValidateErrors(t *testing.T) { } } -func TestLoadPackagesBad(t *testing.T) { +func TestLoadProjectsBad(t *testing.T) { r := strings.NewReader(`[{"unknown_field": "value"}]`) - _, err := LoadPackages(r) + _, err := LoadProjects(r) if err == nil { t.Fatal("expected non-nil error") } } -func TestLoadPackagesFileNotExist(t *testing.T) { - pkgs, err := LoadPackagesFile("does_not_exist") - if pkgs != nil { +func TestLoadProjectsFileNotExist(t *testing.T) { + prjs, err := LoadProjectsFile("does_not_exist") + if prjs != nil { t.Fatal("expected nil return") } if err == nil { @@ -114,24 +125,24 @@ func TestLoadPackagesFileNotExist(t *testing.T) { } } -func TestPackagesFileValid(t *testing.T) { - pkgs, err := LoadPackagesFile("packages.json") +func TestProjectsFileValid(t *testing.T) { + prjs, err := LoadProjectsFile("projects.json") if err != nil { t.Fatal(err) } - for _, pkg := range pkgs { - t.Logf("read: %s", pkg.ID()) + for _, prj := range prjs { + t.Logf("read: %s", prj.ID()) } - if len(pkgs) == 0 { + if len(prjs) == 0 { t.Fatal("no packages loaded") } - if err := pkgs.Validate(); err != nil { + if err := prjs.Validate(); err != nil { t.Fatal(err) } } -func TestPackagesFileStepsValid(t *testing.T) { - pkgs, err := LoadPackagesFile("packages.json") +func TestProjectsFileStepsValid(t *testing.T) { + prjs, err := LoadProjectsFile("projects.json") if err != nil { t.Fatal(err) } @@ -139,34 +150,36 @@ func TestPackagesFileStepsValid(t *testing.T) { AvoDirectory: "avo", RepositoryDirectory: "repo", } - for _, pkg := range pkgs { - for _, s := range pkg.Steps(c) { - if err := s.Validate(); err != nil { - t.Errorf("package %s: %s", pkg.ID(), err) + for _, prj := range prjs { + for _, pkg := range prj.Packages { + for _, s := range pkg.Steps(c) { + if err := s.Validate(); err != nil { + t.Errorf("project %s: package %s: %s", prj.ID(), pkg.Name(), err) + } } } } } -func TestPackagesFileRoundtrip(t *testing.T) { - pkgs, err := LoadPackagesFile("packages.json") +func TestProjectsFileRoundtrip(t *testing.T) { + prjs, err := LoadProjectsFile("projects.json") if err != nil { t.Fatal(err) } // Write and read back. buf := bytes.NewBuffer(nil) - if err := StorePackages(buf, pkgs); err != nil { + if err := StoreProjects(buf, prjs); err != nil { t.Fatal(err) } - roundtrip, err := LoadPackages(buf) + roundtrip, err := LoadProjects(buf) if err != nil { t.Fatal(err) } // Should be identical. - if !reflect.DeepEqual(pkgs, roundtrip) { + if !reflect.DeepEqual(prjs, roundtrip) { t.Fatal("roundtrip mismatch") } } diff --git a/tests/thirdparty/make_workflow.go b/tests/thirdparty/make_workflow.go index d2ac9ab..0ba391a 100644 --- a/tests/thirdparty/make_workflow.go +++ b/tests/thirdparty/make_workflow.go @@ -16,7 +16,7 @@ import ( ) var ( - pkgsfilename = flag.String("pkgs", "", "packages configuration") + prjsfilename = flag.String("prjs", "", "projects configuration") output = flag.String("output", "", "path to output file (default stdout)") ) @@ -29,13 +29,13 @@ func main() { func mainerr() error { flag.Parse() - // Read packages. - pkgs, err := thirdparty.LoadPackagesFile(*pkgsfilename) + // Read projects. + prjs, err := thirdparty.LoadProjectsFile(*prjsfilename) if err != nil { return err } - if err := pkgs.Validate(); err != nil { + if err := prjs.Validate(); err != nil { return err } @@ -51,7 +51,7 @@ func mainerr() error { } // Generate workflow file. - b, err := GenerateWorkflow(pkgs) + b, err := GenerateWorkflow(prjs) if err != nil { return err } @@ -64,7 +64,7 @@ func mainerr() error { return nil } -func GenerateWorkflow(pkgs thirdparty.Packages) ([]byte, error) { +func GenerateWorkflow(prjs thirdparty.Projects) ([]byte, error) { g := &prnt.Generator{} g.SetIndentString(" ") @@ -84,16 +84,16 @@ func GenerateWorkflow(pkgs thirdparty.Packages) ([]byte, error) { g.Linef(" - master") g.Linef(" pull_request:") - // One job per package. + // One job per test case. g.Linef("jobs:") g.Indent() - for _, pkg := range pkgs { - g.Linef("%s:", pkg.ID()) + for _, t := range prjs.Tests() { + g.Linef("%s:", t.ID()) g.Indent() g.Linef("runs-on: ubuntu-latest") - if pkg.Skip() { - g.Linef("if: false # skip: %s", pkg.Reason()) + if t.Project.Skip() { + g.Linef("if: false # skip: %s", t.Project.Reason()) } g.Linef("steps:") g.Indent() @@ -114,12 +114,12 @@ func GenerateWorkflow(pkgs thirdparty.Packages) ([]byte, error) { g.Linef(" persist-credentials: false") // Checkout the third-party package. - pkgdir := pkg.Repository.Name - g.Linef("- name: Checkout %s", pkg.Repository) + pkgdir := t.Project.Repository.Name + g.Linef("- name: Checkout %s", t.Project.Repository) g.Linef(" uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4") g.Linef(" with:") - g.Linef(" repository: %s", pkg.Repository) - g.Linef(" ref: %s", pkg.Version) + g.Linef(" repository: %s", t.Project.Repository) + g.Linef(" ref: %s", t.Project.Version) g.Linef(" path: %s", pkgdir) g.Linef(" persist-credentials: false") @@ -129,7 +129,7 @@ func GenerateWorkflow(pkgs thirdparty.Packages) ([]byte, error) { RepositoryDirectory: path.Join("${{ github.workspace }}", pkgdir), } - for _, step := range pkg.Steps(c) { + for _, step := range t.Package.Steps(c) { g.Linef("- name: %s", step.Name) g.Linef(" working-directory: %s", path.Join(pkgdir, step.WorkingDirectory)) if len(step.Commands) == 1 { diff --git a/tests/thirdparty/metadata_test.go b/tests/thirdparty/metadata_test.go index aa9a626..ae09cb4 100644 --- a/tests/thirdparty/metadata_test.go +++ b/tests/thirdparty/metadata_test.go @@ -9,84 +9,84 @@ import ( "github.com/mmcloughlin/avo/internal/test" ) -var update = flag.Bool("update", false, "update package metadata") +var update = flag.Bool("update", false, "update project metadata") -func TestPackagesFileMetadata(t *testing.T) { +func TestProjectsFileMetadata(t *testing.T) { test.RequiresNetwork(t) ctx := context.Background() - pkgs, err := LoadPackagesFile("packages.json") + prjs, err := LoadProjectsFile("projects.json") if err != nil { t.Fatal(err) } g := github.NewClient(github.WithTokenFromEnvironment()) - for _, pkg := range pkgs { + for _, prj := range prjs { // Fetch metadata. - r, err := g.Repository(ctx, pkg.Repository.Owner, pkg.Repository.Name) + r, err := g.Repository(ctx, prj.Repository.Owner, prj.Repository.Name) if err != nil { t.Fatal(err) } // Update, if requested. if *update { - pkg.DefaultBranch = r.DefaultBranch - pkg.Metadata.Description = r.Description - pkg.Metadata.Homepage = r.Homepage - pkg.Metadata.Stars = r.StargazersCount + prj.DefaultBranch = r.DefaultBranch + prj.Metadata.Description = r.Description + prj.Metadata.Homepage = r.Homepage + prj.Metadata.Stars = r.StargazersCount - t.Logf("%s: metadata updated", pkg.ID()) + t.Logf("%s: metadata updated", prj.ID()) } // Check up to date. Potentially fast-changing properties not included. uptodate := true - uptodate = pkg.DefaultBranch == r.DefaultBranch && uptodate - uptodate = pkg.Metadata.Description == r.Description && uptodate - uptodate = pkg.Metadata.Homepage == r.Homepage && uptodate + uptodate = prj.DefaultBranch == r.DefaultBranch && uptodate + uptodate = prj.Metadata.Description == r.Description && uptodate + uptodate = prj.Metadata.Homepage == r.Homepage && uptodate if !uptodate { - t.Errorf("%s: metadata out of date (use -update flag to fix)", pkg.ID()) + t.Errorf("%s: metadata out of date (use -update flag to fix)", prj.ID()) } } - if err := StorePackagesFile("packages.json", pkgs); err != nil { + if err := StoreProjectsFile("projects.json", prjs); err != nil { t.Fatal(err) } } -func TestPackagesFileKnownIssues(t *testing.T) { +func TestProjectsFileKnownIssues(t *testing.T) { test.RequiresNetwork(t) ctx := context.Background() - pkgs, err := LoadPackagesFile("packages.json") + prjs, err := LoadProjectsFile("projects.json") if err != nil { t.Fatal(err) } g := github.NewClient(github.WithTokenFromEnvironment()) - for _, pkg := range pkgs { + for _, prj := range prjs { // Skipped packages must refer to an open issue. - if !pkg.Skip() { + if !prj.Skip() { continue } - if pkg.KnownIssue == 0 { - t.Errorf("%s: skipped package must refer to known issue", pkg.ID()) + if prj.KnownIssue == 0 { + t.Errorf("%s: skipped package must refer to known issue", prj.ID()) } - issue, err := g.Issue(ctx, "mmcloughlin", "avo", pkg.KnownIssue) + issue, err := g.Issue(ctx, "mmcloughlin", "avo", prj.KnownIssue) if err != nil { t.Fatal(err) } if issue.State != "open" { - t.Errorf("%s: known issue in %s state", pkg.ID(), issue.State) + t.Errorf("%s: known issue in %s state", prj.ID(), issue.State) } - if pkg.Reason() != issue.HTMLURL { - t.Errorf("%s: expected skip reason to be the issue url %s", pkg.ID(), issue.HTMLURL) + if prj.Reason() != issue.HTMLURL { + t.Errorf("%s: expected skip reason to be the issue url %s", prj.ID(), issue.HTMLURL) } } } diff --git a/tests/thirdparty/packages.json b/tests/thirdparty/packages.json deleted file mode 100644 index b2666ba..0000000 --- a/tests/thirdparty/packages.json +++ /dev/null @@ -1,685 +0,0 @@ -[ - { - "repository": { - "owner": "zeebo", - "name": "xxh3" - }, - "metadata": { - "description": "XXH3 algorithm in Go", - "stars": 238 - }, - "default_branch": "master", - "version": "v1.0.0-rc1", - "module": "avo/go.mod", - "generate": [ - { - "dir": "avo", - "commands": [ - "go run . -avx -out ../accum_vector_avx_amd64.s", - "go run . -sse -out ../accum_vector_sse_amd64.s" - ] - } - ] - }, - { - "repository": { - "owner": "dgryski", - "name": "go-sip13" - }, - "metadata": { - "description": "siphash 1-3", - "stars": 32 - }, - "default_branch": "master", - "version": "62edffca92457b3a66125c686137cc5f0fe81672", - "module": "_avo/go.mod", - "setup": [ - { - "name": "Setup Root Module", - "commands": [ - "go mod init github.com/dgryski/go-sip13" - ] - }, - { - "name": "Setup Generator Module", - "dir": "_avo", - "commands": [ - "sed -i.bak '/+build ignore/d' asm.go", - "go mod init github.com/dgryski/go-sip13/_avo" - ] - } - ], - "generate": [ - { - "dir": "_avo", - "commands": [ - "go mod edit -modfile=go.mod -require=github.com/dgryski/go-sip13@v0.0.0-00010101000000-000000000000", - "go mod edit -modfile=go.mod -replace=github.com/dgryski/go-sip13=../", - "go run . -out ../sip13_amd64.s" - ] - } - ] - }, - { - "repository": { - "owner": "phoreproject", - "name": "bls" - }, - "metadata": { - "description": "Go implementation of the BLS12-381 pairing", - "stars": 81 - }, - "default_branch": "master", - "version": "a88a5ae26844d7293359422888d7c7f69f43c845", - "module": "asm/go.mod", - "setup": [ - { - "name": "Setup Root Module", - "commands": [ - "go mod tidy" - ] - }, - { - "name": "Setup Generator Module", - "dir": "asm", - "commands": [ - "sed -i.bak '/+build ignore/d' asm.go", - "go mod init github.com/phoreproject/bls/asm" - ] - } - ], - "generate": [ - { - "dir": "asm", - "commands": [ - "go mod edit -modfile=go.mod -require=github.com/phoreproject/bls@v0.0.0-00010101000000-000000000000", - "go mod edit -modfile=go.mod -replace=github.com/phoreproject/bls=../", - "go mod download", - "go run . -out ../primitivefuncs_amd64.s" - ] - } - ] - }, - { - "repository": { - "owner": "minio", - "name": "md5-simd" - }, - "metadata": { - "description": "Accelerate aggregated MD5 hashing performance up to 8x for AVX512 and 4x for AVX2. Useful for server applications that need to compute many MD5 sums in parallel.", - "stars": 108 - }, - "default_branch": "master", - "version": "30ad8af83f6868c2a30c615f3edf1a9366bf3f89", - "module": "_gen/go.mod", - "generate": [ - { - "dir": "_gen", - "commands": [ - "go run gen.go -out ../md5block_amd64.s -stubs ../md5block_amd64.go -pkg md5simd" - ] - } - ] - }, - { - "repository": { - "owner": "zeebo", - "name": "blake3" - }, - "metadata": { - "description": "Pure Go implementation of BLAKE3 with AVX2 and SSE4.1 acceleration", - "stars": 288 - }, - "default_branch": "master", - "version": "25dba572f0e78ec108f0dd79c9c15288f542d7d9", - "module": "avo/go.mod", - "generate": [ - { - "dir": "avo", - "commands": [ - "go run ./avx2 -out ../avx2/impl.s", - "go run ./sse41 -out ../sse41/impl.s" - ] - } - ] - }, - { - "repository": { - "owner": "klauspost", - "name": "reedsolomon" - }, - "metadata": { - "description": "Reed-Solomon Erasure Coding in Go", - "stars": 1437 - }, - "default_branch": "master", - "version": "922778284547557265cff0f903ab5f4c27e40ae9", - "module": "_gen/go.mod", - "generate": [ - { - "dir": "_gen", - "commands": [ - "go run gen.go -out ../galois_gen_amd64.s -stubs ../galois_gen_amd64.go -pkg reedsolomon" - ] - } - ] - }, - { - "repository": { - "owner": "orisano", - "name": "wyhash" - }, - "metadata": { - "description": "A pure-Go wyhash implementation.", - "stars": 24 - }, - "default_branch": "master", - "version": "32a3f7f6ba4797e2d87dab2969cc9dd63d39cce9", - "module": "avo/go.mod", - "setup": [ - { - "name": "Setup Generator Module", - "dir": "avo", - "commands": [ - "go mod init github.com/orisano/wyhash/avo" - ] - } - ], - "generate": [ - { - "dir": "avo", - "commands": [ - "go run gen.go -out ../blocks_amd64.s -stubs ../blocks_amd64.go -pkg wyhash" - ] - } - ] - }, - { - "repository": { - "owner": "klauspost", - "name": "compress" - }, - "metadata": { - "description": "Optimized Go Compression Packages", - "stars": 2703 - }, - "default_branch": "master", - "version": "2adf487b3e02f95ce7efd6e4953fda0ae7ecd080", - "pkg": "s2", - "module": "_generate/go.mod", - "generate": [ - { - "dir": "_generate", - "commands": [ - "go run gen.go -out ../encodeblock_amd64.s -stubs ../encodeblock_amd64.go -pkg s2" - ] - } - ] - }, - { - "repository": { - "owner": "dgryski", - "name": "go-bloomindex" - }, - "metadata": { - "description": "Bloom-filter based search index", - "stars": 111 - }, - "default_branch": "master", - "version": "0902316dce158c154b958ee5cfc706c62af29a42", - "module": "avo/go.mod", - "setup": [ - { - "name": "Setup Root Module", - "commands": [ - "go mod init github.com/dgryski/go-bloomindex", - "go get github.com/dgryski/go-bits@v0.0.0-20180113010104-bd8a69a71dc2" - ] - }, - { - "name": "Create Generator Module", - "commands": [ - "mkdir avo", - "git mv asm.go avo" - ] - }, - { - "name": "Setup Generator Module", - "dir": "avo", - "commands": [ - "sed -i.bak '/+build ignore/d' asm.go", - "go mod init github.com/dgryski/go-bloomindex/avo" - ] - } - ], - "generate": [ - { - "dir": "avo", - "commands": [ - "go run asm.go -out ../query_amd64.s" - ] - } - ] - }, - { - "repository": { - "owner": "dgryski", - "name": "go-marvin32" - }, - "metadata": { - "description": "Assembly-optimized Marvin32 hash function", - "stars": 12 - }, - "default_branch": "master", - "version": "7d18f4c6ea7c24b29d1c7a670f8ae40b0812f2e3", - "module": "avo/go.mod", - "setup": [ - { - "name": "Setup Root Module", - "commands": [ - "go mod init github.com/dgryski/go-marvin32" - ] - }, - { - "name": "Create Generator Module", - "commands": [ - "mkdir avo", - "git mv asm.go avo" - ] - }, - { - "name": "Setup Generator Module", - "dir": "avo", - "commands": [ - "sed -i.bak '/+build ignore/d' asm.go", - "go mod init github.com/dgryski/go-marvin32/avo" - ] - } - ], - "generate": [ - { - "dir": "avo", - "commands": [ - "go mod edit -modfile=go.mod -require=github.com/dgryski/go-marvin32@v0.0.0-00010101000000-000000000000", - "go mod edit -modfile=go.mod -replace=github.com/dgryski/go-marvin32=../", - "go run asm.go -out ../marvin_amd64.s" - ] - } - ] - }, - { - "repository": { - "owner": "dgryski", - "name": "go-speck" - }, - "metadata": { - "description": "SPECK cipher", - "stars": 10 - }, - "default_branch": "master", - "version": "5b36d4c08d8840c352a153bf37281434ad550ec0", - "module": "avo/go.mod", - "setup": [ - { - "name": "Setup Root Module", - "commands": [ - "go mod init github.com/dgryski/go-speck", - "go get github.com/dgryski/go-skipjack@v0.0.0-20150401095227-f3a984a142ab" - ] - }, - { - "name": "Create Generator Module", - "commands": [ - "mkdir avo", - "git mv asm.go avo" - ] - }, - { - "name": "Setup Generator Module", - "dir": "avo", - "commands": [ - "sed -i.bak '/+build ignore/d' asm.go", - "go mod init github.com/dgryski/go-speck/avo" - ] - } - ], - "generate": [ - { - "dir": "avo", - "commands": [ - "go mod edit -modfile=go.mod -require=github.com/dgryski/go-speck@v0.0.0-00010101000000-000000000000", - "go mod edit -modfile=go.mod -replace=github.com/dgryski/go-speck=../", - "go run asm.go -out ../speck_amd64.s" - ] - } - ] - }, - { - "repository": { - "owner": "dgryski", - "name": "go-chaskey" - }, - "metadata": { - "description": "go-chaskey: an implementation of chaskey, an efficient MAC for microcontrollers", - "stars": 8 - }, - "default_branch": "master", - "version": "ba454392bc5ab6daae103e15147185f8f4a27dcc", - "module": "avo/go.mod", - "setup": [ - { - "name": "Setup Root Module", - "commands": [ - "go mod init github.com/dgryski/go-chaskey", - "go get github.com/dchest/siphash@v1.2.2" - ] - }, - { - "name": "Create Generator Module", - "commands": [ - "mkdir avo", - "git mv asm.go avo" - ] - }, - { - "name": "Setup Generator Module", - "dir": "avo", - "commands": [ - "sed -i.bak '/+build ignore/d' asm.go", - "go mod init github.com/dgryski/go-chaskey/avo" - ] - } - ], - "generate": [ - { - "dir": "avo", - "commands": [ - "go mod edit -modfile=go.mod -require=github.com/dgryski/go-chaskey@v0.0.0-00010101000000-000000000000", - "go mod edit -modfile=go.mod -replace=github.com/dgryski/go-chaskey=../", - "go run asm.go -out ../core_amd64.s" - ] - } - ] - }, - { - "repository": { - "owner": "lukechampine", - "name": "us" - }, - "metadata": { - "description": "An alternative interface to Sia", - "stars": 52 - }, - "default_branch": "master", - "version": "dff56a80f83653cb14eeeb57ba6ba3c3e942c412", - "pkg": "merkle/blake2b", - "module": "avo/go.mod", - "setup": [ - { - "name": "Create Generator Module", - "commands": [ - "mkdir avo", - "git mv gen.go avo" - ] - }, - { - "name": "Setup Generator Module", - "dir": "avo", - "commands": [ - "sed -i.bak '/+build ignore/d' gen.go", - "go mod init github.com/lukechampine/us/merkle/blake2b/avo" - ] - } - ], - "generate": [ - { - "dir": "avo", - "commands": [ - "go run gen.go -out ../blake2b_amd64.s" - ] - } - ] - }, - { - "repository": { - "owner": "segmentio", - "name": "asm" - }, - "metadata": { - "description": "Go library providing algorithms optimized to leverage the characteristics of modern CPUs", - "stars": 685 - }, - "default_branch": "main", - "version": "2bf3fdd47b1cdbe8fe020f032caf14891e10a85f", - "module": "build/go.mod", - "generate": [ - { - "commands": [ - "make --always-make build" - ] - } - ] - }, - { - "repository": { - "owner": "ericlagergren", - "name": "lwcrypto" - }, - "metadata": { - "description": "NIST Lightweight Cryptography finalists", - "stars": 4 - }, - "default_branch": "main", - "version": "0c42b05eddc34c58bf8e0cd4250c5cd2c256ea57", - "pkg": "ascon", - "module": "asm/go.mod", - "generate": [ - { - "dir": "asm", - "commands": [ - "go mod edit -require=github.com/ericlagergren/lwcrypto@v0.0.0-00010101000000-000000000000", - "go generate -v -x" - ] - } - ] - }, - { - "repository": { - "owner": "ericlagergren", - "name": "lwcrypto" - }, - "metadata": { - "description": "NIST Lightweight Cryptography finalists", - "stars": 4 - }, - "default_branch": "main", - "version": "0c42b05eddc34c58bf8e0cd4250c5cd2c256ea57", - "pkg": "grain", - "module": "asm/go.mod", - "generate": [ - { - "dir": "asm", - "commands": [ - "go mod edit -require=github.com/ericlagergren/lwcrypto@v0.0.0-00010101000000-000000000000", - "go generate -v -x" - ] - } - ] - }, - { - "repository": { - "owner": "oasisprotocol", - "name": "curve25519-voi" - }, - "metadata": { - "description": "High-performance Curve25519/ristretto255 for Go", - "stars": 45 - }, - "default_branch": "master", - "version": "d5a936accd94ef9da4c0fe9db0a6342dcdcfeadf", - "module": "internal/asm/amd64/go.mod", - "generate": [ - { - "dir": "internal/asm/amd64", - "commands": [ - "bash -ex gen.sh" - ] - } - ] - }, - { - "repository": { - "owner": "oasisprotocol", - "name": "deoxysii" - }, - "metadata": { - "description": "Go Deoxys-II-256-128", - "stars": 17 - }, - "default_branch": "master", - "version": "2091330c22b71dd4e04e15306498e68f3a1b3afc", - "module": "internal/hardware/asm/go.mod", - "generate": [ - { - "dir": "internal/hardware/asm", - "commands": [ - "bash -ex gen.sh" - ] - } - ] - }, - { - "repository": { - "owner": "golang", - "name": "crypto" - }, - "metadata": { - "description": "[mirror] Go supplementary cryptography libraries", - "homepage": "https://golang.org/x/crypto", - "stars": 2402 - }, - "default_branch": "master", - "version": "089bfa5675191fd96a44247682f76ebca03d7916", - "pkg": "curve25519", - "module": "internal/field/_asm/go.mod", - "generate": [ - { - "dir": "internal/field/_asm", - "commands": [ - "go generate -v -x" - ] - } - ] - }, - { - "repository": { - "owner": "FiloSottile", - "name": "edwards25519" - }, - "metadata": { - "description": "filippo.io/edwards25519 — A safer, faster, and more powerful low-level edwards25519 Go implementation.", - "homepage": "https://filippo.io/edwards25519", - "stars": 81 - }, - "default_branch": "main", - "version": "v1.0.0-rc.1", - "module": "field/_asm/go.mod", - "generate": [ - { - "dir": "field/_asm", - "commands": [ - "go generate -v -x" - ] - } - ] - }, - { - "repository": { - "owner": "lukechampine", - "name": "blake3" - }, - "metadata": { - "description": "A pure-Go implementation of the BLAKE3 cryptographic hash function", - "stars": 278 - }, - "default_branch": "master", - "version": "v1.1.7", - "module": "avo/go.mod", - "setup": [ - { - "name": "Setup Generator Module", - "dir": "avo", - "commands": [ - "sed -i.bak '/build ignore/d' gen.go", - "go mod init github.com/lukechampine/blake3/avo" - ] - } - ], - "generate": [ - { - "dir": "avo", - "commands": [ - "go run gen.go -out ../blake3_amd64.s" - ] - } - ] - }, - { - "repository": { - "owner": "mmcloughlin", - "name": "md4" - }, - "metadata": { - "description": "Assembly-optimized MD4 hash algorithm in Go", - "stars": 15 - }, - "default_branch": "main", - "version": "v0.1.2", - "module": "asm/go.mod", - "generate": [ - { - "commands": [ - "go generate -v -x" - ] - } - ] - }, - { - "repository": { - "owner": "golang", - "name": "go" - }, - "metadata": { - "description": "The Go programming language", - "homepage": "https://go.dev", - "stars": 98269 - }, - "default_branch": "master", - "version": "go1.17.3", - "module": "src/crypto/ed25519/internal/edwards25519/field/_asm/go.mod", - "setup": [ - { - "name": "Compile Go Toolchain", - "dir": "src", - "commands": [ - "./make.bash" - ] - } - ], - "generate": [ - { - "dir": "src/crypto/ed25519/internal/edwards25519/field/_asm", - "commands": [ - "go generate -v -x" - ] - } - ], - "test": [ - { - "commands": [ - "env --unset=GOROOT ./bin/go test crypto/ed25519/..." - ] - } - ] - } -] diff --git a/tests/thirdparty/packages_test.go b/tests/thirdparty/packages_test.go index 5552779..b0f9c85 100644 --- a/tests/thirdparty/packages_test.go +++ b/tests/thirdparty/packages_test.go @@ -10,33 +10,33 @@ import ( "github.com/mmcloughlin/avo/internal/test" ) -//go:generate go run make_workflow.go -pkgs packages.json -output ../../.github/workflows/packages.yml +//go:generate go run make_workflow.go -prjs projects.json -output ../../.github/workflows/packages.yml // Custom flags. var ( - pkgsfilename = flag.String("pkgs", "", "packages configuration") + prjsfilename = flag.String("prjs", "", "projects configuration") preserve = flag.Bool("preserve", false, "preserve working directories") - latest = flag.Bool("latest", false, "use latest versions of each package") + latest = flag.Bool("latest", false, "use latest versions of each project") ) -// TestPackages runs integration tests on all packages specified by packages +// TestPackages runs integration tests on all packages specified by projects // file given on the command line. func TestPackages(t *testing.T) { - // Load packages. - if *pkgsfilename == "" { - t.Skip("no packages specified") + // Load projects. + if *prjsfilename == "" { + t.Skip("no projects specified") } - pkgs, err := LoadPackagesFile(*pkgsfilename) + prjs, err := LoadProjectsFile(*prjsfilename) if err != nil { t.Fatal(err) } - for _, pkg := range pkgs { - pkg := pkg // scopelint - t.Run(pkg.ID(), func(t *testing.T) { - if pkg.Skip() { - t.Skipf("skip: %s", pkg.Reason()) + for _, tst := range prjs.Tests() { + tst := tst // scopelint + t.Run(tst.ID(), func(t *testing.T) { + if tst.Project.Skip() { + t.Skipf("skip: %s", tst.Project.Reason()) } dir, clean := test.TempDir(t) if !*preserve { @@ -46,7 +46,7 @@ func TestPackages(t *testing.T) { } pt := PackageTest{ T: t, - Package: pkg, + Test: tst, WorkDir: dir, Latest: *latest, } @@ -58,10 +58,10 @@ func TestPackages(t *testing.T) { // PackageTest executes an integration test based on a given third-party package. type PackageTest struct { *testing.T - *Package + *Test WorkDir string // working directory for the test - Latest bool // use latest version of the package + Latest bool // use latest version of the project repopath string // path the repo is cloned to } @@ -75,15 +75,15 @@ func (t *PackageTest) Run() { // checkout the code at the specified version. func (t *PackageTest) checkout() { // Determine the version we want to checkout. - version := t.Version + version := t.Project.Version if t.Latest { - version = t.DefaultBranch + version = t.Project.DefaultBranch } // Clone. Use a shallow clone to speed up large repositories. t.repopath = filepath.Join(t.WorkDir, t.Name()) test.Exec(t.T, "git", "init", t.repopath) - test.Exec(t.T, "git", "-C", t.repopath, "remote", "add", "origin", t.Repository.CloneURL()) + test.Exec(t.T, "git", "-C", t.repopath, "remote", "add", "origin", t.Project.Repository.CloneURL()) test.Exec(t.T, "git", "-C", t.repopath, "fetch", "--depth=1", "origin", version) test.Exec(t.T, "git", "-C", t.repopath, "checkout", "FETCH_HEAD") } @@ -102,7 +102,7 @@ func (t *PackageTest) steps() { RepositoryDirectory: t.repopath, } - for _, s := range t.Steps(c) { + for _, s := range t.Package.Steps(c) { for _, command := range s.Commands { cmd := exec.Command("sh", "-c", command) cmd.Dir = filepath.Join(t.repopath, s.WorkingDirectory) diff --git a/tests/thirdparty/projects.json b/tests/thirdparty/projects.json new file mode 100644 index 0000000..cd32056 --- /dev/null +++ b/tests/thirdparty/projects.json @@ -0,0 +1,763 @@ +[ + { + "repository": { + "owner": "zeebo", + "name": "xxh3" + }, + "metadata": { + "description": "XXH3 algorithm in Go", + "stars": 238 + }, + "default_branch": "master", + "version": "v1.0.0-rc1", + "packages": [ + { + "module": "avo/go.mod", + "generate": [ + { + "dir": "avo", + "commands": [ + "go run . -avx -out ../accum_vector_avx_amd64.s", + "go run . -sse -out ../accum_vector_sse_amd64.s" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "dgryski", + "name": "go-sip13" + }, + "metadata": { + "description": "siphash 1-3", + "stars": 32 + }, + "default_branch": "master", + "version": "62edffca92457b3a66125c686137cc5f0fe81672", + "packages": [ + { + "module": "_avo/go.mod", + "setup": [ + { + "name": "Setup Root Module", + "commands": [ + "go mod init github.com/dgryski/go-sip13" + ] + }, + { + "name": "Setup Generator Module", + "dir": "_avo", + "commands": [ + "sed -i.bak '/+build ignore/d' asm.go", + "go mod init github.com/dgryski/go-sip13/_avo" + ] + } + ], + "generate": [ + { + "dir": "_avo", + "commands": [ + "go mod edit -modfile=go.mod -require=github.com/dgryski/go-sip13@v0.0.0-00010101000000-000000000000", + "go mod edit -modfile=go.mod -replace=github.com/dgryski/go-sip13=../", + "go run . -out ../sip13_amd64.s" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "phoreproject", + "name": "bls" + }, + "metadata": { + "description": "Go implementation of the BLS12-381 pairing", + "stars": 81 + }, + "default_branch": "master", + "version": "a88a5ae26844d7293359422888d7c7f69f43c845", + "packages": [ + { + "module": "asm/go.mod", + "setup": [ + { + "name": "Setup Root Module", + "commands": [ + "go mod tidy" + ] + }, + { + "name": "Setup Generator Module", + "dir": "asm", + "commands": [ + "sed -i.bak '/+build ignore/d' asm.go", + "go mod init github.com/phoreproject/bls/asm" + ] + } + ], + "generate": [ + { + "dir": "asm", + "commands": [ + "go mod edit -modfile=go.mod -require=github.com/phoreproject/bls@v0.0.0-00010101000000-000000000000", + "go mod edit -modfile=go.mod -replace=github.com/phoreproject/bls=../", + "go mod download", + "go run . -out ../primitivefuncs_amd64.s" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "minio", + "name": "md5-simd" + }, + "metadata": { + "description": "Accelerate aggregated MD5 hashing performance up to 8x for AVX512 and 4x for AVX2. Useful for server applications that need to compute many MD5 sums in parallel.", + "stars": 109 + }, + "default_branch": "master", + "version": "30ad8af83f6868c2a30c615f3edf1a9366bf3f89", + "packages": [ + { + "module": "_gen/go.mod", + "generate": [ + { + "dir": "_gen", + "commands": [ + "go run gen.go -out ../md5block_amd64.s -stubs ../md5block_amd64.go -pkg md5simd" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "zeebo", + "name": "blake3" + }, + "metadata": { + "description": "Pure Go implementation of BLAKE3 with AVX2 and SSE4.1 acceleration", + "stars": 288 + }, + "default_branch": "master", + "version": "25dba572f0e78ec108f0dd79c9c15288f542d7d9", + "packages": [ + { + "module": "avo/go.mod", + "generate": [ + { + "dir": "avo", + "commands": [ + "go run ./avx2 -out ../avx2/impl.s", + "go run ./sse41 -out ../sse41/impl.s" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "klauspost", + "name": "reedsolomon" + }, + "metadata": { + "description": "Reed-Solomon Erasure Coding in Go", + "stars": 1438 + }, + "default_branch": "master", + "version": "922778284547557265cff0f903ab5f4c27e40ae9", + "packages": [ + { + "module": "_gen/go.mod", + "generate": [ + { + "dir": "_gen", + "commands": [ + "go run gen.go -out ../galois_gen_amd64.s -stubs ../galois_gen_amd64.go -pkg reedsolomon" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "orisano", + "name": "wyhash" + }, + "metadata": { + "description": "A pure-Go wyhash implementation.", + "stars": 24 + }, + "default_branch": "master", + "version": "32a3f7f6ba4797e2d87dab2969cc9dd63d39cce9", + "packages": [ + { + "module": "avo/go.mod", + "setup": [ + { + "name": "Setup Generator Module", + "dir": "avo", + "commands": [ + "go mod init github.com/orisano/wyhash/avo" + ] + } + ], + "generate": [ + { + "dir": "avo", + "commands": [ + "go run gen.go -out ../blocks_amd64.s -stubs ../blocks_amd64.go -pkg wyhash" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "klauspost", + "name": "compress" + }, + "metadata": { + "description": "Optimized Go Compression Packages", + "stars": 2706 + }, + "default_branch": "master", + "version": "2adf487b3e02f95ce7efd6e4953fda0ae7ecd080", + "packages": [ + { + "pkg": "s2", + "module": "_generate/go.mod", + "generate": [ + { + "dir": "_generate", + "commands": [ + "go run gen.go -out ../encodeblock_amd64.s -stubs ../encodeblock_amd64.go -pkg s2" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "dgryski", + "name": "go-bloomindex" + }, + "metadata": { + "description": "Bloom-filter based search index", + "stars": 111 + }, + "default_branch": "master", + "version": "0902316dce158c154b958ee5cfc706c62af29a42", + "packages": [ + { + "module": "avo/go.mod", + "setup": [ + { + "name": "Setup Root Module", + "commands": [ + "go mod init github.com/dgryski/go-bloomindex", + "go get github.com/dgryski/go-bits@v0.0.0-20180113010104-bd8a69a71dc2" + ] + }, + { + "name": "Create Generator Module", + "commands": [ + "mkdir avo", + "git mv asm.go avo" + ] + }, + { + "name": "Setup Generator Module", + "dir": "avo", + "commands": [ + "sed -i.bak '/+build ignore/d' asm.go", + "go mod init github.com/dgryski/go-bloomindex/avo" + ] + } + ], + "generate": [ + { + "dir": "avo", + "commands": [ + "go run asm.go -out ../query_amd64.s" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "dgryski", + "name": "go-marvin32" + }, + "metadata": { + "description": "Assembly-optimized Marvin32 hash function", + "stars": 12 + }, + "default_branch": "master", + "version": "7d18f4c6ea7c24b29d1c7a670f8ae40b0812f2e3", + "packages": [ + { + "module": "avo/go.mod", + "setup": [ + { + "name": "Setup Root Module", + "commands": [ + "go mod init github.com/dgryski/go-marvin32" + ] + }, + { + "name": "Create Generator Module", + "commands": [ + "mkdir avo", + "git mv asm.go avo" + ] + }, + { + "name": "Setup Generator Module", + "dir": "avo", + "commands": [ + "sed -i.bak '/+build ignore/d' asm.go", + "go mod init github.com/dgryski/go-marvin32/avo" + ] + } + ], + "generate": [ + { + "dir": "avo", + "commands": [ + "go mod edit -modfile=go.mod -require=github.com/dgryski/go-marvin32@v0.0.0-00010101000000-000000000000", + "go mod edit -modfile=go.mod -replace=github.com/dgryski/go-marvin32=../", + "go run asm.go -out ../marvin_amd64.s" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "dgryski", + "name": "go-speck" + }, + "metadata": { + "description": "SPECK cipher", + "stars": 10 + }, + "default_branch": "master", + "version": "5b36d4c08d8840c352a153bf37281434ad550ec0", + "packages": [ + { + "module": "avo/go.mod", + "setup": [ + { + "name": "Setup Root Module", + "commands": [ + "go mod init github.com/dgryski/go-speck", + "go get github.com/dgryski/go-skipjack@v0.0.0-20150401095227-f3a984a142ab" + ] + }, + { + "name": "Create Generator Module", + "commands": [ + "mkdir avo", + "git mv asm.go avo" + ] + }, + { + "name": "Setup Generator Module", + "dir": "avo", + "commands": [ + "sed -i.bak '/+build ignore/d' asm.go", + "go mod init github.com/dgryski/go-speck/avo" + ] + } + ], + "generate": [ + { + "dir": "avo", + "commands": [ + "go mod edit -modfile=go.mod -require=github.com/dgryski/go-speck@v0.0.0-00010101000000-000000000000", + "go mod edit -modfile=go.mod -replace=github.com/dgryski/go-speck=../", + "go run asm.go -out ../speck_amd64.s" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "dgryski", + "name": "go-chaskey" + }, + "metadata": { + "description": "go-chaskey: an implementation of chaskey, an efficient MAC for microcontrollers", + "stars": 8 + }, + "default_branch": "master", + "version": "ba454392bc5ab6daae103e15147185f8f4a27dcc", + "packages": [ + { + "module": "avo/go.mod", + "setup": [ + { + "name": "Setup Root Module", + "commands": [ + "go mod init github.com/dgryski/go-chaskey", + "go get github.com/dchest/siphash@v1.2.2" + ] + }, + { + "name": "Create Generator Module", + "commands": [ + "mkdir avo", + "git mv asm.go avo" + ] + }, + { + "name": "Setup Generator Module", + "dir": "avo", + "commands": [ + "sed -i.bak '/+build ignore/d' asm.go", + "go mod init github.com/dgryski/go-chaskey/avo" + ] + } + ], + "generate": [ + { + "dir": "avo", + "commands": [ + "go mod edit -modfile=go.mod -require=github.com/dgryski/go-chaskey@v0.0.0-00010101000000-000000000000", + "go mod edit -modfile=go.mod -replace=github.com/dgryski/go-chaskey=../", + "go run asm.go -out ../core_amd64.s" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "lukechampine", + "name": "us" + }, + "metadata": { + "description": "An alternative interface to Sia", + "stars": 52 + }, + "default_branch": "master", + "version": "dff56a80f83653cb14eeeb57ba6ba3c3e942c412", + "packages": [ + { + "pkg": "merkle/blake2b", + "module": "avo/go.mod", + "setup": [ + { + "name": "Create Generator Module", + "commands": [ + "mkdir avo", + "git mv gen.go avo" + ] + }, + { + "name": "Setup Generator Module", + "dir": "avo", + "commands": [ + "sed -i.bak '/+build ignore/d' gen.go", + "go mod init github.com/lukechampine/us/merkle/blake2b/avo" + ] + } + ], + "generate": [ + { + "dir": "avo", + "commands": [ + "go run gen.go -out ../blake2b_amd64.s" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "segmentio", + "name": "asm" + }, + "metadata": { + "description": "Go library providing algorithms optimized to leverage the characteristics of modern CPUs", + "stars": 686 + }, + "default_branch": "main", + "version": "2bf3fdd47b1cdbe8fe020f032caf14891e10a85f", + "packages": [ + { + "module": "build/go.mod", + "generate": [ + { + "commands": [ + "make --always-make build" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "ericlagergren", + "name": "lwcrypto" + }, + "metadata": { + "description": "NIST Lightweight Cryptography finalists", + "stars": 4 + }, + "default_branch": "main", + "version": "0c42b05eddc34c58bf8e0cd4250c5cd2c256ea57", + "packages": [ + { + "pkg": "ascon", + "module": "asm/go.mod", + "generate": [ + { + "dir": "asm", + "commands": [ + "go mod edit -require=github.com/ericlagergren/lwcrypto@v0.0.0-00010101000000-000000000000", + "go generate -v -x" + ] + } + ] + }, + { + "pkg": "grain", + "module": "asm/go.mod", + "generate": [ + { + "dir": "asm", + "commands": [ + "go mod edit -require=github.com/ericlagergren/lwcrypto@v0.0.0-00010101000000-000000000000", + "go generate -v -x" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "oasisprotocol", + "name": "curve25519-voi" + }, + "metadata": { + "description": "High-performance Curve25519/ristretto255 for Go", + "stars": 45 + }, + "default_branch": "master", + "version": "d5a936accd94ef9da4c0fe9db0a6342dcdcfeadf", + "packages": [ + { + "module": "internal/asm/amd64/go.mod", + "generate": [ + { + "dir": "internal/asm/amd64", + "commands": [ + "bash -ex gen.sh" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "oasisprotocol", + "name": "deoxysii" + }, + "metadata": { + "description": "Go Deoxys-II-256-128", + "stars": 17 + }, + "default_branch": "master", + "version": "2091330c22b71dd4e04e15306498e68f3a1b3afc", + "packages": [ + { + "module": "internal/hardware/asm/go.mod", + "generate": [ + { + "dir": "internal/hardware/asm", + "commands": [ + "bash -ex gen.sh" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "golang", + "name": "crypto" + }, + "metadata": { + "description": "[mirror] Go supplementary cryptography libraries", + "homepage": "https://golang.org/x/crypto", + "stars": 2402 + }, + "default_branch": "master", + "version": "089bfa5675191fd96a44247682f76ebca03d7916", + "packages": [ + { + "pkg": "curve25519", + "module": "internal/field/_asm/go.mod", + "generate": [ + { + "dir": "internal/field/_asm", + "commands": [ + "go generate -v -x" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "FiloSottile", + "name": "edwards25519" + }, + "metadata": { + "description": "filippo.io/edwards25519 — A safer, faster, and more powerful low-level edwards25519 Go implementation.", + "homepage": "https://filippo.io/edwards25519", + "stars": 81 + }, + "default_branch": "main", + "version": "v1.0.0-rc.1", + "packages": [ + { + "module": "field/_asm/go.mod", + "generate": [ + { + "dir": "field/_asm", + "commands": [ + "go generate -v -x" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "lukechampine", + "name": "blake3" + }, + "metadata": { + "description": "A pure-Go implementation of the BLAKE3 cryptographic hash function", + "stars": 277 + }, + "default_branch": "master", + "version": "v1.1.7", + "packages": [ + { + "module": "avo/go.mod", + "setup": [ + { + "name": "Setup Generator Module", + "dir": "avo", + "commands": [ + "sed -i.bak '/build ignore/d' gen.go", + "go mod init github.com/lukechampine/blake3/avo" + ] + } + ], + "generate": [ + { + "dir": "avo", + "commands": [ + "go run gen.go -out ../blake3_amd64.s" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "mmcloughlin", + "name": "md4" + }, + "metadata": { + "description": "Assembly-optimized MD4 hash algorithm in Go", + "stars": 15 + }, + "default_branch": "main", + "version": "v0.1.2", + "packages": [ + { + "module": "asm/go.mod", + "generate": [ + { + "commands": [ + "go generate -v -x" + ] + } + ] + } + ] + }, + { + "repository": { + "owner": "golang", + "name": "go" + }, + "metadata": { + "description": "The Go programming language", + "homepage": "https://go.dev", + "stars": 98315 + }, + "default_branch": "master", + "version": "go1.17.3", + "packages": [ + { + "module": "src/crypto/ed25519/internal/edwards25519/field/_asm/go.mod", + "setup": [ + { + "name": "Compile Go Toolchain", + "dir": "src", + "commands": [ + "./make.bash" + ] + } + ], + "generate": [ + { + "dir": "src/crypto/ed25519/internal/edwards25519/field/_asm", + "commands": [ + "go generate -v -x" + ] + } + ], + "test": [ + { + "commands": [ + "env --unset=GOROOT ./bin/go test crypto/ed25519/..." + ] + } + ] + } + ] + } +]