hugolib: Add another site benchmark - hugo - [fork] hugo port for 9front
 (HTM) git clone git@git.drkhsh.at/hugo.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit dc1d4a9200c54e631775f34725140fd5009aa561
 (DIR) parent de7b9475c049e5df5b076d80799ebcbee3eb84c8
 (HTM) Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
       Date:   Tue, 25 Jun 2019 23:56:06 +0200
       
       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.
       
       Diffstat:
         M hugolib/site_benchmark_new_test.go  |      91 +++++++++++++++++++++++++++----
       
       1 file changed, 80 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git 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()