mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-09 14:50:56 +00:00
parent
55238e3b5b
commit
680b0b14db
@ -7,6 +7,8 @@
|
|||||||
package connections
|
package connections
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
"net/url"
|
"net/url"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
@ -167,3 +169,39 @@ func TestGetDialer(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConnectionStatus(t *testing.T) {
|
||||||
|
s := newConnectionStatusHandler()
|
||||||
|
|
||||||
|
addr := "testAddr"
|
||||||
|
testErr := errors.New("testErr")
|
||||||
|
|
||||||
|
if stats := s.ConnectionStatus(); len(stats) != 0 {
|
||||||
|
t.Fatal("newly created connectionStatusHandler isn't empty:", len(stats))
|
||||||
|
}
|
||||||
|
|
||||||
|
check := func(in, out error) {
|
||||||
|
t.Helper()
|
||||||
|
s.setConnectionStatus(addr, in)
|
||||||
|
switch stat, ok := s.ConnectionStatus()[addr]; {
|
||||||
|
case !ok:
|
||||||
|
t.Fatal("entry missing")
|
||||||
|
case out == nil:
|
||||||
|
if stat.Error != nil {
|
||||||
|
t.Fatal("expected nil error, got", stat.Error)
|
||||||
|
}
|
||||||
|
case *stat.Error != out.Error():
|
||||||
|
t.Fatalf("expected %v error, got %v", out.Error(), *stat.Error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
check(nil, nil)
|
||||||
|
|
||||||
|
check(context.Canceled, nil)
|
||||||
|
|
||||||
|
check(testErr, testErr)
|
||||||
|
|
||||||
|
check(context.Canceled, testErr)
|
||||||
|
|
||||||
|
check(nil, nil)
|
||||||
|
}
|
||||||
|
@ -110,6 +110,8 @@ type ConnectionStatusEntry struct {
|
|||||||
|
|
||||||
type service struct {
|
type service struct {
|
||||||
*suture.Supervisor
|
*suture.Supervisor
|
||||||
|
connectionStatusHandler
|
||||||
|
|
||||||
cfg config.Wrapper
|
cfg config.Wrapper
|
||||||
myID protocol.DeviceID
|
myID protocol.DeviceID
|
||||||
model Model
|
model Model
|
||||||
@ -127,9 +129,6 @@ type service struct {
|
|||||||
listeners map[string]genericListener
|
listeners map[string]genericListener
|
||||||
listenerTokens map[string]suture.ServiceToken
|
listenerTokens map[string]suture.ServiceToken
|
||||||
listenerSupervisor *suture.Supervisor
|
listenerSupervisor *suture.Supervisor
|
||||||
|
|
||||||
connectionStatusMut sync.RWMutex
|
|
||||||
connectionStatus map[string]ConnectionStatusEntry // address -> latest error/status
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewService(cfg config.Wrapper, myID protocol.DeviceID, mdl Model, tlsCfg *tls.Config, discoverer discover.Finder, bepProtocolName string, tlsDefaultCommonName string, evLogger events.Logger) Service {
|
func NewService(cfg config.Wrapper, myID protocol.DeviceID, mdl Model, tlsCfg *tls.Config, discoverer discover.Finder, bepProtocolName string, tlsDefaultCommonName string, evLogger events.Logger) Service {
|
||||||
@ -140,6 +139,8 @@ func NewService(cfg config.Wrapper, myID protocol.DeviceID, mdl Model, tlsCfg *t
|
|||||||
},
|
},
|
||||||
PassThroughPanics: true,
|
PassThroughPanics: true,
|
||||||
}),
|
}),
|
||||||
|
connectionStatusHandler: newConnectionStatusHandler(),
|
||||||
|
|
||||||
cfg: cfg,
|
cfg: cfg,
|
||||||
myID: myID,
|
myID: myID,
|
||||||
model: mdl,
|
model: mdl,
|
||||||
@ -168,9 +169,6 @@ func NewService(cfg config.Wrapper, myID protocol.DeviceID, mdl Model, tlsCfg *t
|
|||||||
FailureBackoff: 600 * time.Second,
|
FailureBackoff: 600 * time.Second,
|
||||||
PassThroughPanics: true,
|
PassThroughPanics: true,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
connectionStatusMut: sync.NewRWMutex(),
|
|
||||||
connectionStatus: make(map[string]ConnectionStatusEntry),
|
|
||||||
}
|
}
|
||||||
cfg.Subscribe(service)
|
cfg.Subscribe(service)
|
||||||
|
|
||||||
@ -702,7 +700,19 @@ func (s *service) ListenerStatus() map[string]ListenerStatusEntry {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) ConnectionStatus() map[string]ConnectionStatusEntry {
|
type connectionStatusHandler struct {
|
||||||
|
connectionStatusMut sync.RWMutex
|
||||||
|
connectionStatus map[string]ConnectionStatusEntry // address -> latest error/status
|
||||||
|
}
|
||||||
|
|
||||||
|
func newConnectionStatusHandler() connectionStatusHandler {
|
||||||
|
return connectionStatusHandler{
|
||||||
|
connectionStatusMut: sync.NewRWMutex(),
|
||||||
|
connectionStatus: make(map[string]ConnectionStatusEntry),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *connectionStatusHandler) ConnectionStatus() map[string]ConnectionStatusEntry {
|
||||||
result := make(map[string]ConnectionStatusEntry)
|
result := make(map[string]ConnectionStatusEntry)
|
||||||
s.connectionStatusMut.RLock()
|
s.connectionStatusMut.RLock()
|
||||||
for k, v := range s.connectionStatus {
|
for k, v := range s.connectionStatus {
|
||||||
@ -712,7 +722,7 @@ func (s *service) ConnectionStatus() map[string]ConnectionStatusEntry {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) setConnectionStatus(address string, err error) {
|
func (s *connectionStatusHandler) setConnectionStatus(address string, err error) {
|
||||||
if errors.Cause(err) == context.Canceled {
|
if errors.Cause(err) == context.Canceled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user