Skip to content

Commit

Permalink
hugolib: Add another site benchmark
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
bep committed Jun 26, 2019
1 parent de7b947 commit dc1d4a9
Showing 1 changed file with 80 additions and 11 deletions.
91 changes: 80 additions & 11 deletions hugolib/site_benchmark_new_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,20 @@
package hugolib

import (
"fmt"
"path"
"path/filepath"
"strings"
"testing"
)

// TODO(bep) eventually remove the old (too complicated setup).
func BenchmarkSiteNew(b *testing.B) {
type siteBenchmarkTestcase struct {
name string
create func(t testing.TB) *sitesBuilder
check func(s *sitesBuilder)
}

func getBenchmarkSiteNewTestCases() []siteBenchmarkTestcase {
// TODO(bep) create some common and stable data set

const pageContent = `---
Expand All @@ -34,12 +43,8 @@ baseURL = "https://example.com"
`

benchmarks := []struct {
name string
create func(i int) *sitesBuilder
check func(s *sitesBuilder)
}{
{"Bundle with image", func(i int) *sitesBuilder {
benchmarks := []siteBenchmarkTestcase{
{"Bundle with image", func(b testing.TB) *sitesBuilder {
sb := newTestSitesBuilder(b).WithConfigFile("toml", config)
sb.WithContent("content/blog/mybundle/index.md", pageContent)
sb.WithSunset("content/blog/mybundle/sunset1.jpg")
Expand All @@ -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.WithContent("content/blog/mybundle/index.md", pageContent)
sb.WithContent("content/blog/mybundle/mydata.json", `{ "hello": "world" }`)
Expand All @@ -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", `
baseURL = "https://example.com"
[languages]
[languages.en]
weight=1
contentDir="content/en"
[languages.fr]
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
},
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 {
b.Run(bm.name, func(b *testing.B) {
sites := make([]*sitesBuilder, b.N)
for i := 0; i < b.N; i++ {
sites[i] = bm.create(i)
sites[i] = bm.create(b)
}

b.ResetTimer()
Expand Down

0 comments on commit dc1d4a9

Please sign in to comment.