github.com/cockroachdb/pebble@v1.1.1-0.20240513155919-3622ade60459/internal/base/filenames_test.go (about) 1 // Copyright 2012 The LevelDB-Go and Pebble Authors. All rights reserved. Use 2 // of this source code is governed by a BSD-style license that can be found in 3 // the LICENSE file. 4 5 package base 6 7 import ( 8 "bytes" 9 "fmt" 10 "os" 11 "testing" 12 13 "github.com/cockroachdb/pebble/vfs" 14 "github.com/cockroachdb/redact" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func TestParseFilename(t *testing.T) { 19 testCases := map[string]bool{ 20 "000000.log": true, 21 "000000.log.zip": false, 22 "000000..log": false, 23 "a000000.log": false, 24 "abcdef.log": false, 25 "000001ldb": false, 26 "000001.sst": true, 27 "CURRENT": true, 28 "CURRaNT": false, 29 "LOCK": true, 30 "xLOCK": false, 31 "x.LOCK": false, 32 "MANIFEST": false, 33 "MANIFEST123456": false, 34 "MANIFEST-": false, 35 "MANIFEST-123456": true, 36 "MANIFEST-123456.doc": false, 37 "OPTIONS": false, 38 "OPTIONS123456": false, 39 "OPTIONS-": false, 40 "OPTIONS-123456": true, 41 "OPTIONS-123456.doc": false, 42 "CURRENT.123456": false, 43 "CURRENT.dbtmp": false, 44 "CURRENT.123456.dbtmp": true, 45 "temporary.123456.dbtmp": true, 46 } 47 fs := vfs.NewMem() 48 for tc, want := range testCases { 49 _, _, got := ParseFilename(fs, fs.PathJoin("foo", tc)) 50 if got != want { 51 t.Errorf("%q: got %v, want %v", tc, got, want) 52 } 53 } 54 } 55 56 func TestFilenameRoundTrip(t *testing.T) { 57 testCases := map[FileType]bool{ 58 // CURRENT and LOCK files aren't numbered. 59 FileTypeCurrent: false, 60 FileTypeLock: false, 61 // The remaining file types are numbered. 62 FileTypeLog: true, 63 FileTypeManifest: true, 64 FileTypeTable: true, 65 FileTypeOptions: true, 66 FileTypeOldTemp: true, 67 FileTypeTemp: true, 68 } 69 fs := vfs.NewMem() 70 for fileType, numbered := range testCases { 71 fileNums := []FileNum{0} 72 if numbered { 73 fileNums = []FileNum{0, 1, 2, 3, 10, 42, 99, 1001} 74 } 75 for _, fileNum := range fileNums { 76 filename := MakeFilepath(fs, "foo", fileType, fileNum.DiskFileNum()) 77 gotFT, gotFN, gotOK := ParseFilename(fs, filename) 78 if !gotOK { 79 t.Errorf("could not parse %q", filename) 80 continue 81 } 82 if gotFT != fileType || gotFN.FileNum() != fileNum { 83 t.Errorf("filename=%q: got %v, %v, want %v, %v", filename, gotFT, gotFN, fileType, fileNum) 84 continue 85 } 86 } 87 } 88 } 89 90 type bufferFataler struct { 91 buf bytes.Buffer 92 } 93 94 func (b *bufferFataler) Fatalf(msg string, args ...interface{}) { 95 fmt.Fprintf(&b.buf, msg, args...) 96 } 97 98 func TestMustExist(t *testing.T) { 99 err := os.ErrNotExist 100 fs := vfs.Default 101 var buf bufferFataler 102 filename := fs.PathJoin("..", "..", "testdata", "db-stage-4", "000000.sst") 103 104 MustExist(fs, filename, &buf, err) 105 require.Equal(t, `000000.sst: 106 file does not exist 107 directory contains 10 files, 3 unknown, 1 tables, 1 logs, 1 manifests`, buf.buf.String()) 108 } 109 110 func TestRedactFileNum(t *testing.T) { 111 // Ensure that redaction never redacts file numbers. 112 require.Equal(t, redact.RedactableString("000005"), redact.Sprint(FileNum(5))) 113 require.Equal(t, redact.RedactableString("000005"), redact.Sprint(DiskFileNum{fn: 5})) 114 }