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  }