mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-07 20:30:36 -05:00
hugolib: Add another site benchmark
Also rework test test setup so the benchmarks can also be run as tests, which is useful when creating new benchmarks an make sure they ... work.
This commit is contained in:
parent
de7b9475c0
commit
dc1d4a9200
1 changed files with 80 additions and 11 deletions
|
@ -14,11 +14,20 @@
|
||||||
package hugolib
|
package hugolib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"path"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO(bep) eventually remove the old (too complicated setup).
|
type siteBenchmarkTestcase struct {
|
||||||
func BenchmarkSiteNew(b *testing.B) {
|
name string
|
||||||
|
create func(t testing.TB) *sitesBuilder
|
||||||
|
check func(s *sitesBuilder)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getBenchmarkSiteNewTestCases() []siteBenchmarkTestcase {
|
||||||
// TODO(bep) create some common and stable data set
|
// TODO(bep) create some common and stable data set
|
||||||
|
|
||||||
const pageContent = `---
|
const pageContent = `---
|
||||||
|
@ -34,12 +43,8 @@ baseURL = "https://example.com"
|
||||||
|
|
||||||
`
|
`
|
||||||
|
|
||||||
benchmarks := []struct {
|
benchmarks := []siteBenchmarkTestcase{
|
||||||
name string
|
{"Bundle with image", func(b testing.TB) *sitesBuilder {
|
||||||
create func(i int) *sitesBuilder
|
|
||||||
check func(s *sitesBuilder)
|
|
||||||
}{
|
|
||||||
{"Bundle with image", func(i int) *sitesBuilder {
|
|
||||||
sb := newTestSitesBuilder(b).WithConfigFile("toml", config)
|
sb := newTestSitesBuilder(b).WithConfigFile("toml", config)
|
||||||
sb.WithContent("content/blog/mybundle/index.md", pageContent)
|
sb.WithContent("content/blog/mybundle/index.md", pageContent)
|
||||||
sb.WithSunset("content/blog/mybundle/sunset1.jpg")
|
sb.WithSunset("content/blog/mybundle/sunset1.jpg")
|
||||||
|
@ -52,7 +57,7 @@ baseURL = "https://example.com"
|
||||||
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{"Bundle with JSON file", func(i int) *sitesBuilder {
|
{"Bundle with JSON file", func(b testing.TB) *sitesBuilder {
|
||||||
sb := newTestSitesBuilder(b).WithConfigFile("toml", config)
|
sb := newTestSitesBuilder(b).WithConfigFile("toml", config)
|
||||||
sb.WithContent("content/blog/mybundle/index.md", pageContent)
|
sb.WithContent("content/blog/mybundle/index.md", pageContent)
|
||||||
sb.WithContent("content/blog/mybundle/mydata.json", `{ "hello": "world" }`)
|
sb.WithContent("content/blog/mybundle/mydata.json", `{ "hello": "world" }`)
|
||||||
|
@ -65,31 +70,95 @@ baseURL = "https://example.com"
|
||||||
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{"Multiple languages", func(i int) *sitesBuilder {
|
{"Deep content tree", func(b testing.TB) *sitesBuilder {
|
||||||
|
|
||||||
sb := newTestSitesBuilder(b).WithConfigFile("toml", `
|
sb := newTestSitesBuilder(b).WithConfigFile("toml", `
|
||||||
baseURL = "https://example.com"
|
baseURL = "https://example.com"
|
||||||
|
|
||||||
[languages]
|
[languages]
|
||||||
[languages.en]
|
[languages.en]
|
||||||
weight=1
|
weight=1
|
||||||
|
contentDir="content/en"
|
||||||
[languages.fr]
|
[languages.fr]
|
||||||
weight=2
|
weight=2
|
||||||
|
contentDir="content/fr"
|
||||||
|
[languages.no]
|
||||||
|
weight=3
|
||||||
|
contentDir="content/no"
|
||||||
|
[languages.sv]
|
||||||
|
weight=4
|
||||||
|
contentDir="content/sv"
|
||||||
|
|
||||||
`)
|
`)
|
||||||
|
|
||||||
|
createContent := func(dir, name string) {
|
||||||
|
sb.WithContent(filepath.Join("content", dir, name), pageContent)
|
||||||
|
}
|
||||||
|
|
||||||
|
createBundledFiles := func(dir string) {
|
||||||
|
sb.WithContent(filepath.Join("content", dir, "data.json"), `{ "hello": "world" }`)
|
||||||
|
for i := 1; i <= 3; i++ {
|
||||||
|
sb.WithContent(filepath.Join("content", dir, fmt.Sprintf("page%d.md", i)), pageContent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, lang := range []string{"en", "fr", "no", "sv"} {
|
||||||
|
for level := 1; level <= 5; level++ {
|
||||||
|
sectionDir := path.Join(lang, strings.Repeat("section/", level))
|
||||||
|
createContent(sectionDir, "_index.md")
|
||||||
|
createBundledFiles(sectionDir)
|
||||||
|
for i := 1; i <= 3; i++ {
|
||||||
|
leafBundleDir := path.Join(sectionDir, fmt.Sprintf("bundle%d", i))
|
||||||
|
createContent(leafBundleDir, "index.md")
|
||||||
|
createBundledFiles(path.Join(leafBundleDir, "assets1"))
|
||||||
|
createBundledFiles(path.Join(leafBundleDir, "assets1", "assets2"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return sb
|
return sb
|
||||||
},
|
},
|
||||||
func(s *sitesBuilder) {
|
func(s *sitesBuilder) {
|
||||||
|
s.CheckExists("public/blog/mybundle/index.html")
|
||||||
|
s.Assertions.Equal(4, len(s.H.Sites))
|
||||||
|
s.Assertions.Equal(len(s.H.Sites[0].RegularPages()), len(s.H.Sites[1].RegularPages()))
|
||||||
|
s.Assertions.Equal(30, len(s.H.Sites[0].RegularPages()))
|
||||||
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return benchmarks
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run the benchmarks below as tests. Mostly useful when adding new benchmark
|
||||||
|
// variants.
|
||||||
|
func TestBenchmarkSiteNew(b *testing.T) {
|
||||||
|
benchmarks := getBenchmarkSiteNewTestCases()
|
||||||
|
for _, bm := range benchmarks {
|
||||||
|
b.Run(bm.name, func(b *testing.T) {
|
||||||
|
s := bm.create(b)
|
||||||
|
|
||||||
|
err := s.BuildE(BuildCfg{})
|
||||||
|
if err != nil {
|
||||||
|
b.Fatal(err)
|
||||||
|
}
|
||||||
|
bm.check(s)
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(bep) eventually remove the old (too complicated setup).
|
||||||
|
func BenchmarkSiteNew(b *testing.B) {
|
||||||
|
benchmarks := getBenchmarkSiteNewTestCases()
|
||||||
|
|
||||||
for _, bm := range benchmarks {
|
for _, bm := range benchmarks {
|
||||||
b.Run(bm.name, func(b *testing.B) {
|
b.Run(bm.name, func(b *testing.B) {
|
||||||
sites := make([]*sitesBuilder, b.N)
|
sites := make([]*sitesBuilder, b.N)
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
sites[i] = bm.create(i)
|
sites[i] = bm.create(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
|
|
Loading…
Reference in a new issue