mirror of
https://github.com/QuilibriumNetwork/ceremonyclient.git
synced 2026-02-21 18:37:26 +08:00
* v2.1.0 [omit consensus and adjacent] - this commit will be amended with the full release after the file copy is complete * 2.1.0 main node rollup
140 lines
6.1 KiB
Go
140 lines
6.1 KiB
Go
package hypergraph_test
|
||
|
||
import (
|
||
"math/big"
|
||
"testing"
|
||
|
||
"github.com/stretchr/testify/assert"
|
||
"github.com/stretchr/testify/mock"
|
||
"github.com/stretchr/testify/require"
|
||
"source.quilibrium.com/quilibrium/monorepo/node/execution/intrinsics/hypergraph"
|
||
hgstate "source.quilibrium.com/quilibrium/monorepo/node/execution/state/hypergraph"
|
||
"source.quilibrium.com/quilibrium/monorepo/node/keys"
|
||
"source.quilibrium.com/quilibrium/monorepo/types/crypto"
|
||
"source.quilibrium.com/quilibrium/monorepo/types/mocks"
|
||
"source.quilibrium.com/quilibrium/monorepo/types/tries"
|
||
)
|
||
|
||
func TestVertexAdd_GetCost(t *testing.T) {
|
||
// Setup
|
||
domain := [32]byte{1, 2, 3}
|
||
dataAddress := [32]byte{4, 5, 6}
|
||
mockInclusionProver := &mocks.MockInclusionProver{}
|
||
signer, err := keys.NewEd448Key()
|
||
require.NoError(t, err)
|
||
verenc := &mocks.MockVerifiableEncryptor{}
|
||
|
||
// Test with nil data
|
||
vertexAdd := hypergraph.NewVertexAdd(domain, dataAddress, nil, signer.Public().([]byte), mockInclusionProver, signer, &hypergraph.HypergraphIntrinsicConfiguration{ReadPublicKey: signer.Public().([]byte), WritePublicKey: signer.Public().([]byte)}, verenc, keys.NewInMemoryKeyManager(nil, nil))
|
||
cost, err := vertexAdd.GetCost()
|
||
assert.Error(t, err)
|
||
assert.Equal(t, big.NewInt(0), cost)
|
||
|
||
// Test with data – should round up to nearest multiple of 55
|
||
expectedSize := big.NewInt(110)
|
||
data := make([]byte, 100)
|
||
vertexAdd = hypergraph.NewVertexAdd(domain, dataAddress, data, signer.Public().([]byte), mockInclusionProver, signer, &hypergraph.HypergraphIntrinsicConfiguration{ReadPublicKey: signer.Public().([]byte), WritePublicKey: signer.Public().([]byte)}, verenc, keys.NewInMemoryKeyManager(nil, nil))
|
||
cost, err = vertexAdd.GetCost()
|
||
assert.NoError(t, err)
|
||
assert.Equal(t, expectedSize, cost)
|
||
}
|
||
|
||
func TestVertexAdd_Prove(t *testing.T) {
|
||
// Setup
|
||
domain := [32]byte{1, 2, 3}
|
||
dataAddress := [32]byte{4, 5, 6}
|
||
mockInclusionProver := &mocks.MockInclusionProver{}
|
||
signer, err := keys.NewEd448Key()
|
||
require.NoError(t, err)
|
||
verenc := &mocks.MockVerifiableEncryptor{}
|
||
proof := &mocks.MockVerEncProof{}
|
||
proof.On("GetEncryptionKey").Return(make([]byte, 57))
|
||
proof.On("Verify").Return(true)
|
||
proof.On("ToBytes").Return(make([]byte, 1100))
|
||
ve := &mocks.MockVerEnc{}
|
||
ve.On("ToBytes").Return(make([]byte, 1000))
|
||
ve.On("GetStatement").Return(make([]byte, 57))
|
||
proof.On("Compress").Return(ve)
|
||
verenc.On("ProofFromBytes", mock.Anything).Return(proof)
|
||
verenc.On("Encrypt", mock.Anything, mock.Anything).Return([]crypto.VerEncProof{proof})
|
||
|
||
// Test with nil data
|
||
vertexAdd := hypergraph.NewVertexAdd(domain, dataAddress, nil, signer.Public().([]byte), mockInclusionProver, signer, &hypergraph.HypergraphIntrinsicConfiguration{ReadPublicKey: signer.Public().([]byte), WritePublicKey: signer.Public().([]byte)}, verenc, keys.NewInMemoryKeyManager(nil, nil))
|
||
err = vertexAdd.Prove(1)
|
||
assert.Error(t, err)
|
||
|
||
// Test with valid data
|
||
data := make([]byte, 100)
|
||
vertexAdd = hypergraph.NewVertexAdd(domain, dataAddress, data, signer.Public().([]byte), mockInclusionProver, signer, &hypergraph.HypergraphIntrinsicConfiguration{ReadPublicKey: signer.Public().([]byte), WritePublicKey: signer.Public().([]byte)}, verenc, keys.NewInMemoryKeyManager(nil, nil))
|
||
|
||
err = vertexAdd.Prove(1)
|
||
assert.NoError(t, err)
|
||
|
||
// Verify the signature was set (signature should be valid since we're using a Ed448 key)
|
||
assert.NotEmpty(t, vertexAdd.Signature)
|
||
}
|
||
|
||
func TestVertexAdd_Verify(t *testing.T) {
|
||
// For the unit test, we'll test the behavior when these fields are not set
|
||
domain := [32]byte{1, 2, 3}
|
||
dataAddress := [32]byte{4, 5, 6}
|
||
mockInclusionProver := &mocks.MockInclusionProver{}
|
||
signer, err := keys.NewEd448Key()
|
||
require.NoError(t, err)
|
||
verenc := &mocks.MockVerifiableEncryptor{}
|
||
proof := &mocks.MockVerEncProof{}
|
||
proof.On("GetEncryptionKey").Return(signer.Public().([]byte))
|
||
proof.On("Verify").Return(true)
|
||
proof.On("ToBytes").Return(make([]byte, 1100))
|
||
ve := &mocks.MockVerEnc{}
|
||
ve.On("ToBytes").Return(make([]byte, 1000))
|
||
ve.On("GetStatement").Return(make([]byte, 57))
|
||
proof.On("Compress").Return(ve)
|
||
verenc.On("ProofFromBytes", mock.Anything).Return(proof)
|
||
verenc.On("Encrypt", mock.Anything, mock.Anything).Return([]crypto.VerEncProof{proof})
|
||
|
||
// Test with valid data
|
||
data := make([]byte, 100)
|
||
vertexAdd := hypergraph.NewVertexAdd(domain, dataAddress, data, signer.Public().([]byte), mockInclusionProver, signer, &hypergraph.HypergraphIntrinsicConfiguration{ReadPublicKey: signer.Public().([]byte), WritePublicKey: signer.Public().([]byte)}, verenc, keys.NewInMemoryKeyManager(nil, nil))
|
||
|
||
err = vertexAdd.Prove(1)
|
||
assert.NoError(t, err)
|
||
|
||
valid, err := vertexAdd.Verify(1)
|
||
assert.True(t, valid)
|
||
assert.NoError(t, err)
|
||
}
|
||
|
||
func TestVertexAdd_Materialize(t *testing.T) {
|
||
// Setup
|
||
domain := [32]byte{1, 2, 3}
|
||
dataAddress := [32]byte{4, 5, 6}
|
||
mockHypergraph := &mocks.MockHypergraph{}
|
||
mockHypergraph.On("GetVertex", mock.Anything).Return(nil, nil)
|
||
mockHypergraph.On("GetVertexData", mock.Anything).Return(&tries.VectorCommitmentTree{}, nil)
|
||
mockInclusionProver := &mocks.MockInclusionProver{}
|
||
verenc := &mocks.MockVerifiableEncryptor{}
|
||
signer, err := keys.NewEd448Key()
|
||
require.NoError(t, err)
|
||
proof := &mocks.MockVerEncProof{}
|
||
proof.On("GetEncryptionKey").Return(signer.Public().([]byte))
|
||
proof.On("Verify").Return(true)
|
||
proof.On("ToBytes").Return(make([]byte, 1100))
|
||
ve := &mocks.MockVerEnc{}
|
||
ve.On("ToBytes").Return(make([]byte, 1000))
|
||
ve.On("GetStatement").Return(make([]byte, 57))
|
||
proof.On("Compress").Return(ve)
|
||
verenc.On("ProofFromBytes", mock.Anything).Return(proof)
|
||
verenc.On("Encrypt", mock.Anything, mock.Anything).Return([]crypto.VerEncProof{proof})
|
||
|
||
hgState := hgstate.NewHypergraphState(mockHypergraph)
|
||
vertexAdd := hypergraph.NewVertexAdd(domain, dataAddress, make([]byte, 100), signer.Public().([]byte), mockInclusionProver, signer, &hypergraph.HypergraphIntrinsicConfiguration{ReadPublicKey: signer.Public().([]byte), WritePublicKey: signer.Public().([]byte)}, verenc, keys.NewInMemoryKeyManager(nil, nil))
|
||
err = vertexAdd.Prove(1)
|
||
assert.NoError(t, err)
|
||
|
||
// Test materialization
|
||
resultState, err := vertexAdd.Materialize(1, hgState)
|
||
require.NoError(t, err)
|
||
assert.Equal(t, hgState, resultState)
|
||
}
|