github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/syndtr/goleveldb/leveldb/storage/file_storage_test.go (about) 1 // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com> 2 // All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 7 package storage 8 9 import ( 10 "fmt" 11 "os" 12 "path/filepath" 13 "testing" 14 ) 15 16 var cases = []struct { 17 oldName []string 18 name string 19 ftype FileType 20 num int64 21 }{ 22 {nil, "000100.log", TypeJournal, 100}, 23 {nil, "000000.log", TypeJournal, 0}, 24 {[]string{"000000.sst"}, "000000.ldb", TypeTable, 0}, 25 {nil, "MANIFEST-000002", TypeManifest, 2}, 26 {nil, "MANIFEST-000007", TypeManifest, 7}, 27 {nil, "9223372036854775807.log", TypeJournal, 9223372036854775807}, 28 {nil, "000100.tmp", TypeTemp, 100}, 29 } 30 31 var invalidCases = []string{ 32 "", 33 "foo", 34 "foo-dx-100.log", 35 ".log", 36 "", 37 "manifest", 38 "CURREN", 39 "CURRENTX", 40 "MANIFES", 41 "MANIFEST", 42 "MANIFEST-", 43 "XMANIFEST-3", 44 "MANIFEST-3x", 45 "LOC", 46 "LOCKx", 47 "LO", 48 "LOGx", 49 "18446744073709551616.log", 50 "184467440737095516150.log", 51 "100", 52 "100.", 53 "100.lop", 54 } 55 56 func TestFileStorage_CreateFileName(t *testing.T) { 57 for _, c := range cases { 58 if name := fsGenName(FileDesc{c.ftype, c.num}); name != c.name { 59 t.Errorf("invalid filename got '%s', want '%s'", name, c.name) 60 } 61 } 62 } 63 64 func TestFileStorage_ParseFileName(t *testing.T) { 65 for _, c := range cases { 66 for _, name := range append([]string{c.name}, c.oldName...) { 67 fd, ok := fsParseName(name) 68 if !ok { 69 t.Errorf("cannot parse filename '%s'", name) 70 continue 71 } 72 if fd.Type != c.ftype { 73 t.Errorf("filename '%s' invalid type got '%d', want '%d'", name, fd.Type, c.ftype) 74 } 75 if fd.Num != c.num { 76 t.Errorf("filename '%s' invalid number got '%d', want '%d'", name, fd.Num, c.num) 77 } 78 } 79 } 80 } 81 82 func TestFileStorage_InvalidFileName(t *testing.T) { 83 for _, name := range invalidCases { 84 if fsParseNamePtr(name, nil) { 85 t.Errorf("filename '%s' should be invalid", name) 86 } 87 } 88 } 89 90 func TestFileStorage_Locking(t *testing.T) { 91 path := filepath.Join(os.TempDir(), fmt.Sprintf("goleveldb-testrwlock-%d", os.Getuid())) 92 if err := os.RemoveAll(path); err != nil && !os.IsNotExist(err) { 93 t.Fatal("RemoveAll: got error: ", err) 94 } 95 defer os.RemoveAll(path) 96 97 p1, err := OpenFile(path, false) 98 if err != nil { 99 t.Fatal("OpenFile(1): got error: ", err) 100 } 101 102 p2, err := OpenFile(path, false) 103 if err != nil { 104 t.Logf("OpenFile(2): got error: %s (expected)", err) 105 } else { 106 p2.Close() 107 p1.Close() 108 t.Fatal("OpenFile(2): expect error") 109 } 110 111 p1.Close() 112 113 p3, err := OpenFile(path, false) 114 if err != nil { 115 t.Fatal("OpenFile(3): got error: ", err) 116 } 117 defer p3.Close() 118 119 l, err := p3.Lock() 120 if err != nil { 121 t.Fatal("storage lock failed(1): ", err) 122 } 123 _, err = p3.Lock() 124 if err == nil { 125 t.Fatal("expect error for second storage lock attempt") 126 } else { 127 t.Logf("storage lock got error: %s (expected)", err) 128 } 129 l.Release() 130 _, err = p3.Lock() 131 if err != nil { 132 t.Fatal("storage lock failed(2): ", err) 133 } 134 } 135 136 func TestFileStorage_ReadOnlyLocking(t *testing.T) { 137 path := filepath.Join(os.TempDir(), fmt.Sprintf("goleveldb-testrolock-%d", os.Getuid())) 138 if err := os.RemoveAll(path); err != nil && !os.IsNotExist(err) { 139 t.Fatal("RemoveAll: got error: ", err) 140 } 141 defer os.RemoveAll(path) 142 143 p1, err := OpenFile(path, false) 144 if err != nil { 145 t.Fatal("OpenFile(1): got error: ", err) 146 } 147 148 _, err = OpenFile(path, true) 149 if err != nil { 150 t.Logf("OpenFile(2): got error: %s (expected)", err) 151 } else { 152 t.Fatal("OpenFile(2): expect error") 153 } 154 155 p1.Close() 156 157 p3, err := OpenFile(path, true) 158 if err != nil { 159 t.Fatal("OpenFile(3): got error: ", err) 160 } 161 162 p4, err := OpenFile(path, true) 163 if err != nil { 164 t.Fatal("OpenFile(4): got error: ", err) 165 } 166 167 _, err = OpenFile(path, false) 168 if err != nil { 169 t.Logf("OpenFile(5): got error: %s (expected)", err) 170 } else { 171 t.Fatal("OpenFile(2): expect error") 172 } 173 174 p3.Close() 175 p4.Close() 176 }