Unverified Commit cee84df9 authored by vipwzw's avatar vipwzw Committed by GitHub

Merge branch 'master' into fix_golint_warnings_for_trade

parents 98bbf394 1dd4066a
...@@ -21,10 +21,8 @@ build/main.sh ...@@ -21,10 +21,8 @@ build/main.sh
build/main* build/main*
build/para.sh build/para.sh
build/ci build/ci
build/tools/autotest/autotest build/autotest/*
build/tools/autotest/*.toml !build/autotest/build.sh
build/tools/autotest/chain33
build/tools/autotest/chain33-cli
.DS_Store .DS_Store
logs/ logs/
build/wallet build/wallet
......
...@@ -55,5 +55,6 @@ jobs: ...@@ -55,5 +55,6 @@ jobs:
- sudo mv docker-compose /usr/local/bin - sudo mv docker-compose /usr/local/bin
before_script: make build_ci before_script: make build_ci
script: script:
- make autotest_ci proj=build
# - make docker-compose && make docker-compose-down && make docker-compose DAPP=paracross && make docker-compose-down DAPP=paracross && make docker-compose DAPP=relay && make docker-compose-down DAPP=relay # - make docker-compose && make docker-compose-down && make docker-compose DAPP=paracross && make docker-compose-down DAPP=paracross && make docker-compose DAPP=relay && make docker-compose-down DAPP=relay
- make docker-compose DAPP=all && make docker-compose-down DAPP=all && make clean - make docker-compose DAPP=all && make docker-compose-down DAPP=all && make clean
...@@ -10,8 +10,6 @@ SRC_CLI := github.com/33cn/plugin/cli ...@@ -10,8 +10,6 @@ SRC_CLI := github.com/33cn/plugin/cli
APP := build/chain33 APP := build/chain33
CHAIN33=github.com/33cn/chain33 CHAIN33=github.com/33cn/chain33
CHAIN33_PATH=vendor/${CHAIN33} CHAIN33_PATH=vendor/${CHAIN33}
AUTO_TEST := build/tools/autotest/autotest
SRC_AUTO_TEST := ${CHAIN33}/cmd/autotest
LDFLAGS := -ldflags "-w -s" LDFLAGS := -ldflags "-w -s"
PKG_LIST := `go list ./... | grep -v "vendor" | grep -v "chain33/test" | grep -v "mocks" | grep -v "pbft"` PKG_LIST := `go list ./... | grep -v "vendor" | grep -v "chain33/test" | grep -v "mocks" | grep -v "pbft"`
PKG_LIST_Q := `go list ./... | grep -v "vendor" | grep -v "chain33/test" | grep -v "mocks" | grep -v "blockchain" | grep -v "pbft"` PKG_LIST_Q := `go list ./... | grep -v "vendor" | grep -v "chain33/test" | grep -v "mocks" | grep -v "blockchain" | grep -v "pbft"`
...@@ -38,12 +36,17 @@ para: ...@@ -38,12 +36,17 @@ para:
@go build -v -o build/$(NAME) -ldflags "-X $(SRC_CLI)/buildflags.ParaName=user.p.$(NAME). -X $(SRC_CLI)/buildflags.RPCAddr=http://localhost:8901" $(SRC_CLI) @go build -v -o build/$(NAME) -ldflags "-X $(SRC_CLI)/buildflags.ParaName=user.p.$(NAME). -X $(SRC_CLI)/buildflags.RPCAddr=http://localhost:8901" $(SRC_CLI)
autotest:## build autotest binary autotest: ## build autotest binary
@go build -v -i -o $(AUTO_TEST) $(SRC_AUTO_TEST) @cd build/autotest && bash ./build.sh && cd ../../
@cp cmd/autotest/*.toml build/tools/autotest/
@if [ -n "$(dapp)" ]; then \ @if [ -n "$(dapp)" ]; then \
cd build/tools/autotest && bash ./local-autotest.sh $(dapp) && cd ../../../; \ rm -rf build/autotest/local \
fi && cp -r $(CHAIN33_PATH)/build/autotest/local $(CHAIN33_PATH)/build/autotest/*.sh build/autotest/ \
&& cd build/autotest && bash ./copy-autotest.sh local && cd local && bash ./local-autotest.sh $(dapp) && cd ../../../; fi
autotest_ci: autotest ## autotest ci
@rm -rf build/autotest/jerkinsci \
&& cp -r $(CHAIN33_PATH)/build/autotest/jerkinsci $(CHAIN33_PATH)/build/autotest/*.sh build/autotest/ \
&& cd build/autotest && bash ./copy-autotest.sh jerkinsci/temp$(proj) \
&& cd jerkinsci && bash ./jerkins-ci-autotest.sh $(proj) && cd ../../../
update: update:
rm -rf ${CHAIN33_PATH} rm -rf ${CHAIN33_PATH}
...@@ -142,7 +145,7 @@ clean: ## Remove previous build ...@@ -142,7 +145,7 @@ clean: ## Remove previous build
@rm -rf build/relayd* @rm -rf build/relayd*
@rm -rf build/*.log @rm -rf build/*.log
@rm -rf build/logs @rm -rf build/logs
@rm -rf build/tools/autotest/autotest @rm -rf build/autotest/autotest
@rm -rf build/ci @rm -rf build/ci
@rm -rf tool @rm -rf tool
@go clean @go clean
......
#!/usr/bin/env bash
set -e
set -o pipefail
#set -o verbose
#set -o xtrace
sedfix=""
if [ "$(uname)" == "Darwin" ]; then
sedfix=".bak"
fi
AutoTestMain="../../vendor/github.com/33cn/chain33/cmd/autotest/main.go"
ImportPlugin='"github.com/33cn/plugin/plugin"'
function build_auto_test() {
cp "${AutoTestMain}" ./
sed -i $sedfix "/^package/a import _ ${ImportPlugin}" main.go
go build -v -i -o autotest
}
function clean_auto_test() {
rm -f ../autotest/main.go
}
trap "clean_auto_test" INT TERM EXIT
build_auto_test
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package autotest
import (
"strconv"
. "github.com/33cn/chain33/cmd/autotest/types"
)
//pub2priv case
type CreateUtxosCase struct {
BaseCase
From string `toml:"from"`
To string `toml:"to"`
Amount string `toml:"amount"`
}
type CreateUtxosPack struct {
BaseCasePack
}
func (testCase *CreateUtxosCase) SendCommand(packID string) (PackFunc, error) {
return DefaultSend(testCase, &CreateUtxosPack{}, packID)
}
func (pack *CreateUtxosPack) GetCheckHandlerMap() interface{} {
funcMap := make(CheckHandlerMapDiscard, 2)
funcMap["balance"] = pack.checkBalance
funcMap["utxo"] = pack.checkUtxo
return funcMap
}
func (pack *CreateUtxosPack) checkBalance(txInfo map[string]interface{}) bool {
interCase := pack.TCase.(*CreateUtxosCase)
feeStr := txInfo["tx"].(map[string]interface{})["fee"].(string)
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
logFee := logArr[0].(map[string]interface{})["log"].(map[string]interface{})
logSend := logArr[1].(map[string]interface{})["log"].(map[string]interface{})
fee, _ := strconv.ParseFloat(feeStr, 64)
amount, _ := strconv.ParseFloat(interCase.Amount, 64)
pack.FLog.Info("PrivCreateutxosDetail", "TestID", pack.PackID,
"Fee", feeStr, "Amount", interCase.Amount, "FromAddr", interCase.From,
"FromPrev", logSend["prev"].(map[string]interface{})["balance"].(string),
"FromCurr", logSend["current"].(map[string]interface{})["balance"].(string))
return CheckBalanceDeltaWithAddr(logFee, interCase.From, -fee) &&
CheckBalanceDeltaWithAddr(logSend, interCase.From, -amount)
}
func (pack *CreateUtxosPack) checkUtxo(txInfo map[string]interface{}) bool {
interCase := pack.TCase.(*CreateUtxosCase)
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
outputLog := logArr[2].(map[string]interface{})["log"].(map[string]interface{})
amount, _ := strconv.ParseFloat(interCase.Amount, 64)
//get available utxo with addr
availUtxo, err := CalcUtxoAvailAmount(interCase.To, pack.TxHash)
totalOutput := CalcTxUtxoAmount(outputLog, "keyoutput")
availCheck := IsBalanceEqualFloat(availUtxo, amount)
pack.FLog.Info("PrivCreateutxosDetail", "TestID", pack.PackID,
"TransferAmount", interCase.Amount, "UtxoOutput", totalOutput,
"ToAddr", interCase.To, "UtxoAvailable", availUtxo, "CalcAvailErr", err)
return availCheck && IsBalanceEqualFloat(totalOutput, amount)
}
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package autotest
import (
"strconv"
. "github.com/33cn/chain33/cmd/autotest/types"
)
//pub2priv case
type PrivToPrivCase struct {
BaseCase
From string `toml:"from"`
To string `toml:"to"`
Amount string `toml:"amount"`
}
type PrivToPrivPack struct {
BaseCasePack
}
func (testCase *PrivToPrivCase) SendCommand(packID string) (PackFunc, error) {
return DefaultSend(testCase, &PrivToPrivPack{}, packID)
}
func (pack *PrivToPrivPack) GetCheckHandlerMap() interface{} {
funcMap := make(CheckHandlerMapDiscard, 2)
funcMap["utxo"] = pack.checkUtxo
return funcMap
}
func (pack *PrivToPrivPack) checkUtxo(txInfo map[string]interface{}) bool {
interCase := pack.TCase.(*PrivToPrivCase)
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
inputLog := logArr[1].(map[string]interface{})["log"].(map[string]interface{})
outputLog := logArr[2].(map[string]interface{})["log"].(map[string]interface{})
amount, _ := strconv.ParseFloat(interCase.Amount, 64)
fee, _ := strconv.ParseFloat(txInfo["tx"].(map[string]interface{})["fee"].(string), 64)
utxoInput := CalcTxUtxoAmount(inputLog, "keyinput")
utxoOutput := CalcTxUtxoAmount(outputLog, "keyoutput")
fromAvail, err1 := CalcUtxoAvailAmount(interCase.From, pack.TxHash)
fromSpend, err2 := CalcUtxoSpendAmount(interCase.From, pack.TxHash)
toAvail, err3 := CalcUtxoAvailAmount(interCase.To, pack.TxHash)
utxoCheck := IsBalanceEqualFloat(fromAvail, utxoInput-amount-fee) &&
IsBalanceEqualFloat(toAvail, amount) &&
IsBalanceEqualFloat(fromSpend, utxoInput)
pack.FLog.Info("Private2PrivateUtxoDetail", "TestID", pack.PackID,
"FromAddr", interCase.From, "ToAddr", interCase.To, "Fee", fee,
"TransferAmount", interCase.Amount, "UtxoInput", utxoInput, "UtxoOutput", utxoOutput,
"FromAvailable", fromAvail, "FromSpend", fromSpend, "ToAvailable", toAvail,
"CalcFromAvailErr", err1, "CalcFromSpendErr", err2, "CalcToAvailErr", err3)
return IsBalanceEqualFloat(fee, utxoInput-utxoOutput) && utxoCheck
}
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package autotest
import (
"strconv"
. "github.com/33cn/chain33/cmd/autotest/types"
)
//pub2priv case
type PrivToPubCase struct {
BaseCase
From string `toml:"from"`
To string `toml:"to"`
Amount string `toml:"amount"`
}
type PrivToPubPack struct {
BaseCasePack
}
func (testCase *PrivToPubCase) SendCommand(packID string) (PackFunc, error) {
return DefaultSend(testCase, &PrivToPubPack{}, packID)
}
func (pack *PrivToPubPack) GetCheckHandlerMap() interface{} {
funcMap := make(CheckHandlerMapDiscard, 2)
funcMap["balance"] = pack.checkBalance
funcMap["utxo"] = pack.checkUtxo
return funcMap
}
func (pack *PrivToPubPack) checkBalance(txInfo map[string]interface{}) bool {
interCase := pack.TCase.(*PrivToPubCase)
feeStr := txInfo["tx"].(map[string]interface{})["fee"].(string)
from := txInfo["fromaddr"].(string) //privacy contract addr
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
logFee := logArr[0].(map[string]interface{})["log"].(map[string]interface{})
logPub := logArr[1].(map[string]interface{})["log"].(map[string]interface{})
fee, _ := strconv.ParseFloat(feeStr, 64)
amount, _ := strconv.ParseFloat(interCase.Amount, 64)
pack.FLog.Info("Private2PubDetails", "TestID", pack.PackID,
"Fee", feeStr, "Amount", interCase.Amount,
"FromAddr", interCase.From, "ToAddr", interCase.To,
"ToPrev", logPub["prev"].(map[string]interface{})["balance"].(string),
"ToCurr", logPub["current"].(map[string]interface{})["balance"].(string))
return CheckBalanceDeltaWithAddr(logFee, from, -fee) &&
CheckBalanceDeltaWithAddr(logPub, interCase.To, amount)
}
func (pack *PrivToPubPack) checkUtxo(txInfo map[string]interface{}) bool {
interCase := pack.TCase.(*PrivToPubCase)
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
inputLog := logArr[2].(map[string]interface{})["log"].(map[string]interface{})
outputLog := logArr[3].(map[string]interface{})["log"].(map[string]interface{})
amount, _ := strconv.ParseFloat(interCase.Amount, 64)
fee, _ := strconv.ParseFloat(txInfo["tx"].(map[string]interface{})["fee"].(string), 64)
utxoInput := CalcTxUtxoAmount(inputLog, "keyinput")
utxoOutput := CalcTxUtxoAmount(outputLog, "keyoutput")
//get available utxo with addr
availUtxo, err1 := CalcUtxoAvailAmount(interCase.From, pack.TxHash)
//get spend utxo with addr
spendUtxo, err2 := CalcUtxoSpendAmount(interCase.From, pack.TxHash)
utxoCheck := IsBalanceEqualFloat(availUtxo, utxoOutput) && IsBalanceEqualFloat(spendUtxo, utxoInput)
pack.FLog.Info("Private2PubUtxoDetail", "TestID", pack.PackID, "Fee", fee,
"TransferAmount", interCase.Amount, "UtxoInput", utxoInput, "UtxoOutput", utxoOutput,
"FromAddr", interCase.From, "UtxoAvailable", availUtxo, "UtxoSpend", spendUtxo,
"CalcAvailErr", err1, "CalcSpendErr", err2)
return IsBalanceEqualFloat(amount, utxoInput-utxoOutput-fee) && utxoCheck
}
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package autotest
import (
"reflect"
. "github.com/33cn/chain33/cmd/autotest/types"
. "github.com/33cn/chain33/system/dapp/coins/autotest"
. "github.com/33cn/plugin/plugin/dapp/token/autotest"
)
type privacyAutoTest struct {
SimpleCaseArr []SimpleCase `toml:"SimpleCase,omitempty"`
TokenPreCreateCaseArr []TokenPreCreateCase `toml:"TokenPreCreateCase,omitempty"`
TokenFinishCreateCaseArr []TokenFinishCreateCase `toml:"TokenFinishCreateCase,omitempty"`
TransferCaseArr []TransferCase `toml:"TransferCase,omitempty"`
PubToPrivCaseArr []PubToPrivCase `toml:"PubToPrivCase,omitempty"`
PrivToPrivCaseArr []PrivToPrivCase `toml:"PrivToPrivCase,omitempty"`
PrivToPubCaseArr []PrivToPubCase `toml:"PrivToPubCase,omitempty"`
CreateUtxosCaseArr []CreateUtxosCase `toml:"CreateUtxosCase,omitempty"`
}
func init() {
RegisterAutoTest(privacyAutoTest{})
}
func (config privacyAutoTest) GetName() string {
return "privacy"
}
func (config privacyAutoTest) GetTestConfigType() reflect.Type {
return reflect.TypeOf(config)
}
[[SimpleCase]]
id = "enablePrivacy"
command = "privacy enable -a all"
dep = ["import1", "import2", "import3"]
#import privacy test addr, 1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt
[[SimpleCase]]
id = "import1"
command = "account import_key -k 0x88b2fb90411935872f0501dd13345aba19b5fac9b00eb0dddd7df977d4d5477e -l privacy_test1"
#import privacy test addr,17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT
[[SimpleCase]]
id = "import2"
command = "account import_key -k 0xa0c6f46de8d275ce21e935afa5363e9b8a087fe604e05f7a9eef1258dc781c3a -l privacy_test2"
#import privacy test addr, 12HKLEn6g4FH39yUbHh4EVJWcFo5CXg22d
[[SimpleCase]]
id = "import3"
command = "account import_key -k 0x9d4f8ab11361be596468b265cb66946c87873d4a119713fd0c3d8302eae0a8e4 -l privacy_test3"
#prepare for privacy
[[TransferCase]]
id = "trans1"
command = "send bty transfer -a 999 -t 1FeyE6VDZ4FYgpK1n2okWMDAtPkwBuooQd -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "1FeyE6VDZ4FYgpK1n2okWMDAtPkwBuooQd"
amount = "999"
checkItem = ["balance"]
dep = ["transForFee1", "transForFee2", "transForFee3"]
[[TransferCase]]
id = "transForFee1"
command = "send bty transfer -a 100 -t 1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt"
amount = "100"
checkItem = ["balance"]
dep = ["enablePrivacy"]
[[TransferCase]]
id = "transForFee2"
command = "send bty transfer -a 100 -t 17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT"
amount = "100"
checkItem = ["balance"]
dep = ["enablePrivacy"]
[[TransferCase]]
id = "transForFee3"
command = "send bty transfer -a 100 -t 12HKLEn6g4FH39yUbHh4EVJWcFo5CXg22d -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "12HKLEn6g4FH39yUbHh4EVJWcFo5CXg22d"
amount = "100"
checkItem = ["balance"]
dep = ["enablePrivacy"]
#pub2priv
[[PubToPrivCase]]
id = "pub2priv1"
command = "privacy pub2priv -a 99 -f 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -p d736dcff89c2e588d1fc3d44ba956af4d15d0a01eb1aedaf58fcbc2bdd09591fec9fd83ea6eee18c5a0fd8f1d167b1f8b020d8a6203be49f0bf3f410473fc534"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT"
amount = "99"
checkItem = ["balance", "utxo"]
dep = ["trans1"]
[[PubToPrivCase]]
id = "pub2priv2"
command = "privacy pub2priv -a 99 -f 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -p d45063357ab3454cfb7ee87db8f9ca2772d11bd82d4f681ce00ae44fe5929e8fd964867dae1b19b265b7f68d4ad965cfd4a0aaf71580344adf9fce28cfebadab"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt"
amount = "99"
checkItem = ["balance", "utxo"]
dep = ["trans1"]
[[PubToPrivCase]]
id = "pub2priv3"
command = "privacy pub2priv -a 199 -f 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -p dda1ae3184c1f4faca5b4e4be3dfea1c5026338764aca1d2c3e8e3c0b0001f4f4d5eb1761cd27dcbf36e2559c66173bc0d46ecc4feb72dee9e60896a696a5a06"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "12HKLEn6g4FH39yUbHh4EVJWcFo5CXg22d"
amount = "199"
checkItem = ["balance", "utxo"]
dep = ["trans1"]
#failpub2priv
[[PubToPrivCase]]
id = "failpub2priv1"
command = "privacy pub2priv -a 1000 -f 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -p d736dcff89c2e588d1fc3d44ba956af4d15d0a01eb1aedaf58fcbc2bdd09591fec9fd83ea6eee18c5a0fd8f1d167b1f8b020d8a6203be49f0bf3f410473fc534"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT"
amount = "1000"
checkItem = ["balance", "utxo"]
dep = ["trans1"]
fail = true
[[PubToPrivCase]]
id = "failpub2priv2"
command = "privacy pub2priv -a 603 -f 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -p d45063357ab3454cfb7ee87db8f9ca2772d11bd82d4f681ce00ae44fe5929e8fd964867dae1b19b265b7f68d4ad965cfd4a0aaf71580344adf9fce28cfebadab"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt"
amount = "603"
checkItem = ["balance", "utxo"]
dep = ["pub2priv3"]
fail = true
#priv2priv
[[PrivToPrivCase]]
id = "priv2priv1"
command = "privacy priv2priv -a 39 -f 17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT -p 0a9d212b2505aefaa8da370319088bbccfac097b007f52ed71d8133456c8185823c8eac43c5e937953d7b6c8e68b0db1f4f03df4946a29f524875118960a35fb"
from = "17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "39"
checkItem = ["utxo"]
dep = ["pub2priv1"]
[[PrivToPrivCase]]
id = "priv2priv2"
command = "privacy priv2priv -a 49 -f 1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt -p 0a9d212b2505aefaa8da370319088bbccfac097b007f52ed71d8133456c8185823c8eac43c5e937953d7b6c8e68b0db1f4f03df4946a29f524875118960a35fb"
from = "1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "49"
checkItem = ["utxo"]
dep = ["pub2priv2"]
[[PrivToPrivCase]]
id = "priv2priv3"
command = "privacy priv2priv -a 69 -f 12HKLEn6g4FH39yUbHh4EVJWcFo5CXg22d -p 0a9d212b2505aefaa8da370319088bbccfac097b007f52ed71d8133456c8185823c8eac43c5e937953d7b6c8e68b0db1f4f03df4946a29f524875118960a35fb"
from = "12HKLEn6g4FH39yUbHh4EVJWcFo5CXg22d"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "69"
checkItem = ["utxo"]
dep = ["pub2priv3"]
#failpriv2priv
[[PrivToPrivCase]]
id = "failpriv2priv1"
command = "privacy priv2priv -a 100 -f 17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT -p 0a9d212b2505aefaa8da370319088bbccfac097b007f52ed71d8133456c8185823c8eac43c5e937953d7b6c8e68b0db1f4f03df4946a29f524875118960a35fb"
from = "17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "100"
checkItem = ["utxo"]
dep = ["pub2priv1"]
fail = true
[[PrivToPrivCase]]
id = "failpriv2priv2"
command = "privacy priv2priv -a 51 -f 1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt -p 0a9d212b2505aefaa8da370319088bbccfac097b007f52ed71d8133456c8185823c8eac43c5e937953d7b6c8e68b0db1f4f03df4946a29f524875118960a35fb"
from = "1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "51"
checkItem = ["utxo"]
dep = ["priv2priv2"]
fail = true
#priv2pub
[[PrivToPubCase]]
id = "priv2pub1"
command = "privacy priv2pub -a 48 -f 17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT -t 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "48"
checkItem = ["balance", "utxo"]
dep = ["priv2priv1"]
[[PrivToPubCase]]
id = "priv2pub2"
command = "privacy priv2pub -a 48 -f 1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt -t 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "48"
checkItem = ["balance", "utxo"]
dep = ["priv2priv2"]
[[PrivToPubCase]]
id = "priv2pub3"
command = "privacy priv2pub -a 69 -f 12HKLEn6g4FH39yUbHh4EVJWcFo5CXg22d -t 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12HKLEn6g4FH39yUbHh4EVJWcFo5CXg22d"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "69"
checkItem = ["balance", "utxo"]
dep = ["priv2priv3"]
#failpriv2pub
[[PrivToPubCase]]
id = "failpriv2pub1"
command = "privacy priv2pub -a 100 -f 17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT -t 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "17UZr5eJVxDRW1gs7rausQwaSUPtvcpxGT"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "100"
checkItem = ["balance", "utxo"]
dep = ["priv2priv1"]
fail = true
[[PrivToPubCase]]
id = "failpriv2pub2"
command = "privacy priv2pub -a 3 -f 1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt -t 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "1D9xKRnLvV2zMtSxSx33ow1GF4pcbLcNRt"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "3"
checkItem = ["balance", "utxo"]
dep = ["priv2pub2"]
fail = true
#createutxosCase
[[CreateutxosCase]]
id = "privCreateutxos"
command = "privacy createutxos -a 20 -f 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -p 0a9d212b2505aefaa8da370319088bbccfac097b007f52ed71d8133456c8185823c8eac43c5e937953d7b6c8e68b0db1f4f03df4946a29f524875118960a35fb"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "20"
checkItem = ["balance", "utxo"]
dep = ["trans1"]
#failcreateutxosCase
[[CreateutxosCase]]
id = "failprivCreateutxos"
command = "privacy createutxos -a 1000 -f 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -p 0a9d212b2505aefaa8da370319088bbccfac097b007f52ed71d8133456c8185823c8eac43c5e937953d7b6c8e68b0db1f4f03df4946a29f524875118960a35fb"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "1000"
checkItem = ["balance", "utxo"]
dep = ["trans1"]
fail = true
\ No newline at end of file
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package autotest
import (
"strconv"
. "github.com/33cn/chain33/cmd/autotest/types"
)
//pub2priv case
type PubToPrivCase struct {
BaseCase
From string `toml:"from"`
To string `toml:"to"`
Amount string `toml:"amount"`
}
type PubToPrivPack struct {
BaseCasePack
}
func (testCase *PubToPrivCase) SendCommand(packID string) (PackFunc, error) {
return DefaultSend(testCase, &PubToPrivPack{}, packID)
}
func (pack *PubToPrivPack) GetCheckHandlerMap() interface{} {
funcMap := make(CheckHandlerMapDiscard, 2)
funcMap["balance"] = pack.checkBalance
funcMap["utxo"] = pack.checkUtxo
return funcMap
}
func (pack *PubToPrivPack) checkBalance(txInfo map[string]interface{}) bool {
interCase := pack.TCase.(*PubToPrivCase)
feeStr := txInfo["tx"].(map[string]interface{})["fee"].(string)
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
logFee := logArr[0].(map[string]interface{})["log"].(map[string]interface{})
logSend := logArr[1].(map[string]interface{})["log"].(map[string]interface{})
fee, _ := strconv.ParseFloat(feeStr, 64)
amount, _ := strconv.ParseFloat(interCase.Amount, 64)
pack.FLog.Info("Pub2PrivateDetails", "TestID", pack.PackID,
"Fee", feeStr, "Amount", interCase.Amount, "FromAddr", interCase.From,
"FromPrev", logSend["prev"].(map[string]interface{})["balance"].(string),
"FromCurr", logSend["current"].(map[string]interface{})["balance"].(string))
return CheckBalanceDeltaWithAddr(logFee, interCase.From, -fee) &&
CheckBalanceDeltaWithAddr(logSend, interCase.From, -amount)
}
func (pack *PubToPrivPack) checkUtxo(txInfo map[string]interface{}) bool {
interCase := pack.TCase.(*PubToPrivCase)
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
outputLog := logArr[2].(map[string]interface{})["log"].(map[string]interface{})
amount, _ := strconv.ParseFloat(interCase.Amount, 64)
//get available utxo with addr
availUtxo, err := CalcUtxoAvailAmount(interCase.To, pack.TxHash)
totalOutput := CalcTxUtxoAmount(outputLog, "keyoutput")
availCheck := IsBalanceEqualFloat(availUtxo, amount)
pack.FLog.Info("Pub2PrivateUtxoDetail", "TestID", pack.PackID,
"TransferAmount", interCase.Amount, "UtxoOutput", totalOutput,
"ToAddr", interCase.To, "UtxoAvailable", availUtxo, "CalcAvailErr", err)
return availCheck && IsBalanceEqualFloat(totalOutput, amount)
}
...@@ -6,6 +6,7 @@ package privacy ...@@ -6,6 +6,7 @@ package privacy
import ( import (
"github.com/33cn/chain33/pluginmgr" "github.com/33cn/chain33/pluginmgr"
_ "github.com/33cn/plugin/plugin/dapp/privacy/autotest"
"github.com/33cn/plugin/plugin/dapp/privacy/commands" "github.com/33cn/plugin/plugin/dapp/privacy/commands"
_ "github.com/33cn/plugin/plugin/dapp/privacy/crypto" _ "github.com/33cn/plugin/plugin/dapp/privacy/crypto"
"github.com/33cn/plugin/plugin/dapp/privacy/executor" "github.com/33cn/plugin/plugin/dapp/privacy/executor"
......
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package autotest
import (
"reflect"
. "github.com/33cn/chain33/cmd/autotest/types"
. "github.com/33cn/chain33/system/dapp/coins/autotest"
)
type tokenAutoTest struct {
SimpleCaseArr []SimpleCase `toml:"SimpleCase,omitempty"`
TokenPreCreateCaseArr []TokenPreCreateCase `toml:"TokenPreCreateCase,omitempty"`
TokenFinishCreateCaseArr []TokenFinishCreateCase `toml:"TokenFinishCreateCase,omitempty"`
TransferCaseArr []TransferCase `toml:"TransferCase,omitempty"`
WithdrawCaseArr []WithdrawCase `toml:"WithdrawCase,omitempty"`
TokenRevokeCaseArr []TokenRevokeCase `toml:"TokenRevokeCase,omitempty"`
}
func init() {
RegisterAutoTest(tokenAutoTest{})
}
func (config tokenAutoTest) GetName() string {
return "token"
}
func (config tokenAutoTest) GetTestConfigType() reflect.Type {
return reflect.TypeOf(config)
}
#import token test addr, 12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv
[[SimpleCase]]
id = "import1"
command = "account import_key -k 0xc21d38be90493512a5c2417d565269a8b23ce8152010e404ff4f75efead8183a -l token_test"
[[TokenPreCreateCase]]
id = "tokenPre"
command = "send token precreate -f 0.01 -i testToken -n testToken -s TC -a 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -t 100000 -p 1 -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
dep = ["transForPrecreate", "import1"]
[[TokenPreCreateCase]]
id = "tokenPre2"
command = "send token precreate -f 0.01 -i testToken -n testToken -s TCC -a 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -t 100000 -p 1 -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
dep = ["transForPrecreate"]
[[TokenFinishCreateCase]]
id = "tokenFinish"
command = "send token finish -a 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -f 0.01 -s TC -k 0xc34b5d9d44ac7b754806f761d3d4d2c4fe5214f6b074c19f069c4f5c2a29c8cc"
dep = ["tokenPre"]
#send to token for precreate
[[TransferCase]]
id = "transForPrecreate"
command = "send bty transfer -a 10 -t 12hpJBHybh1mSyCijQ2MQJPk7z7kZ7jnQa -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "12hpJBHybh1mSyCijQ2MQJPk7z7kZ7jnQa"
amount = "10"
checkItem = ["balance"]
[[TransferCase]]
id = "transForFee"
command = "send bty transfer -a 10 -t 12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
amount = "10"
checkItem = ["balance"]
[[TransferCase]]
id = "tokenTrans1"
command = "send token transfer -a 10 -s TC -t 12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
amount = "10"
checkItem = ["balance"]
repeat = 10
dep = ["tokenFinish"]
[[TransferCase]]
id = "tokenTrans2"
command = "send token transfer -a 1 -s TC -t 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -k 12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
from = "12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "1"
checkItem = ["balance"]
dep = ["tokenTrans1", "transForFee"]
[[TransferCase]]
id = "failTokenTrans"
command = "send token transfer -a 100 -s TC -t 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -k 12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
from = "12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "100"
checkItem = ["balance"]
dep = ["tokenTrans2"]
fail = true
#diposit to trade
[[TransferCase]]
id = "tokenDiposit1"
command = "send token transfer -a 5 -s TC -t 1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 -k 12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
from = "12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
to = "1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4"
amount = "5"
checkItem = ["balance"]
dep = ["tokenTrans1"]
[[WithdrawCase]]
id = "tokenWithdraw"
command = "send token withdraw -a 1 -s TC -e trade -k 12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
addr = "12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
amount = "1"
checkItem = ["balance"]
dep = ["tokenDiposit1"]
repeat = 4
[[WithdrawCase]]
id = "failTokenWithDraw"
command = "send token withdraw -a 5 -s TC -e trade -k 12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
addr = "12cjnN5D4DPdBQSwh6vjwJbtsW4EJALTMv"
amount = "5"
checkItem = ["balance"]
dep = ["tokenWithdraw"]
fail = true
#--liugui 2018.9.19--
[[TokenRevokeCase]]
id = "tokenRevoke"
command = "send token revoke -f 0.01 -s TCC -a 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
dep = ["tokenPre2"]
\ No newline at end of file
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package autotest
import (
. "github.com/33cn/chain33/cmd/autotest/types"
)
type TokenPreCreateCase struct {
BaseCase
//From string `toml:"from"`
//Amount string `toml:"amount"`
}
type TokenPreCreatePack struct {
BaseCasePack
}
type TokenFinishCreateCase struct {
BaseCase
//From string `toml:"from"`
//Amount string `toml:"amount"`
}
type TokenFinishCreatePack struct {
BaseCasePack
}
type TokenRevokeCase struct {
BaseCase
}
type TokenRevokePack struct {
BaseCasePack
}
func (testCase *TokenPreCreateCase) SendCommand(packID string) (PackFunc, error) {
return DefaultSend(testCase, &TokenPreCreatePack{}, packID)
}
func (testCase *TokenRevokeCase) SendCommand(packID string) (PackFunc, error) {
return DefaultSend(testCase, &TokenRevokePack{}, packID)
}
func (testCase *TokenFinishCreateCase) SendCommand(packID string) (PackFunc, error) {
return DefaultSend(testCase, &TokenFinishCreatePack{}, packID)
}
...@@ -6,6 +6,7 @@ package token ...@@ -6,6 +6,7 @@ package token
import ( import (
"github.com/33cn/chain33/pluginmgr" "github.com/33cn/chain33/pluginmgr"
_ "github.com/33cn/plugin/plugin/dapp/token/autotest"
"github.com/33cn/plugin/plugin/dapp/token/commands" "github.com/33cn/plugin/plugin/dapp/token/commands"
"github.com/33cn/plugin/plugin/dapp/token/executor" "github.com/33cn/plugin/plugin/dapp/token/executor"
"github.com/33cn/plugin/plugin/dapp/token/rpc" "github.com/33cn/plugin/plugin/dapp/token/rpc"
......
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package autotest
import (
"errors"
"fmt"
"strconv"
. "github.com/33cn/chain33/cmd/autotest/types"
)
type BuyCase struct {
BaseCase
From string `toml:"from"`
To string `toml:"to"`
TokenAmount string `toml:"tokenAmount"`
BtyAmount string `toml:"btyAmount"`
}
type BuyPack struct {
BaseCasePack
}
type DependBuyCase struct {
BuyCase
SellID string `toml:"sellID,omitempty"`
}
type DependBuyPack struct {
BuyPack
}
func (testCase *DependBuyCase) SendCommand(packID string) (PackFunc, error) {
if len(testCase.SellID) == 0 {
return nil, errors.New("depend sell case failed, Can't buy without sell id")
}
testCase.Command = fmt.Sprintf("%s -s %s", testCase.Command, testCase.SellID)
return DefaultSend(&testCase.BuyCase, &BuyPack{}, packID)
}
func (testCase *DependBuyCase) SetDependData(depData interface{}) {
if orderInfo, ok := depData.(*SellOrderInfo); ok && orderInfo != nil {
testCase.SellID = orderInfo.sellID
}
}
func (pack *BuyPack) GetCheckHandlerMap() interface{} {
funcMap := make(CheckHandlerMapDiscard, 2)
funcMap["frozen"] = pack.checkFrozen
funcMap["balance"] = pack.checkBalance
return funcMap
}
func (pack *BuyPack) checkBalance(txInfo map[string]interface{}) bool {
/*fromAddr := txInfo["tx"].(map[string]interface{})["from"].(string)
toAddr := txInfo["tx"].(map[string]interface{})["to"].(string)*/
feeStr := txInfo["tx"].(map[string]interface{})["fee"].(string)
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
interCase := pack.TCase.(*BuyCase)
logFee := logArr[0].(map[string]interface{})["log"].(map[string]interface{})
logBuyBty := logArr[1].(map[string]interface{})["log"].(map[string]interface{})
logSellBty := logArr[2].(map[string]interface{})["log"].(map[string]interface{})
logBuyToken := logArr[4].(map[string]interface{})["log"].(map[string]interface{})
fee, _ := strconv.ParseFloat(feeStr, 64)
tokenAmount, _ := strconv.ParseFloat(interCase.TokenAmount, 64)
btyAmount, _ := strconv.ParseFloat(interCase.BtyAmount, 64)
pack.FLog.Info("BuyBalanceDetails", "ID", pack.PackID,
"Fee", feeStr, "TokenAmount", interCase.TokenAmount, "BtyAmount", interCase.BtyAmount,
"SellerBtyPrev", logSellBty["prev"].(map[string]interface{})["balance"].(string),
"SellerBtyCurr", logSellBty["current"].(map[string]interface{})["balance"].(string),
"BuyerBtyPrev", logBuyBty["prev"].(map[string]interface{})["balance"].(string),
"BuyerBtyCurr", logBuyBty["current"].(map[string]interface{})["balance"].(string),
"BuyerTokenPrev", logBuyToken["prev"].(map[string]interface{})["balance"].(string),
"BuyerTokenCurr", logBuyToken["current"].(map[string]interface{})["balance"].(string))
return CheckBalanceDeltaWithAddr(logFee, interCase.From, -fee) &&
CheckBalanceDeltaWithAddr(logBuyBty, interCase.From, -btyAmount) &&
CheckBalanceDeltaWithAddr(logSellBty, interCase.To, btyAmount) &&
CheckBalanceDeltaWithAddr(logBuyToken, interCase.From, tokenAmount)
}
func (pack *BuyPack) checkFrozen(txInfo map[string]interface{}) bool {
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
interCase := pack.TCase.(*BuyCase)
logSellToken := logArr[3].(map[string]interface{})["log"].(map[string]interface{})
tokenAmount, _ := strconv.ParseFloat(interCase.TokenAmount, 64)
pack.FLog.Info("BuyFrozenDetails", "ID", pack.PackID,
"BuyTokenAmount", interCase.TokenAmount,
"SellerTokenPrev", logSellToken["prev"].(map[string]interface{})["frozen"].(string),
"SellerTokenCurr", logSellToken["current"].(map[string]interface{})["frozen"].(string))
return CheckFrozenDeltaWithAddr(logSellToken, interCase.To, -tokenAmount)
}
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package autotest
import (
"strconv"
. "github.com/33cn/chain33/cmd/autotest/types"
)
type SellCase struct {
BaseCase
From string `toml:"from"`
Amount string `toml:"amount"`
}
type SellPack struct {
BaseCasePack
orderInfo *SellOrderInfo
}
type SellOrderInfo struct {
sellID string
}
func (testCase *SellCase) SendCommand(packID string) (PackFunc, error) {
return DefaultSend(testCase, &SellPack{}, packID)
}
func (pack *SellPack) GetCheckHandlerMap() interface{} {
funcMap := make(CheckHandlerMapDiscard, 2)
funcMap["frozen"] = pack.checkFrozen
funcMap["balance"] = pack.checkBalance
return funcMap
}
func (pack *SellPack) GetDependData() interface{} {
return pack.orderInfo
}
func (pack *SellPack) checkBalance(txInfo map[string]interface{}) bool {
/*fromAddr := txInfo["tx"].(map[string]interface{})["from"].(string)
toAddr := txInfo["tx"].(map[string]interface{})["to"].(string)*/
feeStr := txInfo["tx"].(map[string]interface{})["fee"].(string)
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
interCase := pack.TCase.(*SellCase)
logFee := logArr[0].(map[string]interface{})["log"].(map[string]interface{})
logSend := logArr[1].(map[string]interface{})["log"].(map[string]interface{})
fee, _ := strconv.ParseFloat(feeStr, 64)
amount, _ := strconv.ParseFloat(interCase.Amount, 64)
pack.FLog.Info("SellBalanceDetails", "TestID", pack.PackID,
"Fee", feeStr, "SellAmount", interCase.Amount,
"SellerBalancePrev", logSend["prev"].(map[string]interface{})["balance"].(string),
"SellerBalanceCurr", logSend["current"].(map[string]interface{})["balance"].(string))
//save sell order info
sellOrderInfo := logArr[2].(map[string]interface{})["log"].(map[string]interface{})["base"].(map[string]interface{})
pack.orderInfo = &SellOrderInfo{}
pack.orderInfo.sellID = sellOrderInfo["sellID"].(string)
return CheckBalanceDeltaWithAddr(logFee, interCase.From, -fee) &&
CheckBalanceDeltaWithAddr(logSend, interCase.From, -amount)
}
func (pack *SellPack) checkFrozen(txInfo map[string]interface{}) bool {
logArr := txInfo["receipt"].(map[string]interface{})["logs"].([]interface{})
interCase := pack.TCase.(*SellCase)
logSend := logArr[1].(map[string]interface{})["log"].(map[string]interface{})
amount, _ := strconv.ParseFloat(interCase.Amount, 64)
pack.FLog.Info("SellFrozenDetails", "TestID", pack.PackID,
"SellAmount", interCase.Amount,
"SellerFrozenPrev", logSend["prev"].(map[string]interface{})["frozen"].(string),
"SellerFrozenCurr", logSend["current"].(map[string]interface{})["frozen"].(string))
return CheckFrozenDeltaWithAddr(logSend, interCase.From, amount)
}
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package autotest
import (
"reflect"
. "github.com/33cn/chain33/cmd/autotest/types"
. "github.com/33cn/chain33/system/dapp/coins/autotest"
. "github.com/33cn/plugin/plugin/dapp/token/autotest"
)
type tradeAutoTest struct {
SimpleCaseArr []SimpleCase `toml:"SimpleCase,omitempty"`
TokenPreCreateCaseArr []TokenPreCreateCase `toml:"TokenPreCreateCase,omitempty"`
TokenFinishCreateCaseArr []TokenFinishCreateCase `toml:"TokenFinishCreateCase,omitempty"`
TransferCaseArr []TransferCase `toml:"TransferCase,omitempty"`
SellCaseArr []SellCase `toml:"SellCase,omitempty"`
DependBuyCaseArr []DependBuyCase `toml:"DependBuyCase,omitempty"`
}
func init() {
RegisterAutoTest(tradeAutoTest{})
}
func (config tradeAutoTest) GetName() string {
return "trade"
}
func (config tradeAutoTest) GetTestConfigType() reflect.Type {
return reflect.TypeOf(config)
}
#import trade test addr, 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH
[[SimpleCase]]
id = "import1"
command = "account import_key -k 0xfdf2bbff853ecff2e7b86b2a8b45726c6538ca7d1403dc94e50131ef379bdca0 -l trade_test"
[[TokenPreCreateCase]]
id = "tokenPre"
command = "send token precreate -f 0.01 -i testToken -n testToken -s TS -a 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -t 100000 -p 1 -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
dep = ["transForPrecreate", "import1"]
[[TokenFinishCreateCase]]
id = "tokenFinish"
command = "send token finish -a 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -f 0.01 -s TS -k 0xc34b5d9d44ac7b754806f761d3d4d2c4fe5214f6b074c19f069c4f5c2a29c8cc"
dep = ["tokenPre"]
#send to token for precreate
[[TransferCase]]
id = "transForPrecreate"
command = "send bty transfer -a 10 -t 12hpJBHybh1mSyCijQ2MQJPk7z7kZ7jnQa -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "12hpJBHybh1mSyCijQ2MQJPk7z7kZ7jnQa"
amount = "10"
checkItem = ["balance"]
[[TransferCase]]
id = "transForFee"
command = "send bty transfer -a 100 -t 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
amount = "100"
checkItem = ["balance"]
dep = ["import1"]
#prepare bty for trade sell and buy
[[TransferCase]]
id = "btyToTrade"
command = "send bty transfer -a 7 -t 1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 -k 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
from = "1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
to = "1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4"
amount = "7"
checkItem = ["balance"]
dep = ["transForFee"]
[[TransferCase]]
id = "tokenToTrade"
command = "send token transfer -a 50 -s TS -t 1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4 -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
to = "1BXvgjmBw1aBgmGn1hjfGyRkmN3krWpFP4"
amount = "50"
checkItem = ["balance"]
dep = ["tokenFinish", "btyToTrade"]
#token sell case
[[SellCase]]
id = "tokenSell1"
command = "send trade sell -f 0.01 -m 100 -p 0.01 -t 10 -s TS -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "10"
checkItem = ["balance", "frozen"]
dep = ["tokenToTrade"]
[[SellCase]]
id = "tokenSell2"
command = "send trade sell -f 0.01 -m 100 -p 0.01 -t 1 -s TS -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "1"
checkItem = ["balance", "frozen"]
dep = ["tokenToTrade"]
[[SellCase]]
id = "tokenSell3"
command = "send trade sell -f 0.01 -m 100 -p 0.01 -t 10 -s TS -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "10"
checkItem = ["balance", "frozen"]
dep = ["tokenToTrade"]
#no balance
[[SellCase]]
id = "failSell"
command = "send trade sell -f 0.01 -m 100 -p 0.01 -t 100 -s TS -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
from = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
amount = "100"
checkItem = ["balance", "frozen"]
fail = true
#因trade购买需要指定sellID, DependBuyCase自动获取由dep指定SellCase的sellID
[[DependBuyCase]]
id = "tokenBuy"
command = "send trade buy -c 100 -f 0.01 -k 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
from = "1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
btyAmount = "1"
tokenAmount = "1"
checkItem = ["balance", "frozen"]
dep = ["tokenSell1"]
repeat = 5
#不满足最少份数
[[DependBuyCase]]
id = "failBuy1"
command = "send trade buy -c 90 -f 0.01 -k 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
from = "1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
btyAmount = "0.9"
tokenAmount = "0.9"
checkItem = ["balance", "frozen"]
dep = ["tokenSell1"]
fail = true
#剩余正在sell的不够
[[DependBuyCase]]
id = "failBuy2"
command = "send trade buy -c 200 -f 0.01 -k 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
from = "1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
btyAmount = "2"
tokenAmount = "2"
checkItem = ["balance", "frozen"]
dep = ["tokenSell2"]
fail = true
#bty余额不足
[[DependBuyCase]]
id = "failBuy3"
command = "send trade buy -c 800 -f 0.01 -k 1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
from = "1Luh4AziYyaC5zP3hUXtXFZS873xAxm6rH"
to = "12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
btyAmount = "8"
tokenAmount = "8"
checkItem = ["balance", "frozen"]
dep = ["tokenSell3"]
fail = true
...@@ -6,6 +6,7 @@ package trade ...@@ -6,6 +6,7 @@ package trade
import ( import (
"github.com/33cn/chain33/pluginmgr" "github.com/33cn/chain33/pluginmgr"
_ "github.com/33cn/plugin/plugin/dapp/trade/autotest"
"github.com/33cn/plugin/plugin/dapp/trade/commands" "github.com/33cn/plugin/plugin/dapp/trade/commands"
"github.com/33cn/plugin/plugin/dapp/trade/executor" "github.com/33cn/plugin/plugin/dapp/trade/executor"
"github.com/33cn/plugin/plugin/dapp/trade/rpc" "github.com/33cn/plugin/plugin/dapp/trade/rpc"
......
...@@ -7,5 +7,6 @@ package kvmvccdb ...@@ -7,5 +7,6 @@ package kvmvccdb
import "errors" import "errors"
var ( var (
//ErrStateHashLost means err happened when query with StateHash
ErrStateHashLost = errors.New("ErrStateHashLost") ErrStateHashLost = errors.New("ErrStateHashLost")
) )
...@@ -18,10 +18,12 @@ import ( ...@@ -18,10 +18,12 @@ import (
var klog = log.New("module", "kvmvccdb") var klog = log.New("module", "kvmvccdb")
var maxRollbackNum = 200 var maxRollbackNum = 200
// SetLogLevel set log level
func SetLogLevel(level string) { func SetLogLevel(level string) {
clog.SetLogLevel(level) clog.SetLogLevel(level)
} }
// DisableLog disable log output
func DisableLog() { func DisableLog() {
klog.SetHandler(log.DiscardHandler()) klog.SetHandler(log.DiscardHandler())
} }
...@@ -30,6 +32,7 @@ func init() { ...@@ -30,6 +32,7 @@ func init() {
drivers.Reg("kvmvcc", New) drivers.Reg("kvmvcc", New)
} }
// KVMVCCStore provide kvmvcc store interface implementation
type KVMVCCStore struct { type KVMVCCStore struct {
*drivers.BaseStore *drivers.BaseStore
mvcc dbm.MVCC mvcc dbm.MVCC
...@@ -41,6 +44,7 @@ type subConfig struct { ...@@ -41,6 +44,7 @@ type subConfig struct {
EnableMVCCIter bool `json:"enableMVCCIter"` EnableMVCCIter bool `json:"enableMVCCIter"`
} }
// New construct KVMVCCStore module
func New(cfg *types.Store, sub []byte) queue.Module { func New(cfg *types.Store, sub []byte) queue.Module {
bs := drivers.NewBaseStore(cfg) bs := drivers.NewBaseStore(cfg)
var kvs *KVMVCCStore var kvs *KVMVCCStore
...@@ -59,11 +63,13 @@ func New(cfg *types.Store, sub []byte) queue.Module { ...@@ -59,11 +63,13 @@ func New(cfg *types.Store, sub []byte) queue.Module {
return kvs return kvs
} }
// Close the KVMVCCStore module
func (mvccs *KVMVCCStore) Close() { func (mvccs *KVMVCCStore) Close() {
mvccs.BaseStore.Close() mvccs.BaseStore.Close()
klog.Info("store kvdb closed") klog.Info("store kvdb closed")
} }
// Set kvs with statehash to KVMVCCStore
func (mvccs *KVMVCCStore) Set(datas *types.StoreSet, sync bool) ([]byte, error) { func (mvccs *KVMVCCStore) Set(datas *types.StoreSet, sync bool) ([]byte, error) {
hash := calcHash(datas) hash := calcHash(datas)
kvlist, err := mvccs.mvcc.AddMVCC(datas.KV, hash, datas.StateHash, datas.Height) kvlist, err := mvccs.mvcc.AddMVCC(datas.KV, hash, datas.StateHash, datas.Height)
...@@ -74,6 +80,7 @@ func (mvccs *KVMVCCStore) Set(datas *types.StoreSet, sync bool) ([]byte, error) ...@@ -74,6 +80,7 @@ func (mvccs *KVMVCCStore) Set(datas *types.StoreSet, sync bool) ([]byte, error)
return hash, nil return hash, nil
} }
// Get kvs with statehash from KVMVCCStore
func (mvccs *KVMVCCStore) Get(datas *types.StoreGet) [][]byte { func (mvccs *KVMVCCStore) Get(datas *types.StoreGet) [][]byte {
values := make([][]byte, len(datas.Keys)) values := make([][]byte, len(datas.Keys))
version, err := mvccs.mvcc.GetVersion(datas.StateHash) version, err := mvccs.mvcc.GetVersion(datas.StateHash)
...@@ -92,6 +99,7 @@ func (mvccs *KVMVCCStore) Get(datas *types.StoreGet) [][]byte { ...@@ -92,6 +99,7 @@ func (mvccs *KVMVCCStore) Get(datas *types.StoreGet) [][]byte {
return values return values
} }
// MemSet set kvs to the mem of KVMVCCStore module and return the StateHash
func (mvccs *KVMVCCStore) MemSet(datas *types.StoreSet, sync bool) ([]byte, error) { func (mvccs *KVMVCCStore) MemSet(datas *types.StoreSet, sync bool) ([]byte, error) {
kvset, err := mvccs.checkVersion(datas.Height) kvset, err := mvccs.checkVersion(datas.Height)
if err != nil { if err != nil {
...@@ -110,6 +118,7 @@ func (mvccs *KVMVCCStore) MemSet(datas *types.StoreSet, sync bool) ([]byte, erro ...@@ -110,6 +118,7 @@ func (mvccs *KVMVCCStore) MemSet(datas *types.StoreSet, sync bool) ([]byte, erro
return hash, nil return hash, nil
} }
// Commit kvs in the mem of KVMVCCStore module to state db and return the StateHash
func (mvccs *KVMVCCStore) Commit(req *types.ReqHash) ([]byte, error) { func (mvccs *KVMVCCStore) Commit(req *types.ReqHash) ([]byte, error) {
_, ok := mvccs.kvsetmap[string(req.Hash)] _, ok := mvccs.kvsetmap[string(req.Hash)]
if !ok { if !ok {
...@@ -122,6 +131,7 @@ func (mvccs *KVMVCCStore) Commit(req *types.ReqHash) ([]byte, error) { ...@@ -122,6 +131,7 @@ func (mvccs *KVMVCCStore) Commit(req *types.ReqHash) ([]byte, error) {
return req.Hash, nil return req.Hash, nil
} }
// Rollback kvs in the mem of KVMVCCStore module and return the StateHash
func (mvccs *KVMVCCStore) Rollback(req *types.ReqHash) ([]byte, error) { func (mvccs *KVMVCCStore) Rollback(req *types.ReqHash) ([]byte, error) {
_, ok := mvccs.kvsetmap[string(req.Hash)] _, ok := mvccs.kvsetmap[string(req.Hash)]
if !ok { if !ok {
...@@ -135,6 +145,7 @@ func (mvccs *KVMVCCStore) Rollback(req *types.ReqHash) ([]byte, error) { ...@@ -135,6 +145,7 @@ func (mvccs *KVMVCCStore) Rollback(req *types.ReqHash) ([]byte, error) {
return req.Hash, nil return req.Hash, nil
} }
// IterateRangeByStateHash travel with Prefix by StateHash to get the latest version kvs.
func (mvccs *KVMVCCStore) IterateRangeByStateHash(statehash []byte, start []byte, end []byte, ascending bool, fn func(key, value []byte) bool) { func (mvccs *KVMVCCStore) IterateRangeByStateHash(statehash []byte, start []byte, end []byte, ascending bool, fn func(key, value []byte) bool) {
if !mvccs.enableMVCCIter { if !mvccs.enableMVCCIter {
panic("call IterateRangeByStateHash when disable mvcc iter") panic("call IterateRangeByStateHash when disable mvcc iter")
...@@ -162,10 +173,12 @@ func (mvccs *KVMVCCStore) IterateRangeByStateHash(statehash []byte, start []byte ...@@ -162,10 +173,12 @@ func (mvccs *KVMVCCStore) IterateRangeByStateHash(statehash []byte, start []byte
listhelper.IteratorCallback(start, end, 0, 1, fn) listhelper.IteratorCallback(start, end, 0, 1, fn)
} }
// ProcEvent handles supported events
func (mvccs *KVMVCCStore) ProcEvent(msg queue.Message) { func (mvccs *KVMVCCStore) ProcEvent(msg queue.Message) {
msg.ReplyErr("KVStore", types.ErrActionNotSupport) msg.ReplyErr("KVStore", types.ErrActionNotSupport)
} }
// Del set kvs to nil with StateHash
func (mvccs *KVMVCCStore) Del(req *types.StoreDel) ([]byte, error) { func (mvccs *KVMVCCStore) Del(req *types.StoreDel) ([]byte, error) {
kvset, err := mvccs.mvcc.DelMVCC(req.StateHash, req.Height, true) kvset, err := mvccs.mvcc.DelMVCC(req.StateHash, req.Height, true)
if err != nil { if err != nil {
......
...@@ -35,8 +35,8 @@ func TestKvmvccdbNewClose(t *testing.T) { ...@@ -35,8 +35,8 @@ func TestKvmvccdbNewClose(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(t, store) assert.NotNil(t, store)
store.Close() store.Close()
...@@ -47,8 +47,8 @@ func TestKvmvccdbSetGet(t *testing.T) { ...@@ -47,8 +47,8 @@ func TestKvmvccdbSetGet(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(t, store) assert.NotNil(t, store)
keys0 := [][]byte{[]byte("mk1"), []byte("mk2")} keys0 := [][]byte{[]byte("mk1"), []byte("mk2")}
...@@ -93,8 +93,8 @@ func TestKvmvccdbMemSet(t *testing.T) { ...@@ -93,8 +93,8 @@ func TestKvmvccdbMemSet(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(t, store) assert.NotNil(t, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -131,8 +131,8 @@ func TestKvmvccdbRollback(t *testing.T) { ...@@ -131,8 +131,8 @@ func TestKvmvccdbRollback(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(t, store) assert.NotNil(t, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -164,8 +164,8 @@ func TestKvmvccdbRollbackBatch(t *testing.T) { ...@@ -164,8 +164,8 @@ func TestKvmvccdbRollbackBatch(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(t, store) assert.NotNil(t, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -260,8 +260,8 @@ func TestIterateRangeByStateHash(t *testing.T) { ...@@ -260,8 +260,8 @@ func TestIterateRangeByStateHash(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
store_cfg, sub := newStoreCfgIter(dir) storeCfg, sub := newStoreCfgIter(dir)
store := New(store_cfg, sub).(*KVMVCCStore) store := New(storeCfg, sub).(*KVMVCCStore)
assert.NotNil(t, store) assert.NotNil(t, store)
execaddr := "0111vcBNSEA7fZhAdLJphDwQRQJa111" execaddr := "0111vcBNSEA7fZhAdLJphDwQRQJa111"
...@@ -406,8 +406,8 @@ func BenchmarkGet(b *testing.B) { ...@@ -406,8 +406,8 @@ func BenchmarkGet(b *testing.B) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -429,7 +429,7 @@ func BenchmarkGet(b *testing.B) { ...@@ -429,7 +429,7 @@ func BenchmarkGet(b *testing.B) {
datas := &types.StoreSet{hash, kv, 0} datas := &types.StoreSet{hash, kv, 0}
hash, err = store.Set(datas, true) hash, err = store.Set(datas, true)
assert.Nil(b, err) assert.Nil(b, err)
kv = nil //kv = nil
} }
assert.Nil(b, err) assert.Nil(b, err)
start := time.Now() start := time.Now()
...@@ -450,8 +450,8 @@ func BenchmarkStoreGetKvs4N(b *testing.B) { ...@@ -450,8 +450,8 @@ func BenchmarkStoreGetKvs4N(b *testing.B) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -495,8 +495,8 @@ func BenchmarkStoreGetKvsForNN(b *testing.B) { ...@@ -495,8 +495,8 @@ func BenchmarkStoreGetKvsForNN(b *testing.B) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -555,8 +555,8 @@ func BenchmarkStoreGetKvsFor10000(b *testing.B) { ...@@ -555,8 +555,8 @@ func BenchmarkStoreGetKvsFor10000(b *testing.B) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -620,8 +620,8 @@ func BenchmarkGetIter(b *testing.B) { ...@@ -620,8 +620,8 @@ func BenchmarkGetIter(b *testing.B) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
store_cfg, sub := newStoreCfgIter(dir) storeCfg, sub := newStoreCfgIter(dir)
store := New(store_cfg, sub).(*KVMVCCStore) store := New(storeCfg, sub).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -643,7 +643,7 @@ func BenchmarkGetIter(b *testing.B) { ...@@ -643,7 +643,7 @@ func BenchmarkGetIter(b *testing.B) {
datas := &types.StoreSet{hash, kv, 0} datas := &types.StoreSet{hash, kv, 0}
hash, err = store.Set(datas, true) hash, err = store.Set(datas, true)
assert.Nil(b, err) assert.Nil(b, err)
kv = nil //kv = nil
} }
assert.Nil(b, err) assert.Nil(b, err)
start := time.Now() start := time.Now()
...@@ -663,8 +663,8 @@ func BenchmarkSet(b *testing.B) { ...@@ -663,8 +663,8 @@ func BenchmarkSet(b *testing.B) {
assert.Nil(b, err) assert.Nil(b, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
b.Log(dir) b.Log(dir)
...@@ -686,9 +686,9 @@ func BenchmarkSet(b *testing.B) { ...@@ -686,9 +686,9 @@ func BenchmarkSet(b *testing.B) {
} }
if kv != nil { if kv != nil {
datas := &types.StoreSet{hash, kv, 0} datas := &types.StoreSet{hash, kv, 0}
hash, err = store.Set(datas, true) _, err = store.Set(datas, true)
assert.Nil(b, err) assert.Nil(b, err)
kv = nil //kv = nil
} }
end := time.Now() end := time.Now()
fmt.Println("mpt BenchmarkSet cost time is", end.Sub(start), "num is", b.N) fmt.Println("mpt BenchmarkSet cost time is", end.Sub(start), "num is", b.N)
...@@ -700,8 +700,8 @@ func BenchmarkStoreSet(b *testing.B) { ...@@ -700,8 +700,8 @@ func BenchmarkStoreSet(b *testing.B) {
assert.Nil(b, err) assert.Nil(b, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -735,8 +735,8 @@ func BenchmarkSetIter(b *testing.B) { ...@@ -735,8 +735,8 @@ func BenchmarkSetIter(b *testing.B) {
assert.Nil(b, err) assert.Nil(b, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
store_cfg, sub := newStoreCfgIter(dir) storeCfg, sub := newStoreCfgIter(dir)
store := New(store_cfg, sub).(*KVMVCCStore) store := New(storeCfg, sub).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
b.Log(dir) b.Log(dir)
...@@ -758,9 +758,9 @@ func BenchmarkSetIter(b *testing.B) { ...@@ -758,9 +758,9 @@ func BenchmarkSetIter(b *testing.B) {
} }
if kv != nil { if kv != nil {
datas := &types.StoreSet{hash, kv, 0} datas := &types.StoreSet{hash, kv, 0}
hash, err = store.Set(datas, true) _, err = store.Set(datas, true)
assert.Nil(b, err) assert.Nil(b, err)
kv = nil //kv = nil
} }
end := time.Now() end := time.Now()
fmt.Println("kvmvcc BenchmarkSet cost time is", end.Sub(start), "num is", b.N) fmt.Println("kvmvcc BenchmarkSet cost time is", end.Sub(start), "num is", b.N)
...@@ -771,11 +771,9 @@ func isDirExists(path string) bool { ...@@ -771,11 +771,9 @@ func isDirExists(path string) bool {
if err != nil { if err != nil {
return os.IsExist(err) return os.IsExist(err)
} else {
return fi.IsDir()
} }
panic("not reached") return fi.IsDir()
} }
//一次设定多对kv,测试一次的时间/多少对kv,来算平均一对kv的耗时。 //一次设定多对kv,测试一次的时间/多少对kv,来算平均一对kv的耗时。
...@@ -784,8 +782,8 @@ func BenchmarkMemSet(b *testing.B) { ...@@ -784,8 +782,8 @@ func BenchmarkMemSet(b *testing.B) {
assert.Nil(b, err) assert.Nil(b, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -818,8 +816,8 @@ func BenchmarkStoreMemSet(b *testing.B) { ...@@ -818,8 +816,8 @@ func BenchmarkStoreMemSet(b *testing.B) {
assert.Nil(b, err) assert.Nil(b, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -856,8 +854,8 @@ func BenchmarkCommit(b *testing.B) { ...@@ -856,8 +854,8 @@ func BenchmarkCommit(b *testing.B) {
assert.Nil(b, err) assert.Nil(b, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -897,8 +895,8 @@ func BenchmarkStoreCommit(b *testing.B) { ...@@ -897,8 +895,8 @@ func BenchmarkStoreCommit(b *testing.B) {
assert.Nil(b, err) assert.Nil(b, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var store_cfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(store_cfg, nil).(*KVMVCCStore) store := New(storeCfg, nil).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -941,8 +939,8 @@ func BenchmarkIterMemSet(b *testing.B) { ...@@ -941,8 +939,8 @@ func BenchmarkIterMemSet(b *testing.B) {
assert.Nil(b, err) assert.Nil(b, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
store_cfg, sub := newStoreCfgIter(dir) storeCfg, sub := newStoreCfgIter(dir)
store := New(store_cfg, sub).(*KVMVCCStore) store := New(storeCfg, sub).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -974,8 +972,8 @@ func BenchmarkIterCommit(b *testing.B) { ...@@ -974,8 +972,8 @@ func BenchmarkIterCommit(b *testing.B) {
assert.Nil(b, err) assert.Nil(b, err)
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
store_cfg, sub := newStoreCfgIter(dir) storeCfg, sub := newStoreCfgIter(dir)
store := New(store_cfg, sub).(*KVMVCCStore) store := New(storeCfg, sub).(*KVMVCCStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
......
...@@ -186,7 +186,7 @@ func BenchmarkGet(b *testing.B) { ...@@ -186,7 +186,7 @@ func BenchmarkGet(b *testing.B) {
datas := &types.StoreSet{hash, kv, 0} datas := &types.StoreSet{hash, kv, 0}
hash, err = store.Set(datas, true) hash, err = store.Set(datas, true)
assert.Nil(b, err) assert.Nil(b, err)
kv = nil //kv = nil
} }
start := time.Now() start := time.Now()
b.ResetTimer() b.ResetTimer()
...@@ -227,9 +227,9 @@ func BenchmarkSet(b *testing.B) { ...@@ -227,9 +227,9 @@ func BenchmarkSet(b *testing.B) {
} }
if kv != nil { if kv != nil {
datas := &types.StoreSet{hash, kv, 0} datas := &types.StoreSet{hash, kv, 0}
hash, err = store.Set(datas, true) _, err = store.Set(datas, true)
assert.Nil(b, err) assert.Nil(b, err)
kv = nil //kv = nil
} }
end := time.Now() end := time.Now()
fmt.Println("mpt BenchmarkSet cost time is", end.Sub(start), "num is", b.N) fmt.Println("mpt BenchmarkSet cost time is", end.Sub(start), "num is", b.N)
......
language: go language: go
go_import_path: github.com/33cn/chain33 go_import_path: github.com/33cn/chain33
sudo: false
os: linux
dist: xenial
notifications: notifications:
email: false email: false
jobs: jobs:
include: include:
- stage: test - stage: check_fmt
sudo: require sudo: require
go:
- "1.9"
- master
install: install:
- go get -u golang.org/x/tools/cmd/goimports - go get -u golang.org/x/tools/cmd/goimports
- go get -u gopkg.in/alecthomas/gometalinter.v2 - go get -u gopkg.in/alecthomas/gometalinter.v2
- gometalinter.v2 -i - gometalinter.v2 -i
- go get -u mvdan.cc/sh/cmd/shfmt - go get -u mvdan.cc/sh/cmd/shfmt
- go get -u mvdan.cc/sh/cmd/gosh - go get -u mvdan.cc/sh/cmd/gosh
os: linux
dist: xenial
go:
- "1.9"
- master
script: script:
- make checkgofmt - make checkgofmt && make fmt_go
- make fmt_go
- make linter - make linter
- stage: unit-test
go: "1.9.x"
install: skip
script:
- make test - make test
- stage: coverage
if: branch = master
go:
- "1.9.x"
before_install:
- go get -t -v ./...
install: skip
script:
- make coverage
after_success:
- bash <(curl -s https://codecov.io/bash)
- stage: deploy
sudo: required
services:
- docker
env:
- DOCKER_COMPOSE_VERSION=1.21.2
install:
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- sudo apt-get update
- sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce
- sudo rm /usr/local/bin/docker-compose
- curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
- chmod +x docker-compose
- sudo mv docker-compose /usr/local/bin
script:
- make build_ci
- make autotest_ci
- make docker-compose && make docker-compose-down
...@@ -16,7 +16,6 @@ SIGNATORY := build/signatory-server ...@@ -16,7 +16,6 @@ SIGNATORY := build/signatory-server
MINER := build/miner_accounts MINER := build/miner_accounts
AUTOTEST := build/autotest/autotest AUTOTEST := build/autotest/autotest
SRC_AUTOTEST := github.com/33cn/chain33/cmd/autotest SRC_AUTOTEST := github.com/33cn/chain33/cmd/autotest
SRC_AUTOTEST_PLUGIN := github.com/33cn/plugin/vendor/github.com/33cn/chain33/cmd/autotest/pluginversion
LDFLAGS := -ldflags "-w -s" LDFLAGS := -ldflags "-w -s"
PKG_LIST := `go list ./... | grep -v "vendor" | grep -v "chain33/test" | grep -v "mocks" | grep -v "pbft"` PKG_LIST := `go list ./... | grep -v "vendor" | grep -v "chain33/test" | grep -v "mocks" | grep -v "pbft"`
PKG_LIST_Q := `go list ./... | grep -v "vendor" | grep -v "chain33/test" | grep -v "mocks" | grep -v "blockchain" | grep -v "pbft"` PKG_LIST_Q := `go list ./... | grep -v "vendor" | grep -v "chain33/test" | grep -v "mocks" | grep -v "blockchain" | grep -v "pbft"`
...@@ -67,12 +66,8 @@ para: ...@@ -67,12 +66,8 @@ para:
@go build -v -o build/$(NAME) -ldflags "-X $(SRC_CLI)/buildflags.ParaName=user.p.$(NAME). -X $(SRC_CLI)/buildflags.RPCAddr=http://localhost:8901" $(SRC_CLI) @go build -v -o build/$(NAME) -ldflags "-X $(SRC_CLI)/buildflags.ParaName=user.p.$(NAME). -X $(SRC_CLI)/buildflags.RPCAddr=http://localhost:8901" $(SRC_CLI)
autotest:## build autotest binary, prior build plugin version autotest:## build autotest binary
@if [ -d $(GOPATH)/src/$(SRC_AUTOTEST_PLUGIN) ]; then \ @go build -v -i -o $(AUTOTEST) $(SRC_AUTOTEST)
go build -v -i -o $(AUTOTEST) $(SRC_AUTOTEST_PLUGIN);\
else \
go build -v -i -o $(AUTOTEST) $(SRC_AUTOTEST);\
fi;
@if [ -n "$(dapp)" ]; then \ @if [ -n "$(dapp)" ]; then \
cd build/autotest && bash ./copy-autotest.sh local && cd local && bash ./local-autotest.sh $(dapp) && cd ../../../; \ cd build/autotest && bash ./copy-autotest.sh local && cd local && bash ./local-autotest.sh $(dapp) && cd ../../../; \
fi fi
...@@ -150,10 +145,10 @@ msan: ## Run memory sanitizer ...@@ -150,10 +145,10 @@ msan: ## Run memory sanitizer
@go test -msan -short $(PKG_LIST) @go test -msan -short $(PKG_LIST)
coverage: ## Generate global code coverage report coverage: ## Generate global code coverage report
@./build/tools/coverage.sh; @./build/tools/coverage.sh
coverhtml: ## Generate global code coverage report in HTML coverhtml: ## Generate global code coverage report in HTML
@./build/tools/coverage.sh html; @./build/tools/coverage.sh html
docker: ## build docker image for chain33 run docker: ## build docker image for chain33 run
@sudo docker build . -f ./build/Dockerfile-run -t chain33:latest @sudo docker build . -f ./build/Dockerfile-run -t chain33:latest
......
...@@ -4,6 +4,7 @@ https://camo.githubusercontent.com/915b7be44ada53c290eb157634330494ebe3e30a/6874 ...@@ -4,6 +4,7 @@ https://camo.githubusercontent.com/915b7be44ada53c290eb157634330494ebe3e30a/6874
[![pipeline status](https://api.travis-ci.org/33cn/chain33.svg?branch=master)](https://travis-ci.org/33cn/chain33/) [![pipeline status](https://api.travis-ci.org/33cn/chain33.svg?branch=master)](https://travis-ci.org/33cn/chain33/)
[![Go Report Card](https://goreportcard.com/badge/github.com/33cn/chain33)](https://goreportcard.com/report/github.com/33cn/chain33) [![Go Report Card](https://goreportcard.com/badge/github.com/33cn/chain33)](https://goreportcard.com/report/github.com/33cn/chain33)
[![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/33cn/chain33?svg=true&branch=master&passingText=Windows%20-%20OK&failingText=Windows%20-%20failed&pendingText=Windows%20-%20pending)](https://ci.appveyor.com/project/33cn/chain33) [![Windows Build Status](https://ci.appveyor.com/api/projects/status/github/33cn/chain33?svg=true&branch=master&passingText=Windows%20-%20OK&failingText=Windows%20-%20failed&pendingText=Windows%20-%20pending)](https://ci.appveyor.com/project/33cn/chain33)
[![codecov](https://codecov.io/gh/33cn/chain33/branch/master/graph/badge.svg)](https://codecov.io/gh/33cn/chain33) [![Join the chat at https://gitter.im/33cn/Lobby](https://badges.gitter.im/33cn/Lobby.svg)](https://gitter.im/33cn/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
# Chain33 区块链开发框架 # Chain33 区块链开发框架
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
package account package account
import ( import (
"fmt"
"testing" "testing"
"github.com/33cn/chain33/client" "github.com/33cn/chain33/client"
...@@ -140,8 +139,8 @@ func storeProcess(q queue.Queue) { ...@@ -140,8 +139,8 @@ func storeProcess(q queue.Queue) {
for msg := range client.Recv() { for msg := range client.Recv() {
switch msg.Ty { switch msg.Ty {
case types.EventStoreGet: case types.EventStoreGet:
datas := msg.GetData().(*types.StoreGet) //datas := msg.GetData().(*types.StoreGet)
fmt.Println("EventStoreGet data = %v", datas) //fmt.Println("EventStoreGet data = %v", datas)
values := make([][]byte, 2) values := make([][]byte, 2)
account := &types.Account{ account := &types.Account{
......
...@@ -8,7 +8,7 @@ set -o pipefail ...@@ -8,7 +8,7 @@ set -o pipefail
# os: ubuntu16.04 x64 # os: ubuntu16.04 x64
#chain33 dapp autotest root directory #chain33 dapp autotest root directory
declare -a Chain33AutoTestDirs=("system" "../plugin/plugin" "vendor/github.com/33cn/chain33/system") declare -a Chain33AutoTestDirs=("system" "plugin" "vendor/github.com/33cn/chain33/system")
#copy auto test to specific directory #copy auto test to specific directory
# check args # check args
...@@ -63,9 +63,9 @@ function copyAutoTestConfig() { ...@@ -63,9 +63,9 @@ function copyAutoTestConfig() {
function copyChain33() { function copyChain33() {
echo "# copy chain33 bin to path \"$1\"" echo "# copy chain33 bin to path \"$1\", make sure build chain33"
cp ../chain33 ../chain33-cli ../chain33.toml ../../cmd/chain33/chain33.test.toml "$1" cp ../chain33 ../chain33-cli ../chain33.toml "$1"
find ../../ -path '*cmd/chain33/chain33.test.toml' -exec cp {} "$1" ';'
} }
for dir in "$@"; do for dir in "$@"; do
......
...@@ -63,17 +63,6 @@ function config_autotest() { ...@@ -63,17 +63,6 @@ function config_autotest() {
echo "# config autotest" echo "# config autotest"
sed -i $sedfix 's/^checkTimeout.*/checkTimeout='${autoTestCheckTimeout}'/' ${autoTestConfig} sed -i $sedfix 's/^checkTimeout.*/checkTimeout='${autoTestCheckTimeout}'/' ${autoTestConfig}
#only run coins if it is chain33
if [ -d ../../../../system/dapp/coins/autotest ]; then
{
echo 'cliCmd="./chain33-cli"'
echo "checkTimeout=${autoTestCheckTimeout}"
echo "[[TestCaseFile]]"
echo 'dapp="coins"'
echo 'filename="coins.toml"'
} >${autoTestConfig}
fi
} }
function start_chain33() { function start_chain33() {
......
...@@ -4,8 +4,9 @@ ...@@ -4,8 +4,9 @@
set -e -o pipefail set -e -o pipefail
COVERAGE_DIR="${COVERAGE_DIR:-build/coverage}" COVERAGE_DIR="${COVERAGE_DIR:-build/coverage}"
PKG_LIST=$(go list ./... | grep -v "vendor" | grep -v "chain33/test" | grep -v "mock" | grep -v "mocks" \ PKG_LIST=$(go list ./... | grep -v "vendor" | grep -v "mock" | grep -v "mocks" \
| grep -v "types" | grep -v "cmd" | grep -v "nat" | grep -v "pbft") | grep -v "cmd" | grep -v "nat" | grep -v "pbft")
# Create the coverage files directory # Create the coverage files directory
mkdir -p "$COVERAGE_DIR" mkdir -p "$COVERAGE_DIR"
......
...@@ -33,7 +33,7 @@ $ make autotest dapp="coins token" ...@@ -33,7 +33,7 @@ $ make autotest dapp="coins token"
//dapp=all,执行所有预配置用例 //dapp=all,执行所有预配置用例
$ make autotest dapp=all $ make autotest dapp=all
``` ```
目前autotest支持的dapp有,bty(coins) token trade privacy,后续有待扩展 目前autotest支持的dapp有,coins token trade privacy,后续有待扩展
### 配置文件 ### 配置文件
...@@ -115,16 +115,16 @@ type BaseCase struct { ...@@ -115,16 +115,16 @@ type BaseCase struct {
### 扩展开发 ### 扩展开发
#### 新增dapp的autotest,以系统dapp-coins为例,步骤如下: 分为以下几个步骤
1. 在coins目录名下新增autotest目录,coins/autotest > 注册dapp的AutoTest类型,以chain33/system/dapp/coins为例
1. 新增coins.go文件,注册autoest类型 增加autotest目录,并新建coins.go文件
```go ```go
package autotest package autotest
//导入autotest开发依赖,主要是types包 //导入autotest开发依赖,主要是types包
import ( import (
"reflect" "reflect"
. "gitlab.33.cn/chain33/chain33/cmd/autotest/types" . "github.com/33cn/chain33/cmd/autotest/types"
) )
//声明coins的AutoTest结构,其成员皆为coins将实现的用例类型 //声明coins的AutoTest结构,其成员皆为coins将实现的用例类型
...@@ -155,18 +155,9 @@ func (config coinsAutoTest) GetTestConfigType() reflect.Type { ...@@ -155,18 +155,9 @@ func (config coinsAutoTest) GetTestConfigType() reflect.Type {
return reflect.TypeOf(config) return reflect.TypeOf(config)
} }
``` ```
3. 实现需要测试的用例,即上述结构体中定义的用例类型,TransferCase和WithdrawCase
4. 在autotest主程序中增加匿名导入注册
```
//新增dapp的autoest需要在此处导入对应autotest包,匿名注册
_ "gitlab.33.cn/chain33/chain33/plugin/dapp/privacy/autotest"
_ "gitlab.33.cn/chain33/chain33/plugin/dapp/token/autotest"
_ "gitlab.33.cn/chain33/chain33/plugin/dapp/trade/autotest"
_ "gitlab.33.cn/chain33/chain33/system/dapp/coins/autotest"
```
#### 新增用例
可以根据测试需求,开发自定义测试用例,只需继承实现相关的接口 > 实现用例的测试行为
```go ```go
SendCommand(id string) //实现用例执行命令的行为 SendCommand(id string) //实现用例执行命令的行为
......
...@@ -146,6 +146,14 @@ enableMVCC=false ...@@ -146,6 +146,14 @@ enableMVCC=false
[exec.sub.token] [exec.sub.token]
saveTokenTxList=true saveTokenTxList=true
tokenApprs = [
"1Bsg9j6gW83sShoee1fZAt9TkUjcrCgA9S",
"1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK",
"1LY8GFia5EiyoTodMLfkB5PHNNpXRqxhyB",
"1GCzJDS6HbgTQ2emade7mEJGGWFfA15pS9",
"1JYB8sxi4He5pZWHCd3Zi2nypQ4JMB6AxN",
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
]
[exec.sub.relay] [exec.sub.relay]
genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt" genesis="14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"
...@@ -157,3 +165,10 @@ enable=false ...@@ -157,3 +165,10 @@ enable=false
cryptoPath="authdir/crypto" cryptoPath="authdir/crypto"
# 带证书签名类型,支持"auth_ecdsa", "auth_sm2" # 带证书签名类型,支持"auth_ecdsa", "auth_sm2"
signType="auth_ecdsa" signType="auth_ecdsa"
[exec.sub.manage]
superManager=[
"1Bsg9j6gW83sShoee1fZAt9TkUjcrCgA9S",
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv",
"1Q8hGLfoGe63efeWa8fJ4Pnukhkngt6poK"
]
\ No newline at end of file
...@@ -46,9 +46,9 @@ fail = true ...@@ -46,9 +46,9 @@ fail = true
[[TransferCase]] [[TransferCase]]
id = "btyTrans3" id = "btyTrans3"
command = "send bty transfer -a 1 -t 12hpJBHybh1mSyCijQ2MQJPk7z7kZ7jnQa -k 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj" command = "send bty transfer -a 1 -t 1GaHYpWmqAJsqRwrpoNcB8VvgKtSwjcHqt -k 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj"
from = "1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj" from = "1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj"
to = "12hpJBHybh1mSyCijQ2MQJPk7z7kZ7jnQa" to = "1GaHYpWmqAJsqRwrpoNcB8VvgKtSwjcHqt"
amount = "1" amount = "1"
checkItem = ["balance"] checkItem = ["balance"]
dep = ["btyTrans1"] dep = ["btyTrans1"]
...@@ -56,7 +56,7 @@ dep = ["btyTrans1"] ...@@ -56,7 +56,7 @@ dep = ["btyTrans1"]
[[WithdrawCase]] [[WithdrawCase]]
id = "btyWithdraw" id = "btyWithdraw"
command = "send bty withdraw -a 0.1 -e token -k 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj" command = "send bty withdraw -a 0.1 -e coins -k 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj"
addr = "1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj" addr = "1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj"
amount = "0.1" amount = "0.1"
checkItem = ["balance"] checkItem = ["balance"]
...@@ -66,7 +66,7 @@ dep = ["btyTrans3"] ...@@ -66,7 +66,7 @@ dep = ["btyTrans3"]
[[WithdrawCase]] [[WithdrawCase]]
id = "failWithdraw" id = "failWithdraw"
command = "send bty withdraw -a 1.1 -e token -k 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj" command = "send bty withdraw -a 1.1 -e coins -k 1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj"
addr = "1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj" addr = "1Ka7EPFRqs3v9yreXG6qA4RQbNmbPJCZPj"
amount = "1.1" amount = "1.1"
checkItem = ["balance"] checkItem = ["balance"]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment