From f51f5e67845d400356aa7a95328af6384feadb3c Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Wed, 9 Dec 2020 18:27:20 +0000 Subject: [PATCH] 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. --- testutil/ioutil.go | 19 +++++-- testutil/ioutil_test.go | 6 +- x/auth/client/cli/cli_test.go | 82 +++++++++------------------- x/auth/client/cli/encode_test.go | 3 +- x/auth/client/rest/rest_test.go | 6 +- x/auth/client/tx_test.go | 3 +- x/distribution/client/cli/tx_test.go | 3 +- x/gov/client/cli/parse_test.go | 7 +-- x/params/client/cli/tx_test.go | 4 +- 9 files changed, 49 insertions(+), 84 deletions(-) diff --git a/testutil/ioutil.go b/testutil/ioutil.go index 9a5c697f88..20ea652b0d 100644 --- a/testutil/ioutil.go +++ b/testutil/ioutil.go @@ -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(), "") } diff --git a/testutil/ioutil_test.go b/testutil/ioutil_test.go index 4a05fb08dc..415e7842c1 100644 --- a/testutil/ioutil_test.go +++ b/testutil/ioutil_test.go @@ -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) { diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index e6cc5230ea..b935d66412 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -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 diff --git a/x/auth/client/cli/encode_test.go b/x/auth/client/cli/encode_test.go index 3e5f616f5b..44648758ab 100644 --- a/x/auth/client/cli/encode_test.go +++ b/x/auth/client/cli/encode_test.go @@ -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{}. diff --git a/x/auth/client/rest/rest_test.go b/x/auth/client/rest/rest_test.go index fb9dd73d75..cc1a5d1cde 100644 --- a/x/auth/client/rest/rest_test.go +++ b/x/auth/client/rest/rest_test.go @@ -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 diff --git a/x/auth/client/tx_test.go b/x/auth/client/tx_test.go index 3f194d84ae..3e1d31383d 100644 --- a/x/auth/client/tx_test.go +++ b/x/auth/client/tx_test.go @@ -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) diff --git a/x/distribution/client/cli/tx_test.go b/x/distribution/client/cli/tx_test.go index 4a21a534e9..36a946e7cc 100644 --- a/x/distribution/client/cli/tx_test.go +++ b/x/distribution/client/cli/tx_test.go @@ -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) diff --git a/x/gov/client/cli/parse_test.go b/x/gov/client/cli/parse_test.go index 40f37b2024..da6aeea719 100644 --- a/x/gov/client/cli/parse_test.go +++ b/x/gov/client/cli/parse_test.go @@ -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 diff --git a/x/params/client/cli/tx_test.go b/x/params/client/cli/tx_test.go index a85e8b1d48..215fb41c82 100644 --- a/x/params/client/cli/tx_test.go +++ b/x/params/client/cli/tx_test.go @@ -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)