mirror of
https://github.com/octoleo/syncthing.git
synced 2024-12-23 11:28:59 +00:00
137 lines
3.1 KiB
Go
137 lines
3.1 KiB
Go
|
// Copyright (C) 2015 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 http://mozilla.org/MPL/2.0/.
|
||
|
|
||
|
package db
|
||
|
|
||
|
import (
|
||
|
"archive/zip"
|
||
|
"io"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/syndtr/goleveldb/leveldb"
|
||
|
)
|
||
|
|
||
|
func TestLabelConversion(t *testing.T) {
|
||
|
os.RemoveAll("testdata/oldformat.db")
|
||
|
defer os.RemoveAll("testdata/oldformat.db")
|
||
|
os.RemoveAll("testdata/newformat.db")
|
||
|
defer os.RemoveAll("testdata/newformat.db")
|
||
|
|
||
|
if err := unzip("testdata/oldformat.db.zip", "testdata"); err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
odb, err := leveldb.OpenFile("testdata/oldformat.db", nil)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
ldb, err := leveldb.OpenFile("testdata/newformat.db", nil)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
if err = convertKeyFormat(odb, ldb); err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
ldb.Close()
|
||
|
odb.Close()
|
||
|
|
||
|
inst, err := Open("testdata/newformat.db")
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
fs := NewFileSet("default", inst)
|
||
|
files, deleted, _ := fs.GlobalSize()
|
||
|
if files+deleted != 953 {
|
||
|
// Expected number of global entries determined by
|
||
|
// ../../bin/stindex testdata/oldformat.db/ | grep global | grep -c default
|
||
|
t.Errorf("Conversion error, global list differs (%d != 953)", files+deleted)
|
||
|
}
|
||
|
|
||
|
files, deleted, _ = fs.LocalSize()
|
||
|
if files+deleted != 953 {
|
||
|
t.Errorf("Conversion error, device list differs (%d != 953)", files+deleted)
|
||
|
}
|
||
|
|
||
|
f := NewBlockFinder(inst)
|
||
|
// [block] F:"default" H:1c25dea9003cc16216e2a22900be1ec1cc5aaf270442904e2f9812c314e929d8 N:"f/f2/f25f1b3e6e029231b933531b2138796d" I:3
|
||
|
h := []byte{0x1c, 0x25, 0xde, 0xa9, 0x00, 0x3c, 0xc1, 0x62, 0x16, 0xe2, 0xa2, 0x29, 0x00, 0xbe, 0x1e, 0xc1, 0xcc, 0x5a, 0xaf, 0x27, 0x04, 0x42, 0x90, 0x4e, 0x2f, 0x98, 0x12, 0xc3, 0x14, 0xe9, 0x29, 0xd8}
|
||
|
found := 0
|
||
|
f.Iterate([]string{"default"}, h, func(folder, file string, idx int32) bool {
|
||
|
if folder == "default" && file == filepath.FromSlash("f/f2/f25f1b3e6e029231b933531b2138796d") && idx == 3 {
|
||
|
found++
|
||
|
}
|
||
|
return true
|
||
|
})
|
||
|
if found != 1 {
|
||
|
t.Errorf("Found %d blocks instead of expected 1", found)
|
||
|
}
|
||
|
|
||
|
inst.Close()
|
||
|
}
|
||
|
|
||
|
func unzip(src, dest string) error {
|
||
|
r, err := zip.OpenReader(src)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer func() {
|
||
|
if err := r.Close(); err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
os.MkdirAll(dest, 0755)
|
||
|
|
||
|
// Closure to address file descriptors issue with all the deferred .Close() methods
|
||
|
extractAndWriteFile := func(f *zip.File) error {
|
||
|
rc, err := f.Open()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer func() {
|
||
|
if err := rc.Close(); err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
path := filepath.Join(dest, f.Name)
|
||
|
|
||
|
if f.FileInfo().IsDir() {
|
||
|
os.MkdirAll(path, f.Mode())
|
||
|
} else {
|
||
|
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer func() {
|
||
|
if err := f.Close(); err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
_, err = io.Copy(f, rc)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
for _, f := range r.File {
|
||
|
err := extractAndWriteFile(f)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|