177 lines
3.8 KiB
Go
177 lines
3.8 KiB
Go
|
// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
|
||
|
// All rights reserved.
|
||
|
//
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
package storage
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
var cases = []struct {
|
||
|
oldName []string
|
||
|
name string
|
||
|
ftype FileType
|
||
|
num int64
|
||
|
}{
|
||
|
{nil, "000100.log", TypeJournal, 100},
|
||
|
{nil, "000000.log", TypeJournal, 0},
|
||
|
{[]string{"000000.sst"}, "000000.ldb", TypeTable, 0},
|
||
|
{nil, "MANIFEST-000002", TypeManifest, 2},
|
||
|
{nil, "MANIFEST-000007", TypeManifest, 7},
|
||
|
{nil, "9223372036854775807.log", TypeJournal, 9223372036854775807},
|
||
|
{nil, "000100.tmp", TypeTemp, 100},
|
||
|
}
|
||
|
|
||
|
var invalidCases = []string{
|
||
|
"",
|
||
|
"foo",
|
||
|
"foo-dx-100.log",
|
||
|
".log",
|
||
|
"",
|
||
|
"manifest",
|
||
|
"CURREN",
|
||
|
"CURRENTX",
|
||
|
"MANIFES",
|
||
|
"MANIFEST",
|
||
|
"MANIFEST-",
|
||
|
"XMANIFEST-3",
|
||
|
"MANIFEST-3x",
|
||
|
"LOC",
|
||
|
"LOCKx",
|
||
|
"LO",
|
||
|
"LOGx",
|
||
|
"18446744073709551616.log",
|
||
|
"184467440737095516150.log",
|
||
|
"100",
|
||
|
"100.",
|
||
|
"100.lop",
|
||
|
}
|
||
|
|
||
|
func TestFileStorage_CreateFileName(t *testing.T) {
|
||
|
for _, c := range cases {
|
||
|
if name := fsGenName(FileDesc{c.ftype, c.num}); name != c.name {
|
||
|
t.Errorf("invalid filename got '%s', want '%s'", name, c.name)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestFileStorage_ParseFileName(t *testing.T) {
|
||
|
for _, c := range cases {
|
||
|
for _, name := range append([]string{c.name}, c.oldName...) {
|
||
|
fd, ok := fsParseName(name)
|
||
|
if !ok {
|
||
|
t.Errorf("cannot parse filename '%s'", name)
|
||
|
continue
|
||
|
}
|
||
|
if fd.Type != c.ftype {
|
||
|
t.Errorf("filename '%s' invalid type got '%d', want '%d'", name, fd.Type, c.ftype)
|
||
|
}
|
||
|
if fd.Num != c.num {
|
||
|
t.Errorf("filename '%s' invalid number got '%d', want '%d'", name, fd.Num, c.num)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestFileStorage_InvalidFileName(t *testing.T) {
|
||
|
for _, name := range invalidCases {
|
||
|
if fsParseNamePtr(name, nil) {
|
||
|
t.Errorf("filename '%s' should be invalid", name)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestFileStorage_Locking(t *testing.T) {
|
||
|
path := filepath.Join(os.TempDir(), fmt.Sprintf("goleveldb-testrwlock-%d", os.Getuid()))
|
||
|
if err := os.RemoveAll(path); err != nil && !os.IsNotExist(err) {
|
||
|
t.Fatal("RemoveAll: got error: ", err)
|
||
|
}
|
||
|
defer os.RemoveAll(path)
|
||
|
|
||
|
p1, err := OpenFile(path, false)
|
||
|
if err != nil {
|
||
|
t.Fatal("OpenFile(1): got error: ", err)
|
||
|
}
|
||
|
|
||
|
p2, err := OpenFile(path, false)
|
||
|
if err != nil {
|
||
|
t.Logf("OpenFile(2): got error: %s (expected)", err)
|
||
|
} else {
|
||
|
p2.Close()
|
||
|
p1.Close()
|
||
|
t.Fatal("OpenFile(2): expect error")
|
||
|
}
|
||
|
|
||
|
p1.Close()
|
||
|
|
||
|
p3, err := OpenFile(path, false)
|
||
|
if err != nil {
|
||
|
t.Fatal("OpenFile(3): got error: ", err)
|
||
|
}
|
||
|
defer p3.Close()
|
||
|
|
||
|
l, err := p3.Lock()
|
||
|
if err != nil {
|
||
|
t.Fatal("storage lock failed(1): ", err)
|
||
|
}
|
||
|
_, err = p3.Lock()
|
||
|
if err == nil {
|
||
|
t.Fatal("expect error for second storage lock attempt")
|
||
|
} else {
|
||
|
t.Logf("storage lock got error: %s (expected)", err)
|
||
|
}
|
||
|
l.Release()
|
||
|
_, err = p3.Lock()
|
||
|
if err != nil {
|
||
|
t.Fatal("storage lock failed(2): ", err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestFileStorage_ReadOnlyLocking(t *testing.T) {
|
||
|
path := filepath.Join(os.TempDir(), fmt.Sprintf("goleveldb-testrolock-%d", os.Getuid()))
|
||
|
if err := os.RemoveAll(path); err != nil && !os.IsNotExist(err) {
|
||
|
t.Fatal("RemoveAll: got error: ", err)
|
||
|
}
|
||
|
defer os.RemoveAll(path)
|
||
|
|
||
|
p1, err := OpenFile(path, false)
|
||
|
if err != nil {
|
||
|
t.Fatal("OpenFile(1): got error: ", err)
|
||
|
}
|
||
|
|
||
|
_, err = OpenFile(path, true)
|
||
|
if err != nil {
|
||
|
t.Logf("OpenFile(2): got error: %s (expected)", err)
|
||
|
} else {
|
||
|
t.Fatal("OpenFile(2): expect error")
|
||
|
}
|
||
|
|
||
|
p1.Close()
|
||
|
|
||
|
p3, err := OpenFile(path, true)
|
||
|
if err != nil {
|
||
|
t.Fatal("OpenFile(3): got error: ", err)
|
||
|
}
|
||
|
|
||
|
p4, err := OpenFile(path, true)
|
||
|
if err != nil {
|
||
|
t.Fatal("OpenFile(4): got error: ", err)
|
||
|
}
|
||
|
|
||
|
_, err = OpenFile(path, false)
|
||
|
if err != nil {
|
||
|
t.Logf("OpenFile(5): got error: %s (expected)", err)
|
||
|
} else {
|
||
|
t.Fatal("OpenFile(2): expect error")
|
||
|
}
|
||
|
|
||
|
p3.Close()
|
||
|
p4.Close()
|
||
|
}
|