shithub: hugo

Download patch

ref: 3b721110d560c8831c282e6e7a5c510fe7a5129a
parent: 40ba7e6d63c1a0734f257a642e46eb1572116a32
author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
date: Mon Feb 10 07:03:41 EST 2020

Shuffle test files before insertion

--- a/hugolib/testhelpers_test.go
+++ b/hugolib/testhelpers_test.go
@@ -3,10 +3,12 @@
 import (
 	"image/jpeg"
 	"io"
+	"math/rand"
 	"path/filepath"
 	"runtime"
 	"strconv"
 	"testing"
+	"time"
 	"unicode/utf8"
 
 	"github.com/gohugoio/hugo/output"
@@ -63,7 +65,7 @@
 	*qt.C
 
 	logger *loggers.Logger
-
+	rnd    *rand.Rand
 	dumper litter.Options
 
 	// Used to test partial rebuilds.
@@ -89,19 +91,24 @@
 
 	addNothing bool
 	// Base data/content
-	contentFilePairs  []string
-	templateFilePairs []string
-	i18nFilePairs     []string
-	dataFilePairs     []string
+	contentFilePairs  []filenameContent
+	templateFilePairs []filenameContent
+	i18nFilePairs     []filenameContent
+	dataFilePairs     []filenameContent
 
 	// Additional data/content.
 	// As in "use the base, but add these on top".
-	contentFilePairsAdded  []string
-	templateFilePairsAdded []string
-	i18nFilePairsAdded     []string
-	dataFilePairsAdded     []string
+	contentFilePairsAdded  []filenameContent
+	templateFilePairsAdded []filenameContent
+	i18nFilePairsAdded     []filenameContent
+	dataFilePairsAdded     []filenameContent
 }
 
+type filenameContent struct {
+	filename string
+	content  string
+}
+
 func newTestSitesBuilder(t testing.TB) *sitesBuilder {
 	v := viper.New()
 	fs := hugofs.NewMem(v)
@@ -112,7 +119,8 @@
 		Separator:         " ",
 	}
 
-	return &sitesBuilder{T: t, C: qt.New(t), Fs: fs, configFormat: "toml", dumper: litterOptions}
+	return &sitesBuilder{T: t, C: qt.New(t), Fs: fs, configFormat: "toml",
+		dumper: litterOptions, rnd: rand.New(rand.NewSource(time.Now().Unix()))}
 }
 
 func newTestSitesBuilderFromDepsCfg(t testing.TB, d deps.DepsCfg) *sitesBuilder {
@@ -124,7 +132,7 @@
 		Separator:         " ",
 	}
 
-	b := &sitesBuilder{T: t, C: c, depsCfg: d, Fs: d.Fs, dumper: litterOptions}
+	b := &sitesBuilder{T: t, C: c, depsCfg: d, Fs: d.Fs, dumper: litterOptions, rnd: rand.New(rand.NewSource(time.Now().Unix()))}
 	workingDir := d.Cfg.GetString("workingDir")
 
 	b.WithWorkingDir(workingDir)
@@ -349,43 +357,62 @@
 	src.Close()
 }
 
+func (s *sitesBuilder) createFilenameContent(pairs []string) []filenameContent {
+	var slice []filenameContent
+	s.appendFilenameContent(&slice, pairs...)
+	return slice
+}
+
+func (s *sitesBuilder) appendFilenameContent(slice *[]filenameContent, pairs ...string) {
+	if len(pairs)%2 != 0 {
+		panic("file content mismatch")
+	}
+	for i := 0; i < len(pairs); i += 2 {
+		c := filenameContent{
+			filename: pairs[i],
+			content:  pairs[i+1],
+		}
+		*slice = append(*slice, c)
+	}
+}
+
 func (s *sitesBuilder) WithContent(filenameContent ...string) *sitesBuilder {
-	s.contentFilePairs = append(s.contentFilePairs, filenameContent...)
+	s.appendFilenameContent(&s.contentFilePairs, filenameContent...)
 	return s
 }
 
 func (s *sitesBuilder) WithContentAdded(filenameContent ...string) *sitesBuilder {
-	s.contentFilePairsAdded = append(s.contentFilePairsAdded, filenameContent...)
+	s.appendFilenameContent(&s.contentFilePairsAdded, filenameContent...)
 	return s
 }
 
 func (s *sitesBuilder) WithTemplates(filenameContent ...string) *sitesBuilder {
-	s.templateFilePairs = append(s.templateFilePairs, filenameContent...)
+	s.appendFilenameContent(&s.templateFilePairs, filenameContent...)
 	return s
 }
 
 func (s *sitesBuilder) WithTemplatesAdded(filenameContent ...string) *sitesBuilder {
-	s.templateFilePairsAdded = append(s.templateFilePairsAdded, filenameContent...)
+	s.appendFilenameContent(&s.templateFilePairsAdded, filenameContent...)
 	return s
 }
 
 func (s *sitesBuilder) WithData(filenameContent ...string) *sitesBuilder {
-	s.dataFilePairs = append(s.dataFilePairs, filenameContent...)
+	s.appendFilenameContent(&s.dataFilePairs, filenameContent...)
 	return s
 }
 
 func (s *sitesBuilder) WithDataAdded(filenameContent ...string) *sitesBuilder {
-	s.dataFilePairsAdded = append(s.dataFilePairsAdded, filenameContent...)
+	s.appendFilenameContent(&s.dataFilePairsAdded, filenameContent...)
 	return s
 }
 
 func (s *sitesBuilder) WithI18n(filenameContent ...string) *sitesBuilder {
-	s.i18nFilePairs = append(s.i18nFilePairs, filenameContent...)
+	s.appendFilenameContent(&s.i18nFilePairs, filenameContent...)
 	return s
 }
 
 func (s *sitesBuilder) WithI18nAdded(filenameContent ...string) *sitesBuilder {
-	s.i18nFilePairsAdded = append(s.i18nFilePairsAdded, filenameContent...)
+	s.appendFilenameContent(&s.i18nFilePairsAdded, filenameContent...)
 	return s
 }
 
@@ -409,15 +436,17 @@
 	return s
 }
 
-func (s *sitesBuilder) writeFilePairs(folder string, filenameContent []string) *sitesBuilder {
-	if len(filenameContent)%2 != 0 {
-		s.Fatalf("expect filenameContent for %q in pairs (%d)", folder, len(filenameContent))
-	}
-	for i := 0; i < len(filenameContent); i += 2 {
-		filename, content := filenameContent[i], filenameContent[i+1]
+func (s *sitesBuilder) writeFilePairs(folder string, files []filenameContent) *sitesBuilder {
+	// We have had some "filesystem ordering" bugs that we have not discovered in
+	// our tests running with the in memory filesystem.
+	// That file system is backed by a map so not sure how this helps, but some
+	// randomness in tests doesn't hurt.
+	s.rnd.Shuffle(len(files), func(i, j int) { files[i], files[j] = files[j], files[i] })
+
+	for _, fc := range files {
 		target := folder
 		// TODO(bep) clean  up this magic.
-		if strings.HasPrefix(filename, folder) {
+		if strings.HasPrefix(fc.filename, folder) {
 			target = ""
 		}
 
@@ -425,7 +454,7 @@
 			target = filepath.Join(s.workingDir, target)
 		}
 
-		writeSource(s.T, s.Fs, filepath.Join(target, filename), content)
+		writeSource(s.T, s.Fs, filepath.Join(target, fc.filename), fc.content)
 	}
 	return s
 }
@@ -640,16 +669,17 @@
 	)
 
 	if len(s.contentFilePairs) == 0 {
-		s.writeFilePairs("content", defaultContent)
+		s.writeFilePairs("content", s.createFilenameContent(defaultContent))
 	}
+
 	if len(s.templateFilePairs) == 0 {
-		s.writeFilePairs("layouts", defaultTemplates)
+		s.writeFilePairs("layouts", s.createFilenameContent(defaultTemplates))
 	}
 	if len(s.dataFilePairs) == 0 {
-		s.writeFilePairs("data", defaultData)
+		s.writeFilePairs("data", s.createFilenameContent(defaultData))
 	}
 	if len(s.i18nFilePairs) == 0 {
-		s.writeFilePairs("i18n", defaultI18n)
+		s.writeFilePairs("i18n", s.createFilenameContent(defaultI18n))
 	}
 }