test, lib/model: Various integration test updates & improvements (#6956)

This commit is contained in:
Simon Frei
2020-09-07 09:35:37 +02:00
committed by GitHub
parent 52d1681fe6
commit 3dd13c3994
14 changed files with 175 additions and 58 deletions
+3 -1
View File
@@ -1031,11 +1031,13 @@ func (f *folder) updateLocals(fs []protocol.FileInfo) {
}
f.forcedRescanPathsMut.Unlock()
seq := f.fset.Sequence(protocol.LocalDeviceID)
f.evLogger.Log(events.LocalIndexUpdated, map[string]interface{}{
"folder": f.ID,
"items": len(fs),
"filenames": filenames,
"version": f.fset.Sequence(protocol.LocalDeviceID),
"sequence": seq,
"version": seq, // legacy for sequence
})
}
+11 -6
View File
@@ -715,15 +715,17 @@ type FolderCompletion struct {
GlobalItems int32
NeedItems int32
NeedDeletes int32
Sequence int64
}
func newFolderCompletion(global, need db.Counts) FolderCompletion {
func newFolderCompletion(global, need db.Counts, sequence int64) FolderCompletion {
comp := FolderCompletion{
GlobalBytes: global.Bytes,
NeedBytes: need.Bytes,
GlobalItems: global.Files + global.Directories + global.Symlinks,
NeedItems: need.Files + need.Directories + need.Symlinks,
NeedDeletes: need.Deleted,
Sequence: sequence,
}
comp.setComplectionPct()
return comp
@@ -764,6 +766,7 @@ func (comp FolderCompletion) Map() map[string]interface{} {
"globalItems": comp.GlobalItems,
"needItems": comp.NeedItems,
"needDeletes": comp.NeedDeletes,
"sequence": comp.Sequence,
}
}
@@ -824,7 +827,7 @@ func (m *model) folderCompletion(device protocol.DeviceID, folder string) Folder
need.Bytes = 0
}
comp := newFolderCompletion(global, need)
comp := newFolderCompletion(global, need, snap.Sequence(device))
l.Debugf("%v Completion(%s, %q): %v", m, device, folder, comp.Map())
return comp
@@ -974,11 +977,13 @@ func (m *model) handleIndex(deviceID protocol.DeviceID, folder string, fs []prot
}
files.Update(deviceID, fs)
seq := files.Sequence(deviceID)
m.evLogger.Log(events.RemoteIndexUpdated, map[string]interface{}{
"device": deviceID.String(),
"folder": folder,
"items": len(fs),
"version": files.Sequence(deviceID),
"device": deviceID.String(),
"folder": folder,
"items": len(fs),
"sequence": seq,
"version": seq, // legacy for sequence
})
return nil
+5 -5
View File
@@ -3929,16 +3929,16 @@ func TestConnectionTerminationOnFolderUnpause(t *testing.T) {
func TestAddFolderCompletion(t *testing.T) {
// Empty folders are always 100% complete.
comp := newFolderCompletion(db.Counts{}, db.Counts{})
comp.add(newFolderCompletion(db.Counts{}, db.Counts{}))
comp := newFolderCompletion(db.Counts{}, db.Counts{}, 0)
comp.add(newFolderCompletion(db.Counts{}, db.Counts{}, 0))
if comp.CompletionPct != 100 {
t.Error(comp.CompletionPct)
}
// Completion is of the whole
comp = newFolderCompletion(db.Counts{Bytes: 100}, db.Counts{}) // 100% complete
comp.add(newFolderCompletion(db.Counts{Bytes: 400}, db.Counts{Bytes: 50})) // 82.5% complete
if comp.CompletionPct != 90 { // 100 * (1 - 50/500)
comp = newFolderCompletion(db.Counts{Bytes: 100}, db.Counts{}, 0) // 100% complete
comp.add(newFolderCompletion(db.Counts{Bytes: 400}, db.Counts{Bytes: 50}, 0)) // 82.5% complete
if comp.CompletionPct != 90 { // 100 * (1 - 50/500)
t.Error(comp.CompletionPct)
}
}
+40 -21
View File
@@ -27,6 +27,7 @@ import (
"github.com/syncthing/syncthing/lib/config"
"github.com/syncthing/syncthing/lib/dialer"
"github.com/syncthing/syncthing/lib/events"
"github.com/syncthing/syncthing/lib/model"
"github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/sync"
)
@@ -539,19 +540,8 @@ func (p *Process) eventLoop() {
case "LocalIndexUpdated":
data := ev.Data.(map[string]interface{})
folder := data["folder"].(string)
version, _ := data["version"].(json.Number).Int64()
p.eventMut.Lock()
m := p.sequence[folder]
if m == nil {
m = make(map[string]int64)
}
device := p.id.String()
if device == "" {
p.eventMut.Unlock()
panic("race, or startup not complete")
}
m[device] = version
p.sequence[folder] = m
m := p.updateSequenceLocked(folder, p.id.String(), data["sequence"])
p.done[folder] = false
l.Debugf("LocalIndexUpdated %v %v done=false\n\t%+v", p.id, folder, m)
p.eventMut.Unlock()
@@ -560,14 +550,8 @@ func (p *Process) eventLoop() {
data := ev.Data.(map[string]interface{})
device := data["device"].(string)
folder := data["folder"].(string)
version, _ := data["version"].(json.Number).Int64()
p.eventMut.Lock()
m := p.sequence[folder]
if m == nil {
m = make(map[string]int64)
}
m[device] = version
p.sequence[folder] = m
m := p.updateSequenceLocked(folder, device, data["sequence"])
p.done[folder] = false
l.Debugf("RemoteIndexUpdated %v %v done=false\n\t%+v", p.id, folder, m)
p.eventMut.Unlock()
@@ -576,17 +560,38 @@ func (p *Process) eventLoop() {
data := ev.Data.(map[string]interface{})
folder := data["folder"].(string)
summary := data["summary"].(map[string]interface{})
need, _ := summary["needBytes"].(json.Number).Int64()
need, _ := summary["needTotalItems"].(json.Number).Int64()
done := need == 0
p.eventMut.Lock()
m := p.updateSequenceLocked(folder, p.id.String(), summary["sequence"])
p.done[folder] = done
l.Debugf("Foldersummary %v %v\n\t%+v", p.id, folder, p.done)
l.Debugf("FolderSummary %v %v\n\t%+v\n\t%+v", p.id, folder, p.done, m)
p.eventMut.Unlock()
case "FolderCompletion":
data := ev.Data.(map[string]interface{})
device := data["device"].(string)
folder := data["folder"].(string)
p.eventMut.Lock()
m := p.updateSequenceLocked(folder, device, data["sequence"])
l.Debugf("FolderCompletion %v\n\t%+v", p.id, folder, m)
p.eventMut.Unlock()
}
}
}
}
func (p *Process) updateSequenceLocked(folder, device string, sequenceIntf interface{}) map[string]int64 {
sequence, _ := sequenceIntf.(json.Number).Int64()
m := p.sequence[folder]
if m == nil {
m = make(map[string]int64)
}
m[device] = sequence
p.sequence[folder] = m
return m
}
type ConnectionStats struct {
Address string
Type string
@@ -658,3 +663,17 @@ func (p *Process) SystemVersion() (SystemVersion, error) {
return res, nil
}
func (p *Process) RemoteInSync(folder string, dev protocol.DeviceID) (bool, error) {
bs, err := p.Get(fmt.Sprintf("/rest/db/completion?folder=%v&device=%v", url.QueryEscape(folder), dev))
if err != nil {
return false, err
}
var comp model.FolderCompletion
if err := json.Unmarshal(bs, &comp); err != nil {
return false, err
}
return comp.NeedItems+comp.NeedDeletes == 0, nil
}