github.com/nutsdb/nutsdb@v1.0.4/datafile_test.go (about) 1 // Copyright 2019 The nutsdb Author. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package nutsdb 16 17 import ( 18 "os" 19 "testing" 20 21 "github.com/stretchr/testify/assert" 22 ) 23 24 var ( 25 filePath string 26 entry Entry 27 ) 28 29 func init() { 30 filePath = "/tmp/foo" 31 entry = Entry{ 32 Key: []byte("key_0001"), 33 Value: []byte("val_0001"), 34 Meta: NewMetaData().WithKeySize(uint32(len("key_0001"))). 35 WithValueSize(uint32(len("val_0001"))).WithTimeStamp(1547707905). 36 WithTTL(Persistent).WithFlag(DataSetFlag).WithBucketId(1), 37 } 38 } 39 40 func TestDataFile_Err(t *testing.T) { 41 fm := newFileManager(MMap, 1024, 0.5, 256*MB) 42 defer fm.close() 43 _, err := fm.getDataFile(filePath, -1) 44 defer func() { 45 os.Remove(filePath) 46 }() 47 48 assert.NotNil(t, err) 49 } 50 51 func TestDataFile1(t *testing.T) { 52 fm := newFileManager(MMap, 1024, 0.5, 256*MB) 53 defer fm.close() 54 df, err := fm.getDataFile(filePath, 1024) 55 defer os.Remove(filePath) 56 if err != nil { 57 t.Fatal(err) 58 } 59 60 n, err := df.WriteAt(entry.Encode(), 0) 61 if err != nil { 62 t.Error("err TestDataFile_All WriteAt") 63 } 64 65 payloadSize := entry.Meta.PayloadSize() 66 e, err := df.ReadEntry(n, payloadSize) 67 assert.Nil(t, e) 68 assert.Error(t, err, ErrEntryZero) 69 70 e, err = df.ReadEntry(0, payloadSize) 71 if err != nil || string(e.Key) != "key_0001" || string(e.Value) != "val_0001" || e.Meta.Timestamp != 1547707905 { 72 t.Error("err TestDataFile_All ReadAt") 73 } 74 75 e, err = df.ReadEntry(1, payloadSize) 76 if err == nil || e != nil { 77 t.Error("err TestDataFile_All ReadAt") 78 } 79 } 80 81 func TestDataFile2(t *testing.T) { 82 fm := newFileManager(FileIO, 1024, 0.5, 256*MB) 83 84 filePath2 := "/tmp/foo2" 85 df, err := fm.getDataFile(filePath2, 64) 86 assert.Nil(t, err) 87 defer os.Remove(filePath2) 88 headerSize := entry.Meta.Size() 89 content := entry.Encode()[0 : headerSize-1] 90 _, err = df.WriteAt(content, 0) 91 if err != nil { 92 t.Error("err TestDataFile_All WriteAt") 93 } 94 95 payloadSize := entry.Meta.PayloadSize() 96 e, err := df.ReadEntry(0, payloadSize) 97 if err == nil || e != nil { 98 t.Error("err TestDataFile_All ReadAt") 99 } 100 101 filePath3 := "/tmp/foo3" 102 103 df2, err := fm.getDataFile(filePath3, 64) 104 defer os.Remove(filePath3) 105 assert.Nil(t, err) 106 107 headerSize = entry.Meta.Size() 108 content = entry.Encode()[0 : headerSize+1] 109 _, err = df2.WriteAt(content, 0) 110 assert.Nil(t, err) 111 112 e, err = df2.ReadEntry(0, payloadSize) 113 if err == nil || e != nil { 114 t.Error("err TestDataFile_All ReadAt") 115 } 116 117 err = df.Release() 118 assert.Nil(t, err) 119 err = df2.Release() 120 assert.Nil(t, err) 121 err = fm.close() 122 assert.Nil(t, err) 123 } 124 125 func TestDataFile_ReadRecord(t *testing.T) { 126 fm := newFileManager(FileIO, 1024, 0.5, 256*MB) 127 filePath4 := "/tmp/foo4" 128 df, err := fm.getDataFile(filePath4, 1024) 129 defer func() { 130 err = df.Release() 131 assert.Nil(t, err) 132 err = fm.close() 133 assert.Nil(t, err) 134 }() 135 assert.Nil(t, err) 136 if err != nil { 137 t.Fatal(err) 138 } 139 140 payloadSize := entry.Meta.PayloadSize() 141 e, err := df.ReadEntry(0, payloadSize) 142 if err != nil && e != nil { 143 t.Error("err ReadAt") 144 } 145 146 e, err = df.ReadEntry(1025, payloadSize) 147 if err == nil && e != nil { 148 t.Error("err ReadAt") 149 } 150 } 151 152 func TestDataFile_Err_Path(t *testing.T) { 153 fm := newFileManager(FileIO, 1024, 0.5, 256*MB) 154 defer fm.close() 155 filePath5 := ":/tmp/foo5" 156 df, err := fm.getDataFile(filePath5, entry.Size()) 157 if err == nil && df != nil { 158 t.Error("err TestDataFile_All open") 159 } 160 } 161 162 func TestDataFile_Crc_Err(t *testing.T) { 163 fm := newFileManager(FileIO, 1024, 0.5, 256*MB) 164 filePath4 := "/tmp/foo6" 165 166 df, err := fm.getDataFile(filePath4, entry.Size()) 167 assert.Nil(t, err) 168 assert.NotNil(t, df) 169 defer func() { 170 err = df.Release() 171 assert.Nil(t, err) 172 err = fm.close() 173 assert.Nil(t, err) 174 err = os.Remove(filePath4) 175 assert.Nil(t, err) 176 }() 177 178 var errContent []byte 179 errContent = append(errContent, entry.Encode()[0:4]...) 180 errContent = append(errContent, entry.Encode()[4:entry.Size()-1]...) 181 errContent = append(errContent, 0) 182 _, err = df.WriteAt(errContent, 0) 183 assert.Nil(t, err) 184 185 payloadSize := entry.Meta.PayloadSize() 186 e, err := df.ReadEntry(0, payloadSize) 187 if err == nil || e != nil { 188 t.Error("err TestDataFile_All ReadAt") 189 } 190 } 191 192 func TestFileManager1(t *testing.T) { 193 fm := newFileManager(FileIO, 1024, 0.5, 256*MB) 194 filePath4 := "/tmp/foo6" 195 df, err := fm.getDataFile(filePath4, entry.Size()) 196 assert.Nil(t, err) 197 defer func() { 198 err = df.Release() 199 assert.Nil(t, err) 200 err = fm.close() 201 assert.Nil(t, err) 202 os.Remove(filePath) 203 }() 204 }