| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- // 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 https://mozilla.org/MPL/2.0/.
- package model
- import (
- "testing"
- "github.com/syncthing/syncthing/lib/protocol"
- )
- func TestDeviceDownloadState(t *testing.T) {
- v1 := (protocol.Vector{}).Update(0)
- v2 := (protocol.Vector{}).Update(1)
- // file 1 version 1 part 1
- f1v1p1 := protocol.FileDownloadProgressUpdate{UpdateType: protocol.UpdateTypeAppend, Name: "f1", Version: v1, BlockIndexes: []int32{0, 1, 2}}
- f1v1p2 := protocol.FileDownloadProgressUpdate{UpdateType: protocol.UpdateTypeAppend, Name: "f1", Version: v1, BlockIndexes: []int32{3, 4, 5}}
- f1v1del := protocol.FileDownloadProgressUpdate{UpdateType: protocol.UpdateTypeForget, Name: "f1", Version: v1, BlockIndexes: nil}
- f1v2p1 := protocol.FileDownloadProgressUpdate{UpdateType: protocol.UpdateTypeAppend, Name: "f1", Version: v2, BlockIndexes: []int32{10, 11, 12}}
- f1v2p2 := protocol.FileDownloadProgressUpdate{UpdateType: protocol.UpdateTypeAppend, Name: "f1", Version: v2, BlockIndexes: []int32{13, 14, 15}}
- f1v2del := protocol.FileDownloadProgressUpdate{UpdateType: protocol.UpdateTypeForget, Name: "f1", Version: v2, BlockIndexes: nil}
- f2v1p1 := protocol.FileDownloadProgressUpdate{UpdateType: protocol.UpdateTypeAppend, Name: "f2", Version: v1, BlockIndexes: []int32{20, 21, 22}}
- f2v1p2 := protocol.FileDownloadProgressUpdate{UpdateType: protocol.UpdateTypeAppend, Name: "f2", Version: v1, BlockIndexes: []int32{23, 24, 25}}
- f2v1del := protocol.FileDownloadProgressUpdate{UpdateType: protocol.UpdateTypeForget, Name: "f2", Version: v1, BlockIndexes: nil}
- tests := []struct {
- updates []protocol.FileDownloadProgressUpdate
- shouldHaveIndexesFrom []protocol.FileDownloadProgressUpdate
- shouldNotHaveIndexesFrom []protocol.FileDownloadProgressUpdate
- }{
- { //1
- []protocol.FileDownloadProgressUpdate{f1v1p1},
- []protocol.FileDownloadProgressUpdate{f1v1p1},
- []protocol.FileDownloadProgressUpdate{f1v1p2, f1v2p1, f1v2p2},
- },
- { //2
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2},
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2},
- []protocol.FileDownloadProgressUpdate{f1v2p1, f1v2p2},
- },
- { //3
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2, f1v1del},
- nil,
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2, f1v2p1, f1v2p2}},
- { //4
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2, f1v2del},
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2},
- []protocol.FileDownloadProgressUpdate{f1v2p1, f1v2p2},
- },
- { //5
- // v2 replaces old v1 data
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2, f1v2p1},
- []protocol.FileDownloadProgressUpdate{f1v2p1},
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2, f1v2p2},
- },
- { //6
- // v1 delete on v2 data does nothing
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2, f1v2p1, f1v1del},
- []protocol.FileDownloadProgressUpdate{f1v2p1},
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2, f1v2p2},
- },
- { //7
- // v2 replacees v1, v2 gets deleted, and v2 part 2 gets added.
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2, f1v2p1, f1v2del, f1v2p2},
- []protocol.FileDownloadProgressUpdate{f1v2p2},
- []protocol.FileDownloadProgressUpdate{f1v1p1, f1v1p2, f1v2p1},
- },
- // Multiple files in one go
- { //8
- []protocol.FileDownloadProgressUpdate{f1v1p1, f2v1p1},
- []protocol.FileDownloadProgressUpdate{f1v1p1, f2v1p1},
- []protocol.FileDownloadProgressUpdate{f1v1p2, f2v1p2},
- },
- { //9
- []protocol.FileDownloadProgressUpdate{f1v1p1, f2v1p1, f2v1del},
- []protocol.FileDownloadProgressUpdate{f1v1p1},
- []protocol.FileDownloadProgressUpdate{f2v1p1, f2v1p1},
- },
- { //10
- []protocol.FileDownloadProgressUpdate{f1v1p1, f2v1del, f2v1p1},
- []protocol.FileDownloadProgressUpdate{f1v1p1, f2v1p1},
- []protocol.FileDownloadProgressUpdate{f1v1p2, f2v1p2},
- },
- }
- for i, test := range tests {
- s := newDeviceDownloadState()
- s.Update("folder", test.updates)
- for _, expected := range test.shouldHaveIndexesFrom {
- for _, n := range expected.BlockIndexes {
- if !s.Has("folder", expected.Name, expected.Version, n) {
- t.Error("Test", i+1, "error:", expected.Name, expected.Version, "missing", n)
- }
- }
- }
- for _, unexpected := range test.shouldNotHaveIndexesFrom {
- for _, n := range unexpected.BlockIndexes {
- if s.Has("folder", unexpected.Name, unexpected.Version, n) {
- t.Error("Test", i+1, "error:", unexpected.Name, unexpected.Version, "has extra", n)
- }
- }
- }
- }
- }
|