forked from cerc-io/plugeth
8d066f1f42
This commit replaces ioutil.TempDir with t.TempDir in tests. The directory created by t.TempDir is automatically removed when the test and all its subtests complete. Prior to this commit, temporary directory created using ioutil.TempDir had to be removed manually by calling os.RemoveAll, which is omitted in some tests. The error handling boilerplate e.g. defer func() { if err := os.RemoveAll(dir); err != nil { t.Fatal(err) } } is also tedious, but t.TempDir handles this for us nicely. Reference: https://pkg.go.dev/testing#T.TempDir Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
98 lines
4.0 KiB
Go
98 lines
4.0 KiB
Go
// Copyright 2017 The go-ethereum Authors
|
|
// This file is part of the go-ethereum library.
|
|
//
|
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
// This file contains the code snippets from the developer's guide embedded into
|
|
// Go tests. This ensures that any code published in out guides will not break
|
|
// accidentally via some code update. If some API changes nonetheless that needs
|
|
// modifying this file, please port any modification over into the developer's
|
|
// guide wiki pages too!
|
|
|
|
package guide
|
|
|
|
import (
|
|
"math/big"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/ethereum/go-ethereum/accounts/keystore"
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
)
|
|
|
|
// Tests that the account management snippets work correctly.
|
|
func TestAccountManagement(t *testing.T) {
|
|
// Create a temporary folder to work with
|
|
workdir := t.TempDir()
|
|
|
|
// Create an encrypted keystore with standard crypto parameters
|
|
ks := keystore.NewKeyStore(filepath.Join(workdir, "keystore"), keystore.StandardScryptN, keystore.StandardScryptP)
|
|
|
|
// Create a new account with the specified encryption passphrase
|
|
newAcc, err := ks.NewAccount("Creation password")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create new account: %v", err)
|
|
}
|
|
// Export the newly created account with a different passphrase. The returned
|
|
// data from this method invocation is a JSON encoded, encrypted key-file
|
|
jsonAcc, err := ks.Export(newAcc, "Creation password", "Export password")
|
|
if err != nil {
|
|
t.Fatalf("Failed to export account: %v", err)
|
|
}
|
|
// Update the passphrase on the account created above inside the local keystore
|
|
if err := ks.Update(newAcc, "Creation password", "Update password"); err != nil {
|
|
t.Fatalf("Failed to update account: %v", err)
|
|
}
|
|
// Delete the account updated above from the local keystore
|
|
if err := ks.Delete(newAcc, "Update password"); err != nil {
|
|
t.Fatalf("Failed to delete account: %v", err)
|
|
}
|
|
// Import back the account we've exported (and then deleted) above with yet
|
|
// again a fresh passphrase
|
|
if _, err := ks.Import(jsonAcc, "Export password", "Import password"); err != nil {
|
|
t.Fatalf("Failed to import account: %v", err)
|
|
}
|
|
// Create a new account to sign transactions with
|
|
signer, err := ks.NewAccount("Signer password")
|
|
if err != nil {
|
|
t.Fatalf("Failed to create signer account: %v", err)
|
|
}
|
|
tx := types.NewTransaction(0, common.Address{}, big.NewInt(0), 0, big.NewInt(0), nil)
|
|
chain := big.NewInt(1)
|
|
|
|
// Sign a transaction with a single authorization
|
|
if _, err := ks.SignTxWithPassphrase(signer, "Signer password", tx, chain); err != nil {
|
|
t.Fatalf("Failed to sign with passphrase: %v", err)
|
|
}
|
|
// Sign a transaction with multiple manually cancelled authorizations
|
|
if err := ks.Unlock(signer, "Signer password"); err != nil {
|
|
t.Fatalf("Failed to unlock account: %v", err)
|
|
}
|
|
if _, err := ks.SignTx(signer, tx, chain); err != nil {
|
|
t.Fatalf("Failed to sign with unlocked account: %v", err)
|
|
}
|
|
if err := ks.Lock(signer.Address); err != nil {
|
|
t.Fatalf("Failed to lock account: %v", err)
|
|
}
|
|
// Sign a transaction with multiple automatically cancelled authorizations
|
|
if err := ks.TimedUnlock(signer, "Signer password", time.Second); err != nil {
|
|
t.Fatalf("Failed to time unlock account: %v", err)
|
|
}
|
|
if _, err := ks.SignTx(signer, tx, chain); err != nil {
|
|
t.Fatalf("Failed to sign with time unlocked account: %v", err)
|
|
}
|
|
}
|