mirror of
https://github.com/octoleo/syncthing.git
synced 2025-01-05 16:12:20 +00:00
lib/model: More connection closing (#6778)
* lib/model: More connection closing * Revert "lib/model: More connection closing" This reverts commit 5397c3a55c0de25fab93d4ec622530818f1b2a46. * Add tests, fix one broken-ness * Update lib/model/model.go Co-authored-by: Simon Frei <freisim93@gmail.com> * Update model.go * Update model.go Co-authored-by: Simon Frei <freisim93@gmail.com>
This commit is contained in:
parent
b62b7d269e
commit
5fb3992275
@ -492,7 +492,10 @@ func (m *model) restartFolder(from, to config.FolderConfiguration) {
|
|||||||
fset = db.NewFileSet(to.ID, to.Filesystem(), m.db)
|
fset = db.NewFileSet(to.ID, to.Filesystem(), m.db)
|
||||||
}
|
}
|
||||||
|
|
||||||
m.stopFolder(from, fmt.Errorf("%v folder %v", errMsg, to.Description()))
|
err := fmt.Errorf("%v folder %v", errMsg, to.Description())
|
||||||
|
m.stopFolder(from, err)
|
||||||
|
// Need to send CC change to both from and to devices.
|
||||||
|
m.closeConns(to.DeviceIDs(), err)
|
||||||
|
|
||||||
m.fmut.Lock()
|
m.fmut.Lock()
|
||||||
defer m.fmut.Unlock()
|
defer m.fmut.Unlock()
|
||||||
|
@ -3806,6 +3806,121 @@ func TestBlockListMap(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConnectionTerminationOnFolderAdd(t *testing.T) {
|
||||||
|
testConfigChangeClosesConnections(t, false, true, nil, func(cfg config.Wrapper) {
|
||||||
|
fcfg := testFolderConfigTmp()
|
||||||
|
fcfg.ID = "second"
|
||||||
|
fcfg.Label = "second"
|
||||||
|
fcfg.Devices = []config.FolderDeviceConfiguration{{device2, protocol.EmptyDeviceID}}
|
||||||
|
if w, err := cfg.SetFolder(fcfg); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else {
|
||||||
|
w.Wait()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConnectionTerminationOnFolderShare(t *testing.T) {
|
||||||
|
testConfigChangeClosesConnections(t, true, true, nil, func(cfg config.Wrapper) {
|
||||||
|
fcfg := cfg.FolderList()[0]
|
||||||
|
fcfg.Devices = []config.FolderDeviceConfiguration{{device2, protocol.EmptyDeviceID}}
|
||||||
|
if w, err := cfg.SetFolder(fcfg); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else {
|
||||||
|
w.Wait()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConnectionTerminationOnFolderUnshare(t *testing.T) {
|
||||||
|
testConfigChangeClosesConnections(t, true, false, nil, func(cfg config.Wrapper) {
|
||||||
|
fcfg := cfg.FolderList()[0]
|
||||||
|
fcfg.Devices = nil
|
||||||
|
if w, err := cfg.SetFolder(fcfg); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else {
|
||||||
|
w.Wait()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConnectionTerminationOnFolderRemove(t *testing.T) {
|
||||||
|
testConfigChangeClosesConnections(t, true, false, nil, func(cfg config.Wrapper) {
|
||||||
|
rcfg := cfg.RawCopy()
|
||||||
|
rcfg.Folders = nil
|
||||||
|
if w, err := cfg.Replace(rcfg); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else {
|
||||||
|
w.Wait()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConnectionTerminationOnFolderPause(t *testing.T) {
|
||||||
|
testConfigChangeClosesConnections(t, true, false, nil, func(cfg config.Wrapper) {
|
||||||
|
fcfg := cfg.FolderList()[0]
|
||||||
|
fcfg.Paused = true
|
||||||
|
if w, err := cfg.SetFolder(fcfg); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else {
|
||||||
|
w.Wait()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConnectionTerminationOnFolderUnpause(t *testing.T) {
|
||||||
|
testConfigChangeClosesConnections(t, true, false, func(cfg config.Wrapper) {
|
||||||
|
fcfg := cfg.FolderList()[0]
|
||||||
|
fcfg.Paused = true
|
||||||
|
if w, err := cfg.SetFolder(fcfg); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else {
|
||||||
|
w.Wait()
|
||||||
|
}
|
||||||
|
}, func(cfg config.Wrapper) {
|
||||||
|
fcfg := cfg.FolderList()[0]
|
||||||
|
fcfg.Paused = false
|
||||||
|
if w, err := cfg.SetFolder(fcfg); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else {
|
||||||
|
w.Wait()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func testConfigChangeClosesConnections(t *testing.T, expectFirstClosed, expectSecondClosed bool, pre func(config.Wrapper), fn func(config.Wrapper)) {
|
||||||
|
t.Helper()
|
||||||
|
wcfg, _ := tmpDefaultWrapper()
|
||||||
|
m := setupModel(wcfg)
|
||||||
|
defer cleanupModel(m)
|
||||||
|
|
||||||
|
_, err := wcfg.SetDevice(config.NewDeviceConfiguration(device2, "device2"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if pre != nil {
|
||||||
|
pre(wcfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
fc1 := &fakeConnection{id: device1, model: m}
|
||||||
|
fc2 := &fakeConnection{id: device2, model: m}
|
||||||
|
m.AddConnection(fc1, protocol.HelloResult{})
|
||||||
|
m.AddConnection(fc2, protocol.HelloResult{})
|
||||||
|
|
||||||
|
t.Log("Applying config change")
|
||||||
|
|
||||||
|
fn(wcfg)
|
||||||
|
|
||||||
|
if expectFirstClosed != fc1.closed {
|
||||||
|
t.Errorf("first connection state mismatch: %t (expected) != %t", expectFirstClosed, fc1.closed)
|
||||||
|
}
|
||||||
|
|
||||||
|
if expectSecondClosed != fc2.closed {
|
||||||
|
t.Errorf("second connection state mismatch: %t (expected) != %t", expectSecondClosed, fc2.closed)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func equalStringsInAnyOrder(a, b []string) bool {
|
func equalStringsInAnyOrder(a, b []string) bool {
|
||||||
if len(a) != len(b) {
|
if len(a) != len(b) {
|
||||||
return false
|
return false
|
||||||
|
Loading…
Reference in New Issue
Block a user