Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

initial set of edge cases #110

Merged
merged 16 commits into from
Sep 20, 2024
136 changes: 130 additions & 6 deletions e2e/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,69 @@ import (
"time"

"github.com/Layr-Labs/eigenda-proxy/client"

"github.com/Layr-Labs/eigenda-proxy/e2e"
"github.com/Layr-Labs/eigenda-proxy/store"
op_plasma "github.com/ethereum-optimism/optimism/op-plasma"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func useMemory() bool {
return !runTestnetIntegrationTests
}

func isNilPtrDerefPanic(err string) bool {
return strings.Contains(err, "panic") && strings.Contains(err, "SIGSEGV") &&
strings.Contains(err, "nil pointer dereference")
}

// TestOpClientKeccak256MalformedInputs tests the NewDAClient from op_plasma by setting and getting against []byte("")
// preimage. It sets the precompute option to false on the NewDAClient.
func TestOpClientKeccak256MalformedInputs(t *testing.T) {
if !runIntegrationTests || runTestnetIntegrationTests {
t.Skip("Skipping test as TESTNET env set or INTEGRATION var not set")
}

t.Parallel()
testCfg := e2e.TestConfig(useMemory())
testCfg.UseKeccak256ModeS3 = true
tsConfig := e2e.TestSuiteConfig(t, testCfg)
ts, kill := e2e.CreateTestSuite(t, tsConfig)
defer kill()

// nil commitment. Should return an error but currently is not. This needs to be fixed by OP
anupsv marked this conversation as resolved.
Show resolved Hide resolved
// Ref: https://github.com/ethereum-optimism/optimism/issues/11987
// daClient := op_plasma.NewDAClient(ts.Address(), false, true)
// t.Run("nil commitment case", func(t *testing.T) {
// var commit op_plasma.CommitmentData
// _, err := daClient.GetInput(ts.Ctx, commit)
// require.Error(t, err)
// assert.True(t, !isPanic(err.Error()))
// })

daClientPcFalse := op_plasma.NewDAClient(ts.Address(), false, false)

t.Run("input bad data to SetInput & GetInput", func(t *testing.T) {
testPreimage := []byte("") // Empty preimage
_, err := daClientPcFalse.SetInput(ts.Ctx, testPreimage)
require.Error(t, err)

// should fail with proper error message as is now, and cannot contain panics or nils
assert.True(t, strings.Contains(err.Error(), "invalid input") && !isNilPtrDerefPanic(err.Error()))

// The below test panics silently.
input := op_plasma.NewGenericCommitment([]byte(""))
_, err = daClientPcFalse.GetInput(ts.Ctx, input)
require.Error(t, err)

// Should not fail on slice bounds out of range. This needs to be fixed by OP.
// Refer to issue: https://github.com/ethereum-optimism/optimism/issues/11987
// assert.False(t, strings.Contains(err.Error(), ": EOF") && !isPanic(err.Error()))
})

}

func TestOptimismClientWithKeccak256Commitment(t *testing.T) {
if !runIntegrationTests && !runTestnetIntegrationTests {
t.Skip("Skipping test as INTEGRATION or TESTNET env var not set")
Expand All @@ -32,14 +85,16 @@ func TestOptimismClientWithKeccak256Commitment(t *testing.T) {

daClient := op_plasma.NewDAClient(ts.Address(), false, true)

testPreimage := []byte(e2e.RandString(100))
t.Run("normal case", func(t *testing.T) {
testPreimage := []byte(e2e.RandString(100))

commit, err := daClient.SetInput(ts.Ctx, testPreimage)
require.NoError(t, err)
commit, err := daClient.SetInput(ts.Ctx, testPreimage)
require.NoError(t, err)

preimage, err := daClient.GetInput(ts.Ctx, commit)
require.NoError(t, err)
require.Equal(t, testPreimage, preimage)
preimage, err := daClient.GetInput(ts.Ctx, commit)
require.NoError(t, err)
require.Equal(t, testPreimage, preimage)
})
}

func TestKeccak256CommitmentRequestErrorsWhenS3NotSet(t *testing.T) {
Expand Down Expand Up @@ -96,6 +151,75 @@ func TestOptimismClientWithGenericCommitment(t *testing.T) {
require.Equal(t, testPreimage, preimage)
}

// TestProxyClientServerIntegration tests the proxy client and server integration by setting the data as a single byte,
// many unicode characters, single unicode character and an empty preimage. It then tries to get the data from the
// proxy server with empty byte, single byte and random string.
func TestProxyClientServerIntegration(t *testing.T) {
if !runIntegrationTests && !runTestnetIntegrationTests {
t.Skip("Skipping test as INTEGRATION or TESTNET env var not set")
}

t.Parallel()

tsConfig := e2e.TestSuiteConfig(t, e2e.TestConfig(useMemory()))
ts, kill := e2e.CreateTestSuite(t, tsConfig)
defer kill()

cfg := &client.Config{
URL: ts.Address(),
}
daClient := client.New(cfg)

t.Run("single byte preimage set data case", func(t *testing.T) {
testPreimage := []byte{1} // single byte preimage
t.Log("Setting input data on proxy server...")
_, err := daClient.SetData(ts.Ctx, testPreimage)
require.NoError(t, err)
})

t.Run("unicode preimage set data case", func(t *testing.T) {
testPreimage := []byte("§§©ˆªªˆ˙√ç®∂§∞¶§ƒ¥√¨¥√¨¥ƒƒ©˙˜ø˜˜˜∫˙∫¥∫√†®®√稈¨˙ï") // many unicode characters
t.Log("Setting input data on proxy server...")
_, err := daClient.SetData(ts.Ctx, testPreimage)
require.NoError(t, err)

testPreimage = []byte("§") // single unicode character
t.Log("Setting input data on proxy server...")
_, err = daClient.SetData(ts.Ctx, testPreimage)
require.NoError(t, err)

})

t.Run("empty preimage set data case", func(t *testing.T) {
testPreimage := []byte("") // Empty preimage
t.Log("Setting input data on proxy server...")
_, err := daClient.SetData(ts.Ctx, testPreimage)
require.NoError(t, err)
})

t.Run("get data edge cases", func(t *testing.T) {
testCert := []byte("")
_, err := daClient.GetData(ts.Ctx, testCert)
require.Error(t, err)
assert.True(t, strings.Contains(err.Error(),
"commitment is too short") && !isNilPtrDerefPanic(err.Error()))

testCert = []byte{1}
_, err = daClient.GetData(ts.Ctx, testCert)
require.Error(t, err)
assert.True(t, strings.Contains(err.Error(),
"commitment is too short") && !isNilPtrDerefPanic(err.Error()))

testCert = []byte(e2e.RandString(10000))
_, err = daClient.GetData(ts.Ctx, testCert)
require.Error(t, err)
assert.True(t, strings.Contains(err.Error(),
"failed to decode DA cert to RLP format: rlp: expected input list for verify.Certificate") &&
!isNilPtrDerefPanic(err.Error()))
})

}

func TestProxyClient(t *testing.T) {
if !runIntegrationTests && !runTestnetIntegrationTests {
t.Skip("Skipping test as INTEGRATION or TESTNET env var not set")
Expand Down
Loading