go_study/fabric-main/orderer/common/filerepo/filerepo_test.go

183 lines
4.2 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package filerepo_test
import (
"io/ioutil"
"os"
"path/filepath"
"testing"
"github.com/hyperledger/fabric/orderer/common/filerepo"
"github.com/stretchr/testify/require"
)
func TestNewFileRepo(t *testing.T) {
// Write a temporary file
tempFilePath := filepath.Join("testdata", "join", "mychannel.join~")
tempFile, err := os.Create(tempFilePath)
require.NoError(t, err)
defer func() {
tempFile.Close()
os.Remove(tempFilePath)
}()
// Check tempfile exists prior to creating a new file repo
_, err = os.Stat(tempFilePath)
require.NoError(t, err)
_, err = filerepo.New("testdata", "join")
require.NoError(t, err)
// Check tempfile was cleared out upon creating a new file repo
require.NoFileExists(t, tempFilePath)
}
func TestNewFileRepoFailure(t *testing.T) {
tests := []struct {
testName string
fileSuffix string
expectedErr string
}{
{
testName: "invalid fileSuffix",
fileSuffix: "join/block",
expectedErr: "fileSuffix [join/block] illegal, cannot contain os path separator",
},
{
testName: "empty fileSuffix",
fileSuffix: "",
expectedErr: "fileSuffix illegal, cannot be empty",
},
}
for _, tt := range tests {
t.Run(tt.testName, func(t *testing.T) {
_, err := filerepo.New("testdata", tt.fileSuffix)
require.EqualError(t, err, tt.expectedErr)
})
}
}
func TestFileRepo_Save(t *testing.T) {
tests := []struct {
testName string
content []byte
}{
{
testName: "Non-empty bytes",
content: []byte("block-bytes"),
},
{
testName: "Empty bytes",
content: []byte{},
},
{
testName: "Nil bytes",
content: nil,
},
}
for _, tt := range tests {
t.Run(tt.testName, func(t *testing.T) {
r, err := filerepo.New("testdata", "join")
require.NoError(t, err)
filePath := filepath.Join("testdata", "join", "newchannel.join")
err = r.Save("newchannel", tt.content)
defer os.Remove(filePath)
require.NoError(t, err)
// Check file bytes
bytes, err := ioutil.ReadFile(filePath)
require.NoError(t, err)
if tt.content != nil {
require.Equal(t, tt.content, bytes)
} else {
require.Equal(t, []byte{}, bytes)
}
// Check tempfile doesn't exist
require.NoFileExists(t, filePath+"~")
})
}
}
func TestFileRepo_SaveFailure(t *testing.T) {
r, err := filerepo.New("testdata", "join")
require.NoError(t, err)
err = r.Save("mychannel", []byte{})
require.EqualError(t, err, os.ErrExist.Error())
}
func TestFileRepo_Remove(t *testing.T) {
// Write a temporary file
tempFilePath := filepath.Join("testdata", "join", "channel2.join")
tempFile, err := os.Create(tempFilePath)
require.NoError(t, err)
defer func() {
tempFile.Close()
os.Remove(tempFilePath)
}()
r, err := filerepo.New("testdata", "join")
require.NoError(t, err)
err = r.Remove("channel2")
require.NoError(t, err)
require.NoFileExists(t, tempFilePath)
}
func TestFileRepo_Read(t *testing.T) {
t.Run("Successful read, non-empty bytes", func(t *testing.T) {
r, err := filerepo.New("testdata", "join")
require.NoError(t, err)
bytes, err := r.Read("mychannel")
require.NoError(t, err)
require.Equal(t, "dummy-data", string(bytes))
})
t.Run("Successful read, empty bytes", func(t *testing.T) {
r, err := filerepo.New("testdata", "remove")
require.NoError(t, err)
bytes, err := r.Read("mychannel")
require.NoError(t, err)
require.Equal(t, []byte{}, bytes)
})
t.Run("Failed read, invalid file", func(t *testing.T) {
r, err := filerepo.New("testdata", "join")
require.NoError(t, err)
_, err = r.Read("invalidfile")
require.EqualError(t, err, "open testdata/join/invalidfile.join: no such file or directory")
})
}
func TestFileRepo_List(t *testing.T) {
r, err := filerepo.New("testdata", "join")
require.NoError(t, err)
files, err := r.List()
require.NoError(t, err)
require.Equal(t, []string{"mychannel.join"}, files)
}
func TestFileRepo_FileToBaseName(t *testing.T) {
r, err := filerepo.New("testdata", "join")
require.NoError(t, err)
filePath := filepath.Join("testdata", "join", "mychannel.join")
channelName := r.FileToBaseName(filePath)
require.Equal(t, "mychannel", channelName)
}