commands: Fix server panic regression
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 21 Feb 2022 18:12:04 +0000 (19:12 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 21 Feb 2022 20:43:26 +0000 (21:43 +0100)
And now with a proper server test.

Fixes #9518
Fixes #9530
Fixes #9539

commands/commandeer.go
commands/commands_test.go
commands/server_test.go
hugolib/hugo_sites.go

index 304ef7a7c64f030e62c4d2752a41ec29c2220261..bf42501e0ce1016f276e8ec760bd15e12255b8ca 100644 (file)
@@ -422,7 +422,7 @@ func (c *commandeer) loadConfig() error {
                }
                c.hugoSites = h
                // TODO(bep) improve.
-               if c.buildLock == nil {
+               if c.buildLock == nil && h != nil {
                        c.buildLock = h.LockBuild
                }
                close(c.created)
index b4fb8962134c5de88d71ca7c67265407e20ccc4d..b89e317c25d4bccabd4f2adcc7c6dbac6c27e400 100644 (file)
@@ -329,7 +329,7 @@ type testSiteConfig struct {
        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")
        if e != nil {
                return "", nil, e
@@ -392,12 +392,12 @@ Environment: {{ hugo.Environment }}
        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, 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 {
                t.Fatal(err)
        }
index 05d21a5165b37d192279dcb526a7922071ec2e5c..562fd498c70ac2ce22246e6b5e47d03abe36e7b2 100644 (file)
@@ -29,12 +29,33 @@ import (
 )
 
 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)
-       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()
        c.Assert(err, qt.IsNil)
 
@@ -45,6 +66,7 @@ func TestServer(t *testing.T) {
                os.RemoveAll(dir)
        }()
 
+       errors := make(chan error)
        stop := make(chan bool)
 
        b := newCommandsBuilder()
@@ -54,25 +76,30 @@ func TestServer(t *testing.T) {
        cmd.SetArgs([]string{"-s=" + dir, fmt.Sprintf("-p=%d", port)})
 
        go func() {
-               _, err = cmd.ExecuteC()
-               c.Assert(err, qt.IsNil)
+               _, err := cmd.ExecuteC()
+               if err != nil {
+                       errors <- err
+               }
        }()
 
+       select {
        // 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
        // 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/")
        c.Assert(err, qt.IsNil)
        defer resp.Body.Close()
        homeContent := helpers.ReaderToString(resp.Body)
 
-       c.Assert(homeContent, qt.Contains, "List: Hugo Commands")
-       c.Assert(homeContent, qt.Contains, "Environment: development")
-
        // Stop the server.
        stop <- true
+
+       return homeContent, nil
 }
 
 func TestFixURL(t *testing.T) {
index f1930fd7155c1c3abcf7c1c423855f8558e2cb7c..d2f4426d58a5ef1c101b9448c00a925fd8d3782f 100644 (file)
@@ -390,6 +390,9 @@ func newHugoSites(cfg deps.DepsCfg, sites ...*Site) (*HugoSites, error) {
        }
 
        h.Deps = sites[0].Deps
+       if h.Deps == nil {
+               return nil, initErr
+       }
 
        // Only needed in server mode.
        // TODO(bep) clean up the running vs watching terms