diff --git a/hugolib/site_benchmark_new_test.go b/hugolib/site_benchmark_new_test.go index c816dc9c3..1066df68e 100644 --- a/hugolib/site_benchmark_new_test.go +++ b/hugolib/site_benchmark_new_test.go @@ -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 = `--- @@ -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") @@ -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" }`) @@ -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()