leveldb_convert_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // Copyright (C) 2015 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at http://mozilla.org/MPL/2.0/.
  6. package db
  7. import (
  8. "archive/zip"
  9. "io"
  10. "os"
  11. "path/filepath"
  12. "testing"
  13. "github.com/syndtr/goleveldb/leveldb"
  14. )
  15. func TestLabelConversion(t *testing.T) {
  16. os.RemoveAll("testdata/oldformat.db")
  17. defer os.RemoveAll("testdata/oldformat.db")
  18. os.RemoveAll("testdata/newformat.db")
  19. defer os.RemoveAll("testdata/newformat.db")
  20. if err := unzip("testdata/oldformat.db.zip", "testdata"); err != nil {
  21. t.Fatal(err)
  22. }
  23. odb, err := leveldb.OpenFile("testdata/oldformat.db", nil)
  24. if err != nil {
  25. t.Fatal(err)
  26. }
  27. ldb, err := leveldb.OpenFile("testdata/newformat.db", nil)
  28. if err != nil {
  29. t.Fatal(err)
  30. }
  31. if err = convertKeyFormat(odb, ldb); err != nil {
  32. t.Fatal(err)
  33. }
  34. ldb.Close()
  35. odb.Close()
  36. inst, err := Open("testdata/newformat.db")
  37. if err != nil {
  38. t.Fatal(err)
  39. }
  40. fs := NewFileSet("default", inst)
  41. files, deleted, _ := fs.GlobalSize()
  42. if files+deleted != 953 {
  43. // Expected number of global entries determined by
  44. // ../../bin/stindex testdata/oldformat.db/ | grep global | grep -c default
  45. t.Errorf("Conversion error, global list differs (%d != 953)", files+deleted)
  46. }
  47. files, deleted, _ = fs.LocalSize()
  48. if files+deleted != 953 {
  49. t.Errorf("Conversion error, device list differs (%d != 953)", files+deleted)
  50. }
  51. f := NewBlockFinder(inst)
  52. // [block] F:"default" H:1c25dea9003cc16216e2a22900be1ec1cc5aaf270442904e2f9812c314e929d8 N:"f/f2/f25f1b3e6e029231b933531b2138796d" I:3
  53. 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}
  54. found := 0
  55. f.Iterate([]string{"default"}, h, func(folder, file string, idx int32) bool {
  56. if folder == "default" && file == filepath.FromSlash("f/f2/f25f1b3e6e029231b933531b2138796d") && idx == 3 {
  57. found++
  58. }
  59. return true
  60. })
  61. if found != 1 {
  62. t.Errorf("Found %d blocks instead of expected 1", found)
  63. }
  64. inst.Close()
  65. }
  66. func unzip(src, dest string) error {
  67. r, err := zip.OpenReader(src)
  68. if err != nil {
  69. return err
  70. }
  71. defer func() {
  72. if err := r.Close(); err != nil {
  73. panic(err)
  74. }
  75. }()
  76. os.MkdirAll(dest, 0755)
  77. // Closure to address file descriptors issue with all the deferred .Close() methods
  78. extractAndWriteFile := func(f *zip.File) error {
  79. rc, err := f.Open()
  80. if err != nil {
  81. return err
  82. }
  83. defer func() {
  84. if err := rc.Close(); err != nil {
  85. panic(err)
  86. }
  87. }()
  88. path := filepath.Join(dest, f.Name)
  89. if f.FileInfo().IsDir() {
  90. os.MkdirAll(path, f.Mode())
  91. } else {
  92. f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
  93. if err != nil {
  94. return err
  95. }
  96. defer func() {
  97. if err := f.Close(); err != nil {
  98. panic(err)
  99. }
  100. }()
  101. _, err = io.Copy(f, rc)
  102. if err != nil {
  103. return err
  104. }
  105. }
  106. return nil
  107. }
  108. for _, f := range r.File {
  109. err := extractAndWriteFile(f)
  110. if err != nil {
  111. return err
  112. }
  113. }
  114. return nil
  115. }