Commit 996f4ff5 authored by liuyuhang's avatar liuyuhang Committed by 33cn

add auto rollback

parent 401ebb9e
......@@ -179,6 +179,7 @@ paraConsensusStopBlocks=30000
[exec.sub.autonomy]
total="16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp"
useBalance=false
autoRollback=false
#系统中所有的fork,默认用chain33的测试网络的
......
......@@ -226,4 +226,5 @@ paraConsensusStopBlocks=30000
[exec.sub.autonomy]
total="16htvcBNSEA7fZhAdLJphDwQRQJaHpyHTp"
useBalance=false
autoRollback=false
......@@ -13,8 +13,9 @@ import (
)
type subConfig struct {
Total string `json:"total"`
UseBalance bool `json:"useBalance"`
Total string `json:"total"`
UseBalance bool `json:"useBalance"`
AutoRollback bool `json:"autoRollback"`
}
var (
......
......@@ -10,8 +10,17 @@ import (
auty "github.com/33cn/plugin/plugin/dapp/autonomy/types"
)
func (a *Autonomy) execLocalBoard(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
func (a *Autonomy) execAutoLocalBoard(tx *types.Transaction, receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
set, err := a.execLocalBoard(receiptData)
if err != nil {
return set, err
}
dbSet := &types.LocalDBSet{}
dbSet.KV = a.AddRollbackKV(tx, []byte(tx.Execer), set.KV)
return dbSet, nil
}
func (a *Autonomy) execLocalBoard(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
table := NewBoardTable(a.GetLocalDB())
for _, log := range receiptData.Logs {
switch log.Ty {
......@@ -39,12 +48,22 @@ func (a *Autonomy) execLocalBoard(receiptData *types.ReceiptData) (*types.LocalD
if err != nil {
return nil, err
}
dbSet := &types.LocalDBSet{}
dbSet.KV = append(dbSet.KV, kvs...)
return dbSet, nil
}
func (a *Autonomy) execDelLocalBoard(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
func (a *Autonomy) execAutoDelLocal(tx *types.Transaction, receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
kvs, err := a.DelRollbackKV(tx, []byte(tx.Execer))
if err != nil {
return nil, err
}
dbSet := &types.LocalDBSet{}
dbSet.KV = append(dbSet.KV, kvs...)
return dbSet, nil
}
func (a *Autonomy) execDelLocalBoard(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
table := NewBoardTable(a.GetLocalDB())
for _, log := range receiptData.Logs {
var receipt auty.ReceiptProposalBoard
......@@ -78,6 +97,7 @@ func (a *Autonomy) execDelLocalBoard(receiptData *types.ReceiptData) (*types.Loc
if err != nil {
return nil, err
}
dbSet := &types.LocalDBSet{}
dbSet.KV = append(dbSet.KV, kvs...)
return dbSet, nil
}
......
......@@ -17,6 +17,11 @@ import (
)
func TestExecLocalBoard(t *testing.T) {
testexecLocalBoard(t, false)
testexecLocalBoard(t, true)
}
func testexecLocalBoard(t *testing.T, auto bool) {
_, sdb, kvdb := util.CreateTestDB()
au := &Autonomy{}
au.SetLocalDB(kvdb)
......@@ -39,7 +44,17 @@ func TestExecLocalBoard(t *testing.T) {
{Ty: auty.TyLogPropBoard, Log: types.Encode(receiptBoard)},
},
}
set, err := au.execLocalBoard(receipt)
var set *types.LocalDBSet
var err error
if auto == false {
set, err = au.execLocalBoard(receipt)
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalBoard(tx, receipt)
}
require.NoError(t, err)
require.NotNil(t, set)
//save to database
......@@ -55,11 +70,23 @@ func TestExecLocalBoard(t *testing.T) {
Prev: pre1,
Current: cur,
}
set, err = au.execLocalBoard(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogRvkPropBoard, Log: types.Encode(receiptBoard1)},
},
})
if auto == false {
set, err = au.execLocalBoard(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogRvkPropBoard, Log: types.Encode(receiptBoard1)},
},
})
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalBoard(tx,
&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogRvkPropBoard, Log: types.Encode(receiptBoard1)},
},
})
}
require.NoError(t, err)
require.NotNil(t, set)
......@@ -71,22 +98,30 @@ func TestExecLocalBoard(t *testing.T) {
// TyLogVotePropBoard
cur.Status = auty.AutonomyStatusProposalBoard
cur.Height = 1
cur.Index = 2
pre2 := copyAutonomyProposalBoard(cur)
cur.Status = auty.AutonomyStatusVotePropBoard
cur.Height = 1
cur.Index = 2
cur.Address = "2222222222222"
receiptBoard2 := &auty.ReceiptProposalBoard{
Prev: pre2,
Current: cur,
}
set, err = au.execLocalBoard(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropBoard, Log: types.Encode(receiptBoard2)},
},
})
if auto == false {
set, err = au.execLocalBoard(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropBoard, Log: types.Encode(receiptBoard2)},
},
})
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalBoard(tx,
&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropBoard, Log: types.Encode(receiptBoard2)},
},
})
}
require.NoError(t, err)
require.NotNil(t, set)
//save to database
......@@ -96,6 +131,11 @@ func TestExecLocalBoard(t *testing.T) {
}
func TestExecDelLocalBoard(t *testing.T) {
testexecDelLocalBoard(t, false)
testexecDelLocalBoard(t, true)
}
func testexecDelLocalBoard(t *testing.T, auto bool) {
_, sdb, kvdb := util.CreateTestDB()
au := &Autonomy{}
au.SetLocalDB(kvdb)
......@@ -118,16 +158,33 @@ func TestExecDelLocalBoard(t *testing.T) {
{Ty: auty.TyLogPropBoard, Log: types.Encode(receiptBoard)},
},
}
var set *types.LocalDBSet
var err error
// 先执行local然后进行删除
set, err := au.execLocalBoard(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
if auto == false {
set, err := au.execLocalBoard(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
set, err = au.execDelLocalBoard(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
set, err = au.execDelLocalBoard(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err := au.execAutoLocalBoard(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
set, err = au.execAutoDelLocal(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
}
// check
table := NewBoardTable(au.GetLocalDB())
......@@ -144,35 +201,55 @@ func TestExecDelLocalBoard(t *testing.T) {
// TyLogVotePropBoard
pre1 := copyAutonomyProposalBoard(cur)
cur.Status = auty.AutonomyStatusVotePropBoard
cur.Height = 1
cur.Index = 2
receiptBoard2 := &auty.ReceiptProposalBoard{
Prev: pre1,
Current: cur,
}
// 先执行local然后进行删除
set, err = au.execLocalBoard(&types.ReceiptData{
recpt := &types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropBoard, Log: types.Encode(receiptBoard2)},
},
})
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
checkExecLocalBoard(t, kvdb, cur)
}}
// 先执行local然后进行删除
if auto == false {
set, err = au.execLocalBoard(recpt)
set, err = au.execDelLocalBoard(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropBoard, Log: types.Encode(receiptBoard2)},
},
})
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
checkExecLocalBoard(t, kvdb, cur)
set, err = au.execDelLocalBoard(recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
} else {
// 自动回退测试时候,需要先设置一个前置状态
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err := au.execAutoLocalBoard(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// 正常测试退回
tx, err = types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalBoard(tx, recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
checkExecLocalBoard(t, kvdb, cur)
set, err = au.execAutoDelLocal(tx, recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
}
// check
checkExecLocalBoard(t, kvdb, pre1)
}
func TestGetProposalBoard(t *testing.T) {
......
......@@ -13,21 +13,33 @@ import (
// ExecDelLocal_PropBoard 创建提案董事会
func (a *Autonomy) ExecDelLocal_PropBoard(payload *auty.ProposalBoard, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalBoard(receiptData)
}
// ExecDelLocal_RvkPropBoard 撤销提案
func (a *Autonomy) ExecDelLocal_RvkPropBoard(payload *auty.RevokeProposalBoard, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalBoard(receiptData)
}
// ExecDelLocal_VotePropBoard 投票提案
func (a *Autonomy) ExecDelLocal_VotePropBoard(payload *auty.VoteProposalBoard, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalBoard(receiptData)
}
// ExecDelLocal_TmintPropBoard 终止提案
func (a *Autonomy) ExecDelLocal_TmintPropBoard(payload *auty.TerminateProposalBoard, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalBoard(receiptData)
}
......@@ -35,26 +47,41 @@ func (a *Autonomy) ExecDelLocal_TmintPropBoard(payload *auty.TerminateProposalBo
// ExecDelLocal_PropProject 创建提案项目
func (a *Autonomy) ExecDelLocal_PropProject(payload *auty.ProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalProject(receiptData)
}
// ExecDelLocal_RvkPropProject 撤销提案
func (a *Autonomy) ExecDelLocal_RvkPropProject(payload *auty.RevokeProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalProject(receiptData)
}
// ExecDelLocal_VotePropProject 投票提案
func (a *Autonomy) ExecDelLocal_VotePropProject(payload *auty.VoteProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalProject(receiptData)
}
// ExecDelLocal_PubVotePropProject 投票提案
func (a *Autonomy) ExecDelLocal_PubVotePropProject(payload *auty.PubVoteProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalProject(receiptData)
}
// ExecDelLocal_TmintPropProject 终止提案
func (a *Autonomy) ExecDelLocal_TmintPropProject(payload *auty.TerminateProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalProject(receiptData)
}
......@@ -62,25 +89,40 @@ func (a *Autonomy) ExecDelLocal_TmintPropProject(payload *auty.TerminateProposal
// ExecDelLocal_PropRule 创建提案规则
func (a *Autonomy) ExecDelLocal_PropRule(payload *auty.ProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalRule(receiptData)
}
// ExecDelLocal_RvkPropRule 撤销提案规则
func (a *Autonomy) ExecDelLocal_RvkPropRule(payload *auty.RevokeProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalRule(receiptData)
}
// ExecDelLocal_VotePropRule 投票提案规则
func (a *Autonomy) ExecDelLocal_VotePropRule(payload *auty.VoteProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalRule(receiptData)
}
// ExecDelLocal_TmintPropRule 终止提案规则
func (a *Autonomy) ExecDelLocal_TmintPropRule(payload *auty.TerminateProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalRule(receiptData)
}
// ExecDelLocal_CommentProp 终止提案规则
func (a *Autonomy) ExecDelLocal_CommentProp(payload *auty.Comment, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoDelLocal(tx, receiptData)
}
return a.execDelLocalCommentProp(receiptData)
}
......@@ -13,21 +13,33 @@ import (
// ExecLocal_PropBoard 创建提案
func (a *Autonomy) ExecLocal_PropBoard(payload *auty.ProposalBoard, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalBoard(tx, receiptData)
}
return a.execLocalBoard(receiptData)
}
// ExecLocal_RvkPropBoard 撤销提案
func (a *Autonomy) ExecLocal_RvkPropBoard(payload *auty.RevokeProposalBoard, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalBoard(tx, receiptData)
}
return a.execLocalBoard(receiptData)
}
// ExecLocal_VotePropBoard 投票提案
func (a *Autonomy) ExecLocal_VotePropBoard(payload *auty.VoteProposalBoard, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalBoard(tx, receiptData)
}
return a.execLocalBoard(receiptData)
}
// ExecLocal_TmintPropBoard 终止提案
func (a *Autonomy) ExecLocal_TmintPropBoard(payload *auty.TerminateProposalBoard, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalBoard(tx, receiptData)
}
return a.execLocalBoard(receiptData)
}
......@@ -35,26 +47,41 @@ func (a *Autonomy) ExecLocal_TmintPropBoard(payload *auty.TerminateProposalBoard
// ExecLocal_PropProject 创建提案项目
func (a *Autonomy) ExecLocal_PropProject(payload *auty.ProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalProject(tx, receiptData)
}
return a.execLocalProject(receiptData)
}
// ExecLocal_RvkPropProject 撤销提案项目
func (a *Autonomy) ExecLocal_RvkPropProject(payload *auty.RevokeProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalProject(tx, receiptData)
}
return a.execLocalProject(receiptData)
}
// ExecLocal_VotePropProject 投票提案项目
func (a *Autonomy) ExecLocal_VotePropProject(payload *auty.VoteProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalProject(tx, receiptData)
}
return a.execLocalProject(receiptData)
}
// ExecLocal_PubVotePropProject 全体投票提案项目
func (a *Autonomy) ExecLocal_PubVotePropProject(payload *auty.PubVoteProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalProject(tx, receiptData)
}
return a.execLocalProject(receiptData)
}
// ExecLocal_TmintPropProject 终止提案项目
func (a *Autonomy) ExecLocal_TmintPropProject(payload *auty.TerminateProposalProject, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalProject(tx, receiptData)
}
return a.execLocalProject(receiptData)
}
......@@ -62,25 +89,40 @@ func (a *Autonomy) ExecLocal_TmintPropProject(payload *auty.TerminateProposalPro
// ExecLocal_PropRule 创建提案规则
func (a *Autonomy) ExecLocal_PropRule(payload *auty.ProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalRule(tx, receiptData)
}
return a.execLocalRule(receiptData)
}
// ExecLocal_RvkPropRule 撤销提案规则
func (a *Autonomy) ExecLocal_RvkPropRule(payload *auty.RevokeProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalRule(tx, receiptData)
}
return a.execLocalRule(receiptData)
}
// ExecLocal_VotePropRule 投票提案规则
func (a *Autonomy) ExecLocal_VotePropRule(payload *auty.VoteProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalRule(tx, receiptData)
}
return a.execLocalRule(receiptData)
}
// ExecLocal_TmintPropRule 终止提案规则
func (a *Autonomy) ExecLocal_TmintPropRule(payload *auty.TerminateProposalRule, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalRule(tx, receiptData)
}
return a.execLocalRule(receiptData)
}
// ExecLocal_CommentProp 评论提案
func (a *Autonomy) ExecLocal_CommentProp(payload *auty.Comment, tx *types.Transaction, receiptData *types.ReceiptData, index int) (*types.LocalDBSet, error) {
if cfg.AutoRollback {
return a.execAutoLocalCommentProp(tx, receiptData)
}
return a.execLocalCommentProp(receiptData)
}
......@@ -10,8 +10,17 @@ import (
auty "github.com/33cn/plugin/plugin/dapp/autonomy/types"
)
func (a *Autonomy) execLocalProject(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
func (a *Autonomy) execAutoLocalProject(tx *types.Transaction, receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
set, err := a.execLocalProject(receiptData)
if err != nil {
return set, err
}
dbSet := &types.LocalDBSet{}
dbSet.KV = a.AddRollbackKV(tx, []byte(tx.Execer), set.KV)
return dbSet, nil
}
func (a *Autonomy) execLocalProject(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
table := NewProjectTable(a.GetLocalDB())
for _, log := range receiptData.Logs {
switch log.Ty {
......@@ -39,12 +48,12 @@ func (a *Autonomy) execLocalProject(receiptData *types.ReceiptData) (*types.Loca
if err != nil {
return nil, err
}
dbSet := &types.LocalDBSet{}
dbSet.KV = append(dbSet.KV, kvs...)
return dbSet, nil
}
func (a *Autonomy) execDelLocalProject(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
table := NewProjectTable(a.GetLocalDB())
for _, log := range receiptData.Logs {
var receipt auty.ReceiptProposalProject
......@@ -79,6 +88,7 @@ func (a *Autonomy) execDelLocalProject(receiptData *types.ReceiptData) (*types.L
if err != nil {
return nil, err
}
dbSet := &types.LocalDBSet{}
dbSet.KV = append(dbSet.KV, kvs...)
return dbSet, nil
}
......
......@@ -17,6 +17,11 @@ import (
)
func TestExecLocalProject(t *testing.T) {
testexecLocalProject(t, false)
testexecLocalProject(t, true)
}
func testexecLocalProject(t *testing.T, auto bool) {
_, sdb, kvdb := util.CreateTestDB()
au := &Autonomy{}
au.SetLocalDB(kvdb)
......@@ -41,7 +46,17 @@ func TestExecLocalProject(t *testing.T) {
{Ty: auty.TyLogPropProject, Log: types.Encode(receiptProject)},
},
}
set, err := au.execLocalProject(receipt)
var set *types.LocalDBSet
var err error
if auto == false {
set, err = au.execLocalProject(receipt)
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalProject(tx, receipt)
}
require.NoError(t, err)
require.NotNil(t, set)
//save to database
......@@ -57,11 +72,23 @@ func TestExecLocalProject(t *testing.T) {
Prev: pre1,
Current: cur,
}
set, err = au.execLocalProject(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogRvkPropProject, Log: types.Encode(receiptProject1)},
},
})
if auto == false {
set, err = au.execLocalProject(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogRvkPropProject, Log: types.Encode(receiptProject1)},
},
})
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalProject(tx,
&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogRvkPropProject, Log: types.Encode(receiptProject1)},
},
})
}
require.NoError(t, err)
require.NotNil(t, set)
......@@ -73,22 +100,30 @@ func TestExecLocalProject(t *testing.T) {
// TyLogVotePropProject
cur.Status = auty.AutonomyStatusProposalProject
cur.Height = 1
cur.Index = 2
pre2 := copyAutonomyProposalProject(cur)
cur.Status = auty.AutonomyStatusVotePropProject
cur.Height = 1
cur.Index = 2
cur.Address = "2222222222222"
receiptProject2 := &auty.ReceiptProposalProject{
Prev: pre2,
Current: cur,
}
set, err = au.execLocalProject(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropProject, Log: types.Encode(receiptProject2)},
},
})
if auto == false {
set, err = au.execLocalProject(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropProject, Log: types.Encode(receiptProject2)},
},
})
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalProject(tx,
&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropProject, Log: types.Encode(receiptProject2)},
},
})
}
require.NoError(t, err)
require.NotNil(t, set)
......@@ -100,6 +135,11 @@ func TestExecLocalProject(t *testing.T) {
}
func TestExecDelLocalProject(t *testing.T) {
testexecDelLocalProject(t, false)
testexecDelLocalProject(t, true)
}
func testexecDelLocalProject(t *testing.T, auto bool) {
_, sdb, kvdb := util.CreateTestDB()
au := &Autonomy{}
au.SetLocalDB(kvdb)
......@@ -124,19 +164,36 @@ func TestExecDelLocalProject(t *testing.T) {
{Ty: auty.TyLogPropProject, Log: types.Encode(receiptProject)},
},
}
var set *types.LocalDBSet
var err error
// 先执行local然后进行删除
set, err := au.execLocalProject(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
if auto == false {
set, err := au.execLocalProject(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
set, err = au.execDelLocalProject(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
set, err = au.execDelLocalProject(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err := au.execAutoLocalProject(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
set, err = au.execAutoDelLocal(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
}
// check
table := NewBoardTable(au.GetLocalDB())
table := NewProjectTable(au.GetLocalDB())
query := table.GetQuery(kvdb)
_, err = query.ListIndex("primary", nil, nil, 10, 0)
assert.Equal(t, err, types.ErrNotFound)
......@@ -150,32 +207,53 @@ func TestExecDelLocalProject(t *testing.T) {
// TyLogVotePropProject
pre1 := copyAutonomyProposalProject(cur)
cur.Status = auty.AutonomyStatusVotePropProject
cur.Height = 1
cur.Index = 2
receiptProject2 := &auty.ReceiptProposalProject{
Prev: pre1,
Current: cur,
}
// 先执行local然后进行删除
set, err = au.execLocalProject(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropProject, Log: types.Encode(receiptProject2)},
},
})
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
checkExecLocalProject(t, kvdb, cur)
set, err = au.execDelLocalProject(&types.ReceiptData{
recpt := &types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropProject, Log: types.Encode(receiptProject2)},
},
})
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
}}
// 先执行local然后进行删除
if auto == false {
set, err = au.execLocalProject(recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
checkExecLocalProject(t, kvdb, cur)
set, err = au.execDelLocalProject(recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
} else {
// 自动回退测试时候,需要先设置一个前置状态
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err := au.execAutoLocalProject(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// 正常测试退回
tx, err = types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalProject(tx, recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
checkExecLocalProject(t, kvdb, cur)
set, err = au.execAutoDelLocal(tx, recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
}
checkExecLocalProject(t, kvdb, pre1)
}
......
......@@ -10,6 +10,16 @@ import (
auty "github.com/33cn/plugin/plugin/dapp/autonomy/types"
)
func (a *Autonomy) execAutoLocalRule(tx *types.Transaction, receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
set, err := a.execLocalRule(receiptData)
if err != nil {
return set, err
}
dbSet := &types.LocalDBSet{}
dbSet.KV = a.AddRollbackKV(tx, []byte(tx.Execer), set.KV)
return dbSet, nil
}
func (a *Autonomy) execLocalRule(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
table := NewRuleTable(a.GetLocalDB())
......@@ -153,6 +163,16 @@ func (a *Autonomy) listProposalRule(req *auty.ReqQueryProposalRule) (types.Messa
return &rep, nil
}
func (a *Autonomy) execAutoLocalCommentProp(tx *types.Transaction, receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
set, err := a.execLocalCommentProp(receiptData)
if err != nil {
return set, err
}
dbSet := &types.LocalDBSet{}
dbSet.KV = a.AddRollbackKV(tx, []byte(tx.Execer), set.KV)
return dbSet, nil
}
func (a *Autonomy) execLocalCommentProp(receiptData *types.ReceiptData) (*types.LocalDBSet, error) {
dbSet := &types.LocalDBSet{}
var set []*types.KeyValue
......
......@@ -17,6 +17,11 @@ import (
)
func TestExecLocalRule(t *testing.T) {
testexecLocalRule(t, false)
testexecLocalRule(t, true)
}
func testexecLocalRule(t *testing.T, auto bool) {
_, sdb, kvdb := util.CreateTestDB()
au := &Autonomy{}
au.SetLocalDB(kvdb)
......@@ -39,7 +44,17 @@ func TestExecLocalRule(t *testing.T) {
{Ty: auty.TyLogPropRule, Log: types.Encode(receiptRule)},
},
}
set, err := au.execLocalRule(receipt)
var set *types.LocalDBSet
var err error
if auto == false {
set, err = au.execLocalRule(receipt)
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalRule(tx, receipt)
}
require.NoError(t, err)
require.NotNil(t, set)
//save to database
......@@ -55,11 +70,23 @@ func TestExecLocalRule(t *testing.T) {
Prev: pre1,
Current: cur,
}
set, err = au.execLocalRule(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogRvkPropRule, Log: types.Encode(receiptRule1)},
},
})
if auto == false {
set, err = au.execLocalRule(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogRvkPropRule, Log: types.Encode(receiptRule1)},
},
})
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalRule(tx,
&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogRvkPropRule, Log: types.Encode(receiptRule1)},
},
})
}
require.NoError(t, err)
require.NotNil(t, set)
//save to database
......@@ -70,22 +97,30 @@ func TestExecLocalRule(t *testing.T) {
// TyLogVotePropRule
cur.Status = auty.AutonomyStatusProposalRule
cur.Height = 1
cur.Index = 2
pre2 := copyAutonomyProposalRule(cur)
cur.Status = auty.AutonomyStatusVotePropRule
cur.Height = 1
cur.Index = 2
cur.Address = "2222222222222"
receiptRule2 := &auty.ReceiptProposalRule{
Prev: pre2,
Current: cur,
}
set, err = au.execLocalRule(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropRule, Log: types.Encode(receiptRule2)},
},
})
if auto == false {
set, err = au.execLocalRule(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropRule, Log: types.Encode(receiptRule2)},
},
})
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalRule(tx,
&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropRule, Log: types.Encode(receiptRule2)},
},
})
}
require.NoError(t, err)
require.NotNil(t, set)
//save to database
......@@ -95,6 +130,11 @@ func TestExecLocalRule(t *testing.T) {
}
func TestExecDelLocalRule(t *testing.T) {
testexecDelLocalRule(t, false)
testexecDelLocalRule(t, true)
}
func testexecDelLocalRule(t *testing.T, auto bool) {
_, sdb, kvdb := util.CreateTestDB()
au := &Autonomy{}
au.SetLocalDB(kvdb)
......@@ -117,16 +157,33 @@ func TestExecDelLocalRule(t *testing.T) {
{Ty: auty.TyLogPropRule, Log: types.Encode(receiptRule)},
},
}
var set *types.LocalDBSet
var err error
// 先执行local然后进行删除
set, err := au.execLocalRule(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
if auto == false {
set, err := au.execLocalRule(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
set, err = au.execDelLocalRule(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err := au.execAutoLocalRule(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
set, err = au.execAutoDelLocal(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
}
set, err = au.execDelLocalRule(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
table := NewRuleTable(au.GetLocalDB())
query := table.GetQuery(kvdb)
......@@ -146,26 +203,51 @@ func TestExecDelLocalRule(t *testing.T) {
Prev: pre1,
Current: cur,
}
// 先执行local然后进行删除
set, err = au.execLocalRule(&types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropRule, Log: types.Encode(receiptRule2)},
},
})
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
checkExecLocalRule(t, kvdb, cur)
set, err = au.execDelLocalRule(&types.ReceiptData{
recpt := &types.ReceiptData{
Logs: []*types.ReceiptLog{
{Ty: auty.TyLogVotePropRule, Log: types.Encode(receiptRule2)},
},
})
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
}}
// 先执行local然后进行删除
if auto == false {
set, err = au.execLocalRule(recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
checkExecLocalRule(t, kvdb, cur)
set, err = au.execDelLocalRule(recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
} else {
// 自动回退测试时候,需要先设置一个前置状态
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err := au.execAutoLocalRule(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// 正常测试退回
tx, err = types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalRule(tx, recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
// check
checkExecLocalRule(t, kvdb, cur)
set, err = au.execAutoDelLocal(tx, recpt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
}
// check
checkExecLocalRule(t, kvdb, pre1)
}
......@@ -329,7 +411,14 @@ func TestListProposalRule(t *testing.T) {
}
func TestExecLocalCommentProp(t *testing.T) {
testexecLocalCommentProp(t, false)
testexecLocalCommentProp(t, true)
}
func testexecLocalCommentProp(t *testing.T, auto bool) {
_, _, kvdb := util.CreateTestDB()
au := &Autonomy{}
au.SetLocalDB(kvdb)
propID := "11111111111111"
Repcmt := "2222222222"
comment := "3333333333"
......@@ -347,7 +436,16 @@ func TestExecLocalCommentProp(t *testing.T) {
{Ty: auty.TyLogCommentProp, Log: types.Encode(receiptCmt)},
},
}
set, err := au.execLocalCommentProp(receipt)
var set *types.LocalDBSet
var err error
if auto == false {
set, err = au.execLocalCommentProp(receipt)
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalCommentProp(tx, receipt)
}
require.NoError(t, err)
require.NotNil(t, set)
require.Equal(t, set.KV[0].Key, calcCommentHeight(propID,
......@@ -356,7 +454,14 @@ func TestExecLocalCommentProp(t *testing.T) {
}
func TestExecDelLocalCommentProp(t *testing.T) {
testexecDelLocalCommentProp(t, false)
testexecDelLocalCommentProp(t, true)
}
func testexecDelLocalCommentProp(t *testing.T, auto bool) {
_, sdb, kvdb := util.CreateTestDB()
au := &Autonomy{}
au.SetLocalDB(kvdb)
propID := "11111111111111"
Repcmt := "2222222222"
comment := "3333333333"
......@@ -374,9 +479,33 @@ func TestExecDelLocalCommentProp(t *testing.T) {
{Ty: auty.TyLogCommentProp, Log: types.Encode(receiptCmt)},
},
}
set, err := au.execDelLocalCommentProp(receipt)
require.NoError(t, err)
require.NotNil(t, set)
var set *types.LocalDBSet
var err error
// 先执行local然后进行删除
if auto == false {
set, err = au.execLocalCommentProp(receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
set, err = au.execDelLocalCommentProp(receipt)
require.NoError(t, err)
require.NotNil(t, set)
} else {
tx, err := types.CreateFormatTx(types.ExecName(auty.AutonomyX), nil)
assert.NoError(t, err)
set, err = au.execAutoLocalCommentProp(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
saveKvs(sdb, set.KV)
set, err = au.execAutoDelLocal(tx, receipt)
require.NoError(t, err)
require.NotNil(t, set)
}
// check
require.Equal(t, set.KV[0].Key, calcCommentHeight(propID,
dapp.HeightIndexStr(receiptCmt.Height, int64(receiptCmt.Index))))
require.Nil(t, set.KV[0].Value)
......
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