+++ /dev/null
-// 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.Unlock()
- _, 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()
-}