This fixes both a race condition where we could assign s.stop from one goroutine and then read it from another without locking, and handles the fact that listener may be nil at shutdown if we've had a bad CommitConfiguration call in the meantime.
92 lines
2.1 KiB
Go
92 lines
2.1 KiB
Go
// Copyright (C) 2016 The Syncthing Authors.
|
|
//
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
// You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
package main
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/syncthing/syncthing/lib/config"
|
|
"github.com/syncthing/syncthing/lib/protocol"
|
|
"github.com/thejerf/suture"
|
|
)
|
|
|
|
func TestCSRFToken(t *testing.T) {
|
|
t1 := newCsrfToken()
|
|
t2 := newCsrfToken()
|
|
|
|
t3 := newCsrfToken()
|
|
if !validCsrfToken(t3) {
|
|
t.Fatal("t3 should be valid")
|
|
}
|
|
|
|
for i := 0; i < 250; i++ {
|
|
if i%5 == 0 {
|
|
// t1 and t2 should remain valid by virtue of us checking them now
|
|
// and then.
|
|
if !validCsrfToken(t1) {
|
|
t.Fatal("t1 should be valid at iteration", i)
|
|
}
|
|
if !validCsrfToken(t2) {
|
|
t.Fatal("t2 should be valid at iteration", i)
|
|
}
|
|
}
|
|
|
|
// The newly generated token is always valid
|
|
t4 := newCsrfToken()
|
|
if !validCsrfToken(t4) {
|
|
t.Fatal("t4 should be valid at iteration", i)
|
|
}
|
|
}
|
|
|
|
if validCsrfToken(t3) {
|
|
t.Fatal("t3 should have expired by now")
|
|
}
|
|
}
|
|
|
|
func TestStopAfterBrokenConfig(t *testing.T) {
|
|
baseDirs["config"] = "../../test/h1" // to load HTTPS keys
|
|
expandLocations()
|
|
|
|
cfg := config.Configuration{
|
|
GUI: config.GUIConfiguration{
|
|
RawAddress: "127.0.0.1:0",
|
|
RawUseTLS: false,
|
|
},
|
|
}
|
|
w := config.Wrap("/dev/null", cfg)
|
|
|
|
srv, err := newAPIService(protocol.LocalDeviceID, w, "", nil, nil, nil, nil, nil, nil)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
srv.started = make(chan struct{})
|
|
|
|
sup := suture.NewSimple("test")
|
|
sup.Add(srv)
|
|
sup.ServeBackground()
|
|
|
|
<-srv.started
|
|
|
|
// Service is now running, listening on a random port on localhost. Now we
|
|
// request a config change to a completely invalid listen address. The
|
|
// commit will fail and the service will be in a broken state.
|
|
|
|
newCfg := config.Configuration{
|
|
GUI: config.GUIConfiguration{
|
|
RawAddress: "totally not a valid address",
|
|
RawUseTLS: false,
|
|
},
|
|
}
|
|
if srv.CommitConfiguration(cfg, newCfg) {
|
|
t.Fatal("Config commit should have failed")
|
|
}
|
|
|
|
// Nonetheless, it should be fine to Stop() it without panic.
|
|
|
|
sup.Stop()
|
|
}
|