commands: Fix server panic regression

And now with a proper server test.

Fixes #9518
Fixes #9530
Fixes #9539
This commit is contained in:
Bjørn Erik Pedersen 2022-02-21 19:12:04 +01:00
parent 4ada09415d
commit aebde49b88
4 changed files with 45 additions and 15 deletions

View file

@ -422,7 +422,7 @@ func (c *commandeer) loadConfig() error {
} }
c.hugoSites = h c.hugoSites = h
// TODO(bep) improve. // TODO(bep) improve.
if c.buildLock == nil { if c.buildLock == nil && h != nil {
c.buildLock = h.LockBuild c.buildLock = h.LockBuild
} }
close(c.created) close(c.created)

View file

@ -329,7 +329,7 @@ type testSiteConfig struct {
contentDir string contentDir string
} }
func createSimpleTestSite(t *testing.T, cfg testSiteConfig) (string, func(), error) { func createSimpleTestSite(t testing.TB, cfg testSiteConfig) (string, func(), error) {
d, clean, e := htesting.CreateTempDir(hugofs.Os, "hugo-cli") d, clean, e := htesting.CreateTempDir(hugofs.Os, "hugo-cli")
if e != nil { if e != nil {
return "", nil, e return "", nil, e
@ -392,12 +392,12 @@ Environment: {{ hugo.Environment }}
return d, clean, nil return d, clean, nil
} }
func writeFile(t *testing.T, filename, content string) { func writeFile(t testing.TB, filename, content string) {
must(t, os.MkdirAll(filepath.Dir(filename), os.FileMode(0755))) must(t, os.MkdirAll(filepath.Dir(filename), os.FileMode(0755)))
must(t, ioutil.WriteFile(filename, []byte(content), os.FileMode(0755))) must(t, ioutil.WriteFile(filename, []byte(content), os.FileMode(0755)))
} }
func must(t *testing.T, err error) { func must(t testing.TB, err error) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View file

@ -29,12 +29,33 @@ import (
) )
func TestServer(t *testing.T) { func TestServer(t *testing.T) {
if isWindowsCI() {
// TODO(bep) not sure why server tests have started to fail on the Windows CI server.
t.Skip("Skip server test on appveyor")
}
c := qt.New(t) c := qt.New(t)
dir, clean, err := createSimpleTestSite(t, testSiteConfig{})
homeContent, err := runServerTestAndGetHome(c, "")
c.Assert(err, qt.IsNil)
c.Assert(homeContent, qt.Contains, "List: Hugo Commands")
c.Assert(homeContent, qt.Contains, "Environment: development")
}
// Issue 9518
func TestServerPanicOnConfigError(t *testing.T) {
c := qt.New(t)
config := `
[markup]
[markup.highlight]
linenos='table'
`
_, err := runServerTestAndGetHome(c, config)
c.Assert(err, qt.IsNotNil)
c.Assert(err.Error(), qt.Contains, "cannot parse 'Highlight.LineNos' as bool:")
}
func runServerTestAndGetHome(c *qt.C, config string) (string, error) {
dir, clean, err := createSimpleTestSite(c, testSiteConfig{configTOML: config})
defer clean() defer clean()
c.Assert(err, qt.IsNil) c.Assert(err, qt.IsNil)
@ -45,6 +66,7 @@ func TestServer(t *testing.T) {
os.RemoveAll(dir) os.RemoveAll(dir)
}() }()
errors := make(chan error)
stop := make(chan bool) stop := make(chan bool)
b := newCommandsBuilder() b := newCommandsBuilder()
@ -54,25 +76,30 @@ func TestServer(t *testing.T) {
cmd.SetArgs([]string{"-s=" + dir, fmt.Sprintf("-p=%d", port)}) cmd.SetArgs([]string{"-s=" + dir, fmt.Sprintf("-p=%d", port)})
go func() { go func() {
_, err = cmd.ExecuteC() _, err := cmd.ExecuteC()
c.Assert(err, qt.IsNil) if err != nil {
errors <- err
}
}() }()
select {
// There is no way to know exactly when the server is ready for connections. // There is no way to know exactly when the server is ready for connections.
// We could improve by something like https://golang.org/pkg/net/http/httptest/#Server // We could improve by something like https://golang.org/pkg/net/http/httptest/#Server
// But for now, let us sleep and pray! // But for now, let us sleep and pray!
time.Sleep(2 * time.Second) case <-time.After(2 * time.Second):
case err := <-errors:
return "", err
}
resp, err := http.Get("http://localhost:1331/") resp, err := http.Get("http://localhost:1331/")
c.Assert(err, qt.IsNil) c.Assert(err, qt.IsNil)
defer resp.Body.Close() defer resp.Body.Close()
homeContent := helpers.ReaderToString(resp.Body) homeContent := helpers.ReaderToString(resp.Body)
c.Assert(homeContent, qt.Contains, "List: Hugo Commands")
c.Assert(homeContent, qt.Contains, "Environment: development")
// Stop the server. // Stop the server.
stop <- true stop <- true
return homeContent, nil
} }
func TestFixURL(t *testing.T) { func TestFixURL(t *testing.T) {

View file

@ -390,6 +390,9 @@ func newHugoSites(cfg deps.DepsCfg, sites ...*Site) (*HugoSites, error) {
} }
h.Deps = sites[0].Deps h.Deps = sites[0].Deps
if h.Deps == nil {
return nil, initErr
}
// Only needed in server mode. // Only needed in server mode.
// TODO(bep) clean up the running vs watching terms // TODO(bep) clean up the running vs watching terms