// 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() }