func TestManyPeers(t *testing.T) { log.Println("Cleaning...") err := removeAll("s1", "s2", "h1/index*", "h2/index*") if err != nil { t.Fatal(err) } log.Println("Generating files...") err = generateFiles("s1", 200, 20, "../LICENSE") if err != nil { t.Fatal(err) } receiver := startInstance(t, 2) defer checkedStop(t, receiver) bs, err := receiver.Get("/rest/system/config") if err != nil { t.Fatal(err) } var cfg config.Configuration if err := json.Unmarshal(bs, &cfg); err != nil { t.Fatal(err) } for len(cfg.Devices) < 100 { bs := make([]byte, 16) ReadRand(bs) id := protocol.NewDeviceID(bs) cfg.Devices = append(cfg.Devices, config.DeviceConfiguration{DeviceID: id}) cfg.Folders[0].Devices = append(cfg.Folders[0].Devices, config.FolderDeviceConfiguration{DeviceID: id}) } osutil.Rename("h2/config.xml", "h2/config.xml.orig") defer osutil.Rename("h2/config.xml.orig", "h2/config.xml") var buf bytes.Buffer json.NewEncoder(&buf).Encode(cfg) _, err = receiver.Post("/rest/system/config", &buf) if err != nil { t.Fatal(err) } sender := startInstance(t, 1) defer checkedStop(t, sender) rc.AwaitSync("default", sender, receiver) log.Println("Comparing directories...") err = compareDirectories("s1", "s2") if err != nil { t.Fatal(err) } }
func TestSharedWithClearedOnDisconnect(t *testing.T) { dbi := db.OpenMemory() fcfg := config.NewFolderConfiguration("default", "testdata") fcfg.Devices = []config.FolderDeviceConfiguration{ {DeviceID: device1}, {DeviceID: device2}, } cfg := config.Configuration{ Folders: []config.FolderConfiguration{fcfg}, Devices: []config.DeviceConfiguration{ config.NewDeviceConfiguration(device1, "device1"), config.NewDeviceConfiguration(device2, "device2"), }, Options: config.OptionsConfiguration{ // Don't remove temporaries directly on startup KeepTemporariesH: 1, }, } wcfg := config.Wrap("/tmp/test", cfg) d2c := &fakeConn{} m := NewModel(wcfg, protocol.LocalDeviceID, "device", "syncthing", "dev", dbi, nil) m.AddFolder(fcfg) m.StartFolder(fcfg.ID) m.ServeBackground() conn1 := connections.Connection{ IntermediateConnection: connections.IntermediateConnection{ Conn: tls.Client(&fakeConn{}, nil), Type: "foo", Priority: 10, }, Connection: &FakeConnection{ id: device1, }, } m.AddConnection(conn1, protocol.HelloResult{}) conn2 := connections.Connection{ IntermediateConnection: connections.IntermediateConnection{ Conn: tls.Client(d2c, nil), Type: "foo", Priority: 10, }, Connection: &FakeConnection{ id: device2, }, } m.AddConnection(conn2, protocol.HelloResult{}) m.ClusterConfig(device1, protocol.ClusterConfig{ Folders: []protocol.Folder{ { ID: "default", Devices: []protocol.Device{ {ID: device1}, {ID: device2}, }, }, }, }) m.ClusterConfig(device2, protocol.ClusterConfig{ Folders: []protocol.Folder{ { ID: "default", Devices: []protocol.Device{ {ID: device1}, {ID: device2}, }, }, }, }) if !m.folderSharedWith("default", device1) { t.Error("not shared with device1") } if !m.folderSharedWith("default", device2) { t.Error("not shared with device2") } if d2c.closed { t.Error("conn already closed") } cfg = cfg.Copy() cfg.Devices = cfg.Devices[:1] if err := wcfg.Replace(cfg); err != nil { t.Error(err) } time.Sleep(100 * time.Millisecond) // Committer notification happens in a separate routine if !m.folderSharedWith("default", device1) { t.Error("not shared with device1") } if m.folderSharedWith("default", device2) { // checks m.deviceFolders t.Error("shared with device2") } if !d2c.closed { t.Error("connection not closed") } if _, ok := wcfg.Devices()[device2]; ok { t.Error("device still in config") } fdevs, ok := m.folderDevices["default"] if !ok { t.Error("folder missing?") } for _, id := range fdevs { if id == device2 { t.Error("still there") } } if _, ok := m.conn[device2]; !ok { t.Error("conn missing early") } if _, ok := m.helloMessages[device2]; !ok { t.Error("hello missing early") } if _, ok := m.deviceDownloads[device2]; !ok { t.Error("downloads missing early") } m.Closed(conn2, fmt.Errorf("foo")) if _, ok := m.conn[device2]; ok { t.Error("conn not missing") } if _, ok := m.helloMessages[device2]; ok { t.Error("hello not missing") } if _, ok := m.deviceDownloads[device2]; ok { t.Error("downloads not missing") } }