Skip to content

Commit

Permalink
commands: Fix server panic regression
Browse files Browse the repository at this point in the history
And now with a proper server test.

Fixes gohugoio#9518
Fixes gohugoio#9530
Fixes gohugoio#9539
  • Loading branch information
bep committed Feb 21, 2022
1 parent bddcfd9 commit dae1849
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 15 deletions.
2 changes: 1 addition & 1 deletion commands/commandeer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 3 additions & 3 deletions commands/commands_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
}
Expand Down
49 changes: 38 additions & 11 deletions commands/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -45,6 +66,7 @@ func TestServer(t *testing.T) {
os.RemoveAll(dir)
}()

errors := make(chan error)
stop := make(chan bool)

b := newCommandsBuilder()
Expand All @@ -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) {
Expand Down
3 changes: 3 additions & 0 deletions hugolib/hugo_sites.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit dae1849

Please sign in to comment.