github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/mmap_test.go (about)

     1  package util
     2  
     3  import (
     4  	"os"
     5  	"testing"
     6  
     7  	"syscall"
     8  
     9  	"gotest.tools/assert"
    10  )
    11  
    12  func TestMmap(t *testing.T) {
    13  	fileName := "/tmp/test_util.txt"
    14  	os.Remove(fileName)
    15  	f, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
    16  	assert.Assert(t, err == nil)
    17  	defer func() {
    18  		f.Close()
    19  		os.Remove(fileName)
    20  	}()
    21  
    22  	size := 64000
    23  	n, err := f.Write(make([]byte, size))
    24  	assert.Assert(t, n == size && err == nil)
    25  	bytes, err := Mmap(f, true, int64(size))
    26  	assert.Assert(t, err == nil && len(bytes) == size)
    27  	bytes[0] = 1
    28  	assert.Assert(t, MSync(bytes, 1, syscall.MS_SYNC) == nil)
    29  	assert.Assert(t, MSync(bytes, 1, syscall.MS_SYNC) == nil) // call twice is ok
    30  	assert.Assert(t, MLock(bytes, 1) == nil)
    31  	assert.Assert(t, MUnlock(bytes, 1) == nil)
    32  	err = Madvise(bytes, true)
    33  	assert.Assert(t, err == nil)
    34  	err = Madvise(bytes, false)
    35  	assert.Assert(t, err == nil)
    36  	err = Munmap(bytes)
    37  	assert.Assert(t, err == nil)
    38  	err = Madvise(bytes, false)
    39  	assert.Assert(t, err != nil)
    40  	err = Munmap(bytes)
    41  	assert.Assert(t, err != nil)
    42  
    43  	bytes = make([]byte, 10)
    44  	err = Munmap(bytes)
    45  	assert.Assert(t, err != nil)
    46  
    47  }