go_study/fabric-main/internal/ledgerutil/verify/verify_test.go

102 lines
2.9 KiB
Go

/*
Copyright Hitachi, Ltd. 2023 All rights reserved.
SPDX-License-Identifier: Apache-2.0
*/
package verify
import (
"fmt"
"os"
"path/filepath"
"testing"
"github.com/hyperledger/fabric/common/ledger/testutil"
"github.com/hyperledger/fabric/internal/ledgerutil/jsonrw"
"github.com/stretchr/testify/require"
)
const (
TestDataDir = "../testdata/"
SampleBadLedgerDir = TestDataDir + "sample_bad_ledger/"
SampleGoodLedgerDir = TestDataDir + "sample_prod/"
SampleResultDir = TestDataDir + "sample_verifications/"
SampleLedgerFromSnapshotDir = TestDataDir + "sample_ledger_from_snapshot/"
VerificationResultFile = "mychannel_verification_result/blocks.json"
)
func TestVerify(t *testing.T) {
testCases := map[string]struct {
sampleFileSystemPath string
expectedResultFile string
expectedReturnValue bool
errorExpected bool
}{
"good-ledger": {
sampleFileSystemPath: SampleGoodLedgerDir,
expectedResultFile: "correct_blocks.json",
expectedReturnValue: true,
errorExpected: false,
},
"hash-error-in-block": {
sampleFileSystemPath: SampleBadLedgerDir,
expectedResultFile: "hash_error_blocks.json",
expectedReturnValue: false,
errorExpected: false,
},
"block-store-does-not-exist": {
sampleFileSystemPath: "",
errorExpected: true,
},
"empty-block-store": {
sampleFileSystemPath: "",
errorExpected: true,
},
"ledger-bootstrapped-from-snapshot": {
sampleFileSystemPath: SampleLedgerFromSnapshotDir,
expectedResultFile: "correct_blocks.json",
expectedReturnValue: true,
errorExpected: false,
},
}
for testName, testCase := range testCases {
t.Run(testName, func(t *testing.T) {
// Create a temporary directory for output
outputDir := t.TempDir()
fsDir := t.TempDir()
if testName == "empty-block-store" {
err := os.MkdirAll(filepath.Join(fsDir, "ledgersData", "chains"), 0o700)
require.NoError(t, err)
} else if testName != "block-store-does-not-exist" {
err := testutil.CopyDir(testCase.sampleFileSystemPath, fsDir, false)
require.NoError(t, err)
}
anyError, err := VerifyLedger(fsDir, outputDir)
if testCase.errorExpected {
require.Error(t, err)
if testName == "empty-block-store" {
require.ErrorContains(t, err, fmt.Sprintf("provided path %s is empty. Aborting verify", fsDir))
} else {
require.ErrorContains(t, err, fmt.Sprintf("open %s: no such file or directory", filepath.Join(fsDir, "ledgersData", "chains")))
}
} else {
require.NoError(t, err)
require.Equal(t, anyError, testCase.expectedReturnValue)
actualResult, err := jsonrw.OutputFileToString(VerificationResultFile, outputDir)
require.NoError(t, err)
expectedResult, err := jsonrw.OutputFileToString(testCase.expectedResultFile, SampleResultDir)
require.NoError(t, err)
require.Equal(t, actualResult, expectedResult)
}
})
}
}