testutil: new TempFile function, simplify WriteToNewTempFile (#8123)

Files returned by WriteToNewTempFile are cleaned up
automatically at the end of a test case execution.
WriteToNewTempFile now relies on the TB.TempDir()
function provided by the testing std package.

TempFile returns a temporary file that can be used
within a test case and is automatically removed
at the end of the test execution.
This commit is contained in:
Alessio Treglia 2020-12-09 18:27:20 +00:00 committed by GitHub
parent af401359eb
commit f51f5e6784
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 49 additions and 84 deletions

View File

@ -52,15 +52,22 @@ func ApplyMockIODiscardOutErr(c *cobra.Command) BufferReader {
}
// Write the given string to a new temporary file.
// Returns an open file and a clean up function that
// the caller must call to remove the file when it is
// no longer needed.
func WriteToNewTempFile(t testing.TB, s string) (*os.File, func()) {
fp, err := ioutil.TempFile("", strings.ReplaceAll(t.Name(), "/", "_")+"_")
// Returns an open file for the test to use.
func WriteToNewTempFile(t testing.TB, s string) *os.File {
t.Helper()
fp, err := TempFile(t)
require.Nil(t, err)
_, err = fp.WriteString(s)
require.Nil(t, err)
return fp, func() { os.Remove(fp.Name()) }
return fp
}
// TempFile returns a writable temporary file for the test to use.
func TempFile(t testing.TB) (*os.File, error) {
t.Helper()
return ioutil.TempFile(t.TempDir(), "")
}

View File

@ -25,16 +25,12 @@ func TestApplyMockIO(t *testing.T) {
}
func TestWriteToNewTempFile(t *testing.T) {
tempfile, cleanup := testutil.WriteToNewTempFile(t, "test string")
tempfile := testutil.WriteToNewTempFile(t, "test string")
tempfile.Close()
bs, err := ioutil.ReadFile(tempfile.Name())
require.NoError(t, err)
require.Equal(t, "test string", string(bs))
cleanup()
require.NoFileExists(t, tempfile.Name())
}
func TestApplyMockIODiscardOutErr(t *testing.T) {

View File

@ -92,16 +92,13 @@ func (s *IntegrationTestSuite) TestCLIValidateSignatures() {
s.Require().NoError(err)
// write unsigned tx to file
unsignedTx, cleanup := testutil.WriteToNewTempFile(s.T(), res.String())
defer cleanup()
unsignedTx := testutil.WriteToNewTempFile(s.T(), res.String())
res, err = authtest.TxSignExec(val.ClientCtx, val.Address, unsignedTx.Name())
s.Require().NoError(err)
signedTx, err := val.ClientCtx.TxConfig.TxJSONDecoder()(res.Bytes())
s.Require().NoError(err)
signedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), res.String())
defer cleanup()
signedTxFile := testutil.WriteToNewTempFile(s.T(), res.String())
txBuilder, err := val.ClientCtx.TxConfig.WrapTxBuilder(signedTx)
res, err = authtest.TxValidateSignaturesExec(val.ClientCtx, signedTxFile.Name())
s.Require().NoError(err)
@ -110,8 +107,7 @@ func (s *IntegrationTestSuite) TestCLIValidateSignatures() {
bz, err := val.ClientCtx.TxConfig.TxJSONEncoder()(txBuilder.GetTx())
s.Require().NoError(err)
modifiedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), string(bz))
defer cleanup()
modifiedTxFile := testutil.WriteToNewTempFile(s.T(), string(bz))
res, err = authtest.TxValidateSignaturesExec(val.ClientCtx, modifiedTxFile.Name())
s.Require().EqualError(err, "signatures validation failed")
@ -136,28 +132,24 @@ func (s *IntegrationTestSuite) TestCLISignBatch() {
s.Require().NoError(err)
// Write the output to disk
filename, cleanup1 := testutil.WriteToNewTempFile(s.T(), strings.Repeat(generatedStd.String(), 3))
defer cleanup1()
outputFile := testutil.WriteToNewTempFile(s.T(), strings.Repeat(generatedStd.String(), 3))
// sign-batch file - offline is set but account-number and sequence are not
val.ClientCtx.HomeDir = strings.Replace(val.ClientCtx.HomeDir, "simd", "simcli", 1)
res, err := authtest.TxSignBatchExec(val.ClientCtx, val.Address, filename.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID), "--offline")
res, err := authtest.TxSignBatchExec(val.ClientCtx, val.Address, outputFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID), "--offline")
s.Require().EqualError(err, "required flag(s) \"account-number\", \"sequence\" not set")
// sign-batch file
res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, filename.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID))
res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, outputFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID))
s.Require().NoError(err)
s.Require().Equal(3, len(strings.Split(strings.Trim(res.String(), "\n"), "\n")))
// sign-batch file
res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, filename.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID), "--signature-only")
res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, outputFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID), "--signature-only")
s.Require().NoError(err)
s.Require().Equal(3, len(strings.Split(strings.Trim(res.String(), "\n"), "\n")))
// Sign batch malformed tx file.
malformedFile, cleanup2 := testutil.WriteToNewTempFile(s.T(), fmt.Sprintf("%smalformed", generatedStd))
defer cleanup2()
malformedFile := testutil.WriteToNewTempFile(s.T(), fmt.Sprintf("%smalformed", generatedStd))
res, err = authtest.TxSignBatchExec(val.ClientCtx, val.Address, malformedFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID))
s.Require().Error(err)
@ -346,8 +338,7 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() {
s.Require().Equal(len(finalStdTx.GetMsgs()), 1)
// Write the output to disk
unsignedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), finalGeneratedTx.String())
defer cleanup()
unsignedTxFile := testutil.WriteToNewTempFile(s.T(), finalGeneratedTx.String())
// Test validate-signatures
res, err := authtest.TxValidateSignaturesExec(val1.ClientCtx, unsignedTxFile.Name())
@ -379,8 +370,7 @@ func (s *IntegrationTestSuite) TestCLISendGenerateSignAndBroadcast() {
s.Require().Equal(val1.Address.String(), txBuilder.GetTx().GetSigners()[0].String())
// Write the output to disk
signedTxFile, cleanup2 := testutil.WriteToNewTempFile(s.T(), signedTx.String())
defer cleanup2()
signedTxFile := testutil.WriteToNewTempFile(s.T(), signedTx.String())
// Validate Signature
res, err = authtest.TxValidateSignaturesExec(val1.ClientCtx, signedTxFile.Name())
@ -474,23 +464,20 @@ func (s *IntegrationTestSuite) TestCLIMultisignInsufficientCosigners() {
s.Require().NoError(err)
// Save tx to file
multiGeneratedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), multiGeneratedTx.String())
defer cleanup()
multiGeneratedTxFile := testutil.WriteToNewTempFile(s.T(), multiGeneratedTx.String())
// Multisign, sign with one signature
val1.ClientCtx.HomeDir = strings.Replace(val1.ClientCtx.HomeDir, "simd", "simcli", 1)
account1Signature, err := authtest.TxSignExec(val1.ClientCtx, account1.GetAddress(), multiGeneratedTxFile.Name(), "--multisig", multisigInfo.GetAddress().String())
s.Require().NoError(err)
sign1File, cleanup2 := testutil.WriteToNewTempFile(s.T(), account1Signature.String())
defer cleanup2()
sign1File := testutil.WriteToNewTempFile(s.T(), account1Signature.String())
multiSigWith1Signature, err := authtest.TxMultiSignExec(val1.ClientCtx, multisigInfo.GetName(), multiGeneratedTxFile.Name(), sign1File.Name())
s.Require().NoError(err)
// Save tx to file
multiSigWith1SignatureFile, cleanup3 := testutil.WriteToNewTempFile(s.T(), multiSigWith1Signature.String())
defer cleanup3()
multiSigWith1SignatureFile := testutil.WriteToNewTempFile(s.T(), multiSigWith1Signature.String())
exec, err := authtest.TxValidateSignaturesExec(val1.ClientCtx, multiSigWith1SignatureFile.Name())
s.Require().Error(err)
@ -516,8 +503,7 @@ func (s *IntegrationTestSuite) TestCLIEncode() {
s.Require().NoError(err)
// Save tx to file
savedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), normalGeneratedTx.String())
defer cleanup()
savedTxFile := testutil.WriteToNewTempFile(s.T(), normalGeneratedTx.String())
// Encode
encodeExec, err := authtest.TxEncodeExec(val1.ClientCtx, savedTxFile.Name())
@ -603,30 +589,26 @@ func (s *IntegrationTestSuite) TestCLIMultisignSortSignatures() {
s.Require().NoError(err)
// Save tx to file
multiGeneratedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), multiGeneratedTx.String())
defer cleanup()
multiGeneratedTxFile := testutil.WriteToNewTempFile(s.T(), multiGeneratedTx.String())
// Sign with account1
val1.ClientCtx.HomeDir = strings.Replace(val1.ClientCtx.HomeDir, "simd", "simcli", 1)
account1Signature, err := authtest.TxSignExec(val1.ClientCtx, account1.GetAddress(), multiGeneratedTxFile.Name(), "--multisig", multisigInfo.GetAddress().String())
s.Require().NoError(err)
sign1File, cleanup2 := testutil.WriteToNewTempFile(s.T(), account1Signature.String())
defer cleanup2()
sign1File := testutil.WriteToNewTempFile(s.T(), account1Signature.String())
// Sign with account1
account2Signature, err := authtest.TxSignExec(val1.ClientCtx, account2.GetAddress(), multiGeneratedTxFile.Name(), "--multisig", multisigInfo.GetAddress().String())
s.Require().NoError(err)
sign2File, cleanup3 := testutil.WriteToNewTempFile(s.T(), account2Signature.String())
defer cleanup3()
sign2File := testutil.WriteToNewTempFile(s.T(), account2Signature.String())
multiSigWith2Signatures, err := authtest.TxMultiSignExec(val1.ClientCtx, multisigInfo.GetName(), multiGeneratedTxFile.Name(), sign1File.Name(), sign2File.Name())
s.Require().NoError(err)
// Write the output to disk
signedTxFile, cleanup4 := testutil.WriteToNewTempFile(s.T(), multiSigWith2Signatures.String())
defer cleanup4()
signedTxFile := testutil.WriteToNewTempFile(s.T(), multiSigWith2Signatures.String())
_, err = authtest.TxValidateSignaturesExec(val1.ClientCtx, signedTxFile.Name())
s.Require().NoError(err)
@ -695,23 +677,20 @@ func (s *IntegrationTestSuite) TestCLIMultisign() {
s.Require().NoError(err)
// Save tx to file
multiGeneratedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), multiGeneratedTx.String())
defer cleanup()
multiGeneratedTxFile := testutil.WriteToNewTempFile(s.T(), multiGeneratedTx.String())
// Sign with account1
val1.ClientCtx.HomeDir = strings.Replace(val1.ClientCtx.HomeDir, "simd", "simcli", 1)
account1Signature, err := authtest.TxSignExec(val1.ClientCtx, account1.GetAddress(), multiGeneratedTxFile.Name(), "--multisig", multisigInfo.GetAddress().String())
s.Require().NoError(err)
sign1File, cleanup2 := testutil.WriteToNewTempFile(s.T(), account1Signature.String())
defer cleanup2()
sign1File := testutil.WriteToNewTempFile(s.T(), account1Signature.String())
// Sign with account1
account2Signature, err := authtest.TxSignExec(val1.ClientCtx, account2.GetAddress(), multiGeneratedTxFile.Name(), "--multisig", multisigInfo.GetAddress().String())
s.Require().NoError(err)
sign2File, cleanup3 := testutil.WriteToNewTempFile(s.T(), account2Signature.String())
defer cleanup3()
sign2File := testutil.WriteToNewTempFile(s.T(), account2Signature.String())
// Does not work in offline mode.
_, err = authtest.TxMultiSignExec(val1.ClientCtx, multisigInfo.GetName(), multiGeneratedTxFile.Name(), "--offline", sign1File.Name(), sign2File.Name())
@ -722,8 +701,7 @@ func (s *IntegrationTestSuite) TestCLIMultisign() {
s.Require().NoError(err)
// Write the output to disk
signedTxFile, cleanup4 := testutil.WriteToNewTempFile(s.T(), multiSigWith2Signatures.String())
defer cleanup4()
signedTxFile := testutil.WriteToNewTempFile(s.T(), multiSigWith2Signatures.String())
_, err = authtest.TxValidateSignaturesExec(val1.ClientCtx, signedTxFile.Name())
s.Require().NoError(err)
@ -775,9 +753,7 @@ func (s *IntegrationTestSuite) TestSignBatchMultisig() {
s.Require().NoError(err)
// Write the output to disk
filename, cleanup1 := testutil.WriteToNewTempFile(s.T(), strings.Repeat(generatedStd.String(), 1))
defer cleanup1()
filename := testutil.WriteToNewTempFile(s.T(), strings.Repeat(generatedStd.String(), 1))
val.ClientCtx.HomeDir = strings.Replace(val.ClientCtx.HomeDir, "simd", "simcli", 1)
// sign-batch file
@ -785,8 +761,7 @@ func (s *IntegrationTestSuite) TestSignBatchMultisig() {
s.Require().NoError(err)
s.Require().Equal(1, len(strings.Split(strings.Trim(res.String(), "\n"), "\n")))
// write sigs to file
file1, cleanup2 := testutil.WriteToNewTempFile(s.T(), res.String())
defer cleanup2()
file1 := testutil.WriteToNewTempFile(s.T(), res.String())
// sign-batch file with account2
res, err = authtest.TxSignBatchExec(val.ClientCtx, account2.GetAddress(), filename.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID), "--multisig", multisigInfo.GetAddress().String())
@ -794,8 +769,7 @@ func (s *IntegrationTestSuite) TestSignBatchMultisig() {
s.Require().Equal(1, len(strings.Split(strings.Trim(res.String(), "\n"), "\n")))
// write sigs to file2
file2, cleanup3 := testutil.WriteToNewTempFile(s.T(), res.String())
defer cleanup3()
file2 := testutil.WriteToNewTempFile(s.T(), res.String())
res, err = authtest.TxMultiSignExec(val.ClientCtx, multisigInfo.GetName(), filename.Name(), file1.Name(), file2.Name())
s.Require().NoError(err)
}
@ -955,8 +929,7 @@ func (s *IntegrationTestSuite) TestTxWithoutPublicKey() {
// Create a file with the unsigned tx.
txJSON, err := txCfg.TxJSONEncoder()(txBuilder.GetTx())
s.Require().NoError(err)
unsignedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), string(txJSON))
defer cleanup()
unsignedTxFile := testutil.WriteToNewTempFile(s.T(), string(txJSON))
// Sign the file with the unsignedTx.
signedTx, err := authtest.TxSignExec(val1.ClientCtx, val1.Address, unsignedTxFile.Name())
@ -972,9 +945,8 @@ func (s *IntegrationTestSuite) TestTxWithoutPublicKey() {
// Re-encode the tx again, to another file.
txJSON, err = val1.ClientCtx.JSONMarshaler.MarshalJSON(&tx)
s.Require().NoError(err)
signedTxFile, cleanup2 := testutil.WriteToNewTempFile(s.T(), string(txJSON))
signedTxFile := testutil.WriteToNewTempFile(s.T(), string(txJSON))
s.Require().True(strings.Contains(string(txJSON), "\"public_key\":null"))
defer cleanup2()
// Broadcast tx, test that it shouldn't panic.
val1.ClientCtx.BroadcastMode = flags.BroadcastSync

View File

@ -33,9 +33,8 @@ func TestGetCommandEncode(t *testing.T) {
jsonEncoded, err := txCfg.TxJSONEncoder()(builder.GetTx())
require.NoError(t, err)
txFile, cleanup := testutil.WriteToNewTempFile(t, string(jsonEncoded))
txFile := testutil.WriteToNewTempFile(t, string(jsonEncoded))
txFileName := txFile.Name()
t.Cleanup(cleanup)
ctx := context.Background()
clientCtx := client.Context{}.

View File

@ -453,9 +453,8 @@ func (s *IntegrationTestSuite) testQueryIBCTx(txRes sdk.TxResponse, cmd *cobra.C
out, err := clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, args)
s.Require().NoError(err)
txFile, cleanup := testutil.WriteToNewTempFile(s.T(), string(out.Bytes()))
txFile := testutil.WriteToNewTempFile(s.T(), string(out.Bytes()))
txFileName := txFile.Name()
s.T().Cleanup(cleanup)
// encode the generated txn.
out, err = clitestutil.ExecTestCLICmd(val.ClientCtx, authcli.GetEncodeCommand(), []string{txFileName})
@ -482,11 +481,10 @@ func (s *IntegrationTestSuite) TestLegacyRestErrMessages() {
val := s.network.Validators[0]
// Write consensus json to temp file, used for an IBC message.
consensusJSON, cleanup := testutil.WriteToNewTempFile(
consensusJSON := testutil.WriteToNewTempFile(
s.T(),
`{"public_key":{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A/3SXL2ONYaOkxpdR5P8tHTlSlPv1AwQwSFxKRee5JQW"},"diversifier":"diversifier","timestamp":"10"}`,
)
defer cleanup()
testCases := []struct {
desc string

View File

@ -74,9 +74,8 @@ func TestReadTxFromFile(t *testing.T) {
// Write it to the file
encodedTx, err := txCfg.TxJSONEncoder()(txBuilder.GetTx())
require.NoError(t, err)
jsonTxFile, cleanup := testutil.WriteToNewTempFile(t, string(encodedTx))
t.Cleanup(cleanup)
jsonTxFile := testutil.WriteToNewTempFile(t, string(encodedTx))
// Read it back
decodedTx, err := authclient.ReadTxFromFile(clientCtx, jsonTxFile.Name())
require.NoError(t, err)

View File

@ -67,7 +67,7 @@ func Test_splitAndCall_Splitting(t *testing.T) {
func TestParseProposal(t *testing.T) {
encodingConfig := params.MakeTestEncodingConfig()
okJSON, cleanup := testutil.WriteToNewTempFile(t, `
okJSON := testutil.WriteToNewTempFile(t, `
{
"title": "Community Pool Spend",
"description": "Pay me some Atoms!",
@ -76,7 +76,6 @@ func TestParseProposal(t *testing.T) {
"deposit": "1000stake"
}
`)
t.Cleanup(cleanup)
proposal, err := ParseCommunityPoolSpendProposalWithDeposit(encodingConfig.Marshaler, okJSON.Name())
require.NoError(t, err)

View File

@ -9,7 +9,7 @@ import (
)
func TestParseSubmitProposalFlags(t *testing.T) {
okJSON, cleanup1 := testutil.WriteToNewTempFile(t, `
okJSON := testutil.WriteToNewTempFile(t, `
{
"title": "Test Proposal",
"description": "My awesome proposal",
@ -17,11 +17,8 @@ func TestParseSubmitProposalFlags(t *testing.T) {
"deposit": "1000test"
}
`)
t.Cleanup(cleanup1)
badJSON, cleanup2 := testutil.WriteToNewTempFile(t, "bad json")
t.Cleanup(cleanup2)
badJSON := testutil.WriteToNewTempFile(t, "bad json")
fs := NewCmdSubmitProposal().Flags()
// nonexistent json

View File

@ -12,7 +12,7 @@ import (
func TestParseProposal(t *testing.T) {
cdc := codec.NewLegacyAmino()
okJSON, cleanup := testutil.WriteToNewTempFile(t, `
okJSON := testutil.WriteToNewTempFile(t, `
{
"title": "Staking Param Change",
"description": "Update max validators",
@ -26,8 +26,6 @@ func TestParseProposal(t *testing.T) {
"deposit": "1000stake"
}
`)
t.Cleanup(cleanup)
proposal, err := utils.ParseParamChangeProposalJSON(cdc, okJSON.Name())
require.NoError(t, err)