Skip to content
Snippets Groups Projects
Unverified Commit b05f11b5 authored by jonastheis's avatar jonastheis
Browse files

Add test for checkPayloadSolidity

parent 29011015
No related branches found
No related tags found
No related merge requests found
......@@ -766,8 +766,8 @@ func (tangle *Tangle) payloadBranchID(payloadID payload.ID) branchmanager.Branch
// checkPayloadSolidity returns true if the given payload is solid. A payload is considered to be solid, if it is either
// already marked as solid or if its referenced payloads are marked as solid.
func (tangle *Tangle) checkPayloadSolidity(payload *payload.Payload, payloadMetadata *PayloadMetadata, transactionBranches []branchmanager.BranchID) (solid bool, err error) {
if payload == nil || payload.IsDeleted() || payloadMetadata == nil || payloadMetadata.IsDeleted() {
func (tangle *Tangle) checkPayloadSolidity(p *payload.Payload, payloadMetadata *PayloadMetadata, transactionBranches []branchmanager.BranchID) (solid bool, err error) {
if p == nil || p.IsDeleted() || payloadMetadata == nil || payloadMetadata.IsDeleted() {
return
}
......@@ -777,17 +777,23 @@ func (tangle *Tangle) checkPayloadSolidity(payload *payload.Payload, payloadMeta
combinedBranches := transactionBranches
trunkBranchID := tangle.payloadBranchID(payload.TrunkID())
tangle.PayloadMetadata(payload.TrunkID()).Consume(func(metadata *PayloadMetadata) { solid = metadata.IsSolid() })
trunkBranchID := tangle.payloadBranchID(p.TrunkID())
tangle.PayloadMetadata(p.TrunkID()).Consume(func(metadata *PayloadMetadata) { solid = metadata.IsSolid() })
if p.TrunkID() == payload.GenesisID {
solid = true
}
if trunkBranchID == branchmanager.UndefinedBranchID || !solid {
return
return false, nil
}
combinedBranches = append(combinedBranches, trunkBranchID)
branchBranchID := tangle.payloadBranchID(payload.BranchID())
tangle.PayloadMetadata(payload.BranchID()).Consume(func(metadata *PayloadMetadata) { solid = metadata.IsSolid() })
branchBranchID := tangle.payloadBranchID(p.BranchID())
tangle.PayloadMetadata(p.BranchID()).Consume(func(metadata *PayloadMetadata) { solid = metadata.IsSolid() })
if p.BranchID() == payload.GenesisID {
solid = true
}
if branchBranchID == branchmanager.UndefinedBranchID || !solid {
return
return false, nil
}
combinedBranches = append(combinedBranches, branchBranchID)
......@@ -796,9 +802,9 @@ func (tangle *Tangle) checkPayloadSolidity(payload *payload.Payload, payloadMeta
return
}
if branchesConflicting {
err = fmt.Errorf("the payload '%s' combines conflicting versions of the ledger state", payload.ID())
err = fmt.Errorf("the payload '%s' combines conflicting versions of the ledger state", p.ID())
return
return false, err
}
solid = true
......
......@@ -1223,7 +1223,138 @@ func TestPayloadBranchID(t *testing.T) {
}
func TestCheckPayloadSolidity(t *testing.T) {
tangle := New(mapdb.NewMapDB())
// check with already solid payload
{
valueObject := payload.New(payload.GenesisID, payload.GenesisID, createDummyTransaction())
metadata := NewPayloadMetadata(valueObject.ID())
metadata.SetSolid(true)
metadata.SetBranchID(branchmanager.MasterBranchID)
transactionBranches := []branchmanager.BranchID{branchmanager.MasterBranchID}
solid, err := tangle.checkPayloadSolidity(valueObject, metadata, transactionBranches)
assert.True(t, solid)
assert.NoError(t, err)
}
// check with parents=genesis
{
valueObject := payload.New(payload.GenesisID, payload.GenesisID, createDummyTransaction())
metadata := NewPayloadMetadata(valueObject.ID())
transactionBranches := []branchmanager.BranchID{branchmanager.MasterBranchID}
solid, err := tangle.checkPayloadSolidity(valueObject, metadata, transactionBranches)
assert.True(t, solid)
assert.NoError(t, err)
}
// check with solid parents and branch set
{
setParent := func(payloadMetadata *PayloadMetadata) {
payloadMetadata.SetSolid(true)
payloadMetadata.SetBranchID(branchmanager.MasterBranchID)
}
valueObject := payload.New(storeParentPayloadWithMetadataFunc(t, tangle, setParent), storeParentPayloadWithMetadataFunc(t, tangle, setParent), createDummyTransaction())
metadata := NewPayloadMetadata(valueObject.ID())
transactionBranches := []branchmanager.BranchID{branchmanager.MasterBranchID}
solid, err := tangle.checkPayloadSolidity(valueObject, metadata, transactionBranches)
assert.True(t, solid)
assert.NoError(t, err)
}
// check with solid parents but no branch set -> should not be solid
{
setParent := func(payloadMetadata *PayloadMetadata) {
payloadMetadata.SetSolid(true)
}
valueObject := payload.New(storeParentPayloadWithMetadataFunc(t, tangle, setParent), storeParentPayloadWithMetadataFunc(t, tangle, setParent), createDummyTransaction())
metadata := NewPayloadMetadata(valueObject.ID())
transactionBranches := []branchmanager.BranchID{branchmanager.MasterBranchID}
solid, err := tangle.checkPayloadSolidity(valueObject, metadata, transactionBranches)
assert.False(t, solid)
assert.NoError(t, err)
}
// check with non-solid parents but branch set -> should not be solid
{
setParent := func(payloadMetadata *PayloadMetadata) {
payloadMetadata.SetBranchID(branchmanager.MasterBranchID)
}
valueObject := payload.New(storeParentPayloadWithMetadataFunc(t, tangle, setParent), storeParentPayloadWithMetadataFunc(t, tangle, setParent), createDummyTransaction())
metadata := NewPayloadMetadata(valueObject.ID())
transactionBranches := []branchmanager.BranchID{branchmanager.MasterBranchID}
solid, err := tangle.checkPayloadSolidity(valueObject, metadata, transactionBranches)
assert.False(t, solid)
assert.NoError(t, err)
}
// conflicting branches of parents
{
// create conflicting branches
cachedBranch2, _ := tangle.BranchManager().Fork(branchmanager.BranchID{2}, []branchmanager.BranchID{branchmanager.MasterBranchID}, []branchmanager.ConflictID{{0}})
defer cachedBranch2.Release()
cachedBranch3, _ := tangle.BranchManager().Fork(branchmanager.BranchID{3}, []branchmanager.BranchID{branchmanager.MasterBranchID}, []branchmanager.ConflictID{{0}})
defer cachedBranch3.Release()
setParent1 := func(payloadMetadata *PayloadMetadata) {
payloadMetadata.SetSolid(true)
payloadMetadata.SetBranchID(branchmanager.BranchID{2})
}
setParent2 := func(payloadMetadata *PayloadMetadata) {
payloadMetadata.SetSolid(true)
payloadMetadata.SetBranchID(branchmanager.BranchID{3})
}
valueObject := payload.New(storeParentPayloadWithMetadataFunc(t, tangle, setParent1), storeParentPayloadWithMetadataFunc(t, tangle, setParent2), createDummyTransaction())
metadata := NewPayloadMetadata(valueObject.ID())
transactionBranches := []branchmanager.BranchID{branchmanager.MasterBranchID}
solid, err := tangle.checkPayloadSolidity(valueObject, metadata, transactionBranches)
assert.False(t, solid)
assert.Error(t, err)
}
// conflicting branches with transactions
{
// create conflicting branches
cachedBranch2, _ := tangle.BranchManager().Fork(branchmanager.BranchID{2}, []branchmanager.BranchID{branchmanager.MasterBranchID}, []branchmanager.ConflictID{{0}})
defer cachedBranch2.Release()
cachedBranch3, _ := tangle.BranchManager().Fork(branchmanager.BranchID{3}, []branchmanager.BranchID{branchmanager.MasterBranchID}, []branchmanager.ConflictID{{0}})
defer cachedBranch3.Release()
setParent1 := func(payloadMetadata *PayloadMetadata) {
payloadMetadata.SetSolid(true)
payloadMetadata.SetBranchID(branchmanager.MasterBranchID)
}
setParent2 := func(payloadMetadata *PayloadMetadata) {
payloadMetadata.SetSolid(true)
payloadMetadata.SetBranchID(branchmanager.BranchID{3})
}
valueObject := payload.New(storeParentPayloadWithMetadataFunc(t, tangle, setParent1), storeParentPayloadWithMetadataFunc(t, tangle, setParent2), createDummyTransaction())
metadata := NewPayloadMetadata(valueObject.ID())
transactionBranches := []branchmanager.BranchID{branchmanager.BranchID{2}}
solid, err := tangle.checkPayloadSolidity(valueObject, metadata, transactionBranches)
assert.False(t, solid)
assert.Error(t, err)
}
}
func storeParentPayloadWithMetadataFunc(t *testing.T, tangle *Tangle, consume func(*PayloadMetadata)) payload.ID {
parent1 := payload.New(payload.GenesisID, payload.GenesisID, createDummyTransaction())
cachedPayload, cachedMetadata, stored := tangle.storePayload(parent1)
defer cachedPayload.Release()
cachedMetadata.Consume(consume)
assert.True(t, stored)
return parent1.ID()
}
func loadSnapshotFromOutputs(tangle *Tangle, outputs map[address.Address][]*balance.Balance) []transaction.OutputID {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment