OSDN Git Service

Add coretest module
authorjianyixun <317316abcd@163.com>
Thu, 26 Oct 2017 11:39:30 +0000 (19:39 +0800)
committerjianyixun <317316abcd@163.com>
Thu, 26 Oct 2017 11:39:30 +0000 (19:39 +0800)
Add coretest  fixture to construct tx

blockchain/coretest/fixture.go [new file with mode: 0644]

diff --git a/blockchain/coretest/fixture.go b/blockchain/coretest/fixture.go
new file mode 100644 (file)
index 0000000..5810c85
--- /dev/null
@@ -0,0 +1,106 @@
+ Package coretest provides utilities for testing Chain Core.
+package coretest
+
+import (
+    "context"
+    "testing"
+    "time"
+
+    "github.com/bytom/account"
+    "github.com/bytom/asset"
+    "github.com/bytom/pin"
+    "github.com/bytom/query"
+    "github.com/bytom/txbuilder"
+    "github.com/bytom/crypto/ed25519/chainkd"
+    "github.com/bytom/protocol"
+    "github.com/bytom/protocol/bc"
+    "github.com/bytom/protocol/bc/legacy"
+    "github.com/bytom/testutil"
+)
+
+func CreatePins(ctx context.Context, t testing.TB, s *pin.Store) {
+    pins := []string{
+        account.PinName,
+        account.ExpirePinName,
+        account.DeleteSpentsPinName,
+        asset.PinName,
+        query.TxPinName,
+    }
+    for _, p := range pins {
+        err := s.CreatePin(ctx, p, 0)
+        if err != nil {
+            testutil.FatalErr(t, err)
+        }
+    }
+}
+
+func CreateAccount(ctx context.Context, t testing.TB, accounts *account.Manager, alias string, tags map[string]interface{}) string {
+    keys := []chainkd.XPub{testutil.TestXPub}
+    acc, err := accounts.Create(ctx, keys, 1, alias, tags, "")
+    if err != nil {
+        testutil.FatalErr(t, err)
+    }
+    return acc.ID
+}
+
+func CreateAsset(ctx context.Context, t testing.TB, assets *asset.Registry, def map[string]interface{}, alias string, tags map[string]interface{}) bc.AssetID {
+    keys := []chainkd.XPub{testutil.TestXPub}
+    asset, err := assets.Define(ctx, keys, 1, def, alias, tags, "")
+    if err != nil {
+        testutil.FatalErr(t, err)
+    }
+    return asset.AssetID
+}
+
+func IssueAssets(ctx context.Context, t testing.TB, c *protocol.Chain, s txbuilder.Submitter, assets *asset.Registry, accounts *account.Manager, assetID bc.AssetID, amount uint64, accountID string) (*legacy.TxOutput, *bc.Output, bc.Hash) {
+    assetAmount := bc.AssetAmount{AssetId: &assetID, Amount: amount}
+
+    tpl, err := txbuilder.Build(ctx, nil, []txbuilder.Action{
+        assets.NewIssueAction(assetAmount, nil), // does not support reference data
+        accounts.NewControlAction(assetAmount, accountID, nil),
+    }, time.Now().Add(time.Hour))
+    if err != nil {
+        testutil.FatalErr(t, err)
+    }
+
+    SignTxTemplate(t, ctx, tpl, &testutil.TestXPrv)
+
+    err = txbuilder.FinalizeTx(ctx, c, s, tpl.Transaction)
+    if err != nil {
+        testutil.FatalErr(t, err)
+    }
+
+    outID0 := tpl.Transaction.OutputID(0)
+    out0 := tpl.Transaction.Entries[*outID0].(*bc.Output)
+    return tpl.Transaction.Outputs[0], out0, *outID0
+}
+
+func Transfer(ctx context.Context, t testing.TB, c *protocol.Chain, s txbuilder.Submitter, actions []txbuilder.Action) *legacy.Tx {
+    template, err := txbuilder.Build(ctx, nil, actions, time.Now().Add(time.Hour))
+    if err != nil {
+        testutil.FatalErr(t, err)
+    }
+
+    SignTxTemplate(t, ctx, template, &testutil.TestXPrv)
+
+    tx := legacy.NewTx(template.Transaction.TxData)
+    err = txbuilder.FinalizeTx(ctx, c, s, tx)
+    if err != nil {
+        testutil.FatalErr(t, err)
+    }
+
+    return tx
+}
+
+func SignTxTemplate(t testing.TB, ctx context.Context, template *txbuilder.Template, priv *chainkd.XPrv) {
+    if priv == nil {
+        priv = &testutil.TestXPrv
+    }
+    err := txbuilder.Sign(ctx, template, []chainkd.XPub{priv.XPub()}, func(_ context.Context, _ chainkd.XPub, path [][]byte, data [32]byte) ([]byte, error) {
+        derived := priv.Derive(path)
+        return derived.Sign(data[:]), nil
+    })
+    if err != nil {
+        t.Fatal(err)
+    }
+}