Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update test
  • Loading branch information
yarikbratashchuk committed Oct 10, 2024
commit 2b58700df2ebbf18e66232ab4b9f9bd6ddb0cdbb
20 changes: 12 additions & 8 deletions cmd/rollkit/commands/run_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"github.com/mitchellh/mapstructure"
"google.golang.org/grpc"

"github.com/rollkit/go-da"
proxy "github.com/rollkit/go-da/proxy/jsonrpc"
goDATest "github.com/rollkit/go-da/test"
seqGRPC "github.com/rollkit/go-sequencing/proxy/grpc"
Expand Down Expand Up @@ -131,7 +132,7 @@ func NewRunNodeCmd() *cobra.Command {

// use mock jsonrpc da server by default
if !cmd.Flags().Lookup("rollkit.da_address").Changed {
srv, err := startMockDAServJSONRPC(cmd.Context())
srv, err := startMockDAServJSONRPC(cmd.Context(), nodeConfig.DAAddress, proxy.NewServer)
if err != nil && !errors.Is(err, errMockDAServerAlreadyRunning) {
Comment thread
yarikbratashchuk marked this conversation as resolved.
Outdated
Comment thread
yarikbratashchuk marked this conversation as resolved.
Outdated
return fmt.Errorf("failed to launch mock da server: %w", err)
}
Expand Down Expand Up @@ -244,24 +245,27 @@ func addNodeFlags(cmd *cobra.Command) {
}

// startMockDAServJSONRPC starts a mock JSONRPC server
func startMockDAServJSONRPC(ctx context.Context) (*proxy.Server, error) {
addr, err := url.Parse(nodeConfig.DAAddress)
func startMockDAServJSONRPC(
ctx context.Context,
daAddress string,
newServer func(string, string, da.DA) *proxy.Server,
) (*proxy.Server, error) {
addr, err := url.Parse(daAddress)
if err != nil {
return nil, err
}
// Attempt to start the server and handle the error if the port is already in use.
srv := proxy.NewServer(addr.Hostname(), addr.Port(), goDATest.NewDummyDA())

srv := newServer(addr.Hostname(), addr.Port(), goDATest.NewDummyDA())
if err := srv.Start(ctx); err != nil {
if errors.Is(err, syscall.EADDRINUSE) {
logger.Info("Mock DA server is already running", "address", nodeConfig.DAAddress)
return nil, errMockDAServerAlreadyRunning
}
return nil, err
}

logger.Info("Starting mock DA server", "address", nodeConfig.DAAddress)
if err := srv.Start(ctx); err != nil {
return nil, err
}

Comment thread
yarikbratashchuk marked this conversation as resolved.
return srv, nil
}

Expand Down
88 changes: 88 additions & 0 deletions cmd/rollkit/commands/run_node_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
package commands

import (
"context"
"errors"
"net/url"
"reflect"
"syscall"
"testing"
"time"

"github.com/rollkit/go-da"
proxy "github.com/rollkit/go-da/proxy/jsonrpc"
"github.com/stretchr/testify/assert"
)

func TestParseFlags(t *testing.T) {
Expand Down Expand Up @@ -133,3 +141,83 @@ func TestAggregatorFlagInvariants(t *testing.T) {
}
}
}

// MockServer wraps proxy.Server to allow us to control its behavior in tests
type MockServer struct {
*proxy.Server
StartFunc func(context.Context) error
StopFunc func(context.Context) error
}

func (m *MockServer) Start(ctx context.Context) error {
if m.StartFunc != nil {
return m.StartFunc(ctx)
}
return m.Server.Start(ctx)
}

func (m *MockServer) Stop(ctx context.Context) error {
if m.StopFunc != nil {
return m.StopFunc(ctx)
}
return m.Server.Stop(ctx)
}

func TestStartMockDAServJSONRPC(t *testing.T) {
tests := []struct {
name string
daAddress string
mockServerErr error
expectedErr error
}{
{
name: "Success",
daAddress: "http://localhost:26657",
mockServerErr: nil,
expectedErr: nil,
},
{
name: "Invalid URL",
daAddress: "://invalid",
mockServerErr: nil,
expectedErr: &url.Error{},
},
{
name: "Server Already Running",
daAddress: "http://localhost:26657",
mockServerErr: syscall.EADDRINUSE,
expectedErr: errMockDAServerAlreadyRunning,
Comment thread
yarikbratashchuk marked this conversation as resolved.
Outdated
},
Comment thread
yarikbratashchuk marked this conversation as resolved.
{
name: "Other Server Error",
daAddress: "http://localhost:26657",
mockServerErr: errors.New("other error"),
expectedErr: errors.New("other error"),
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
newServerFunc := func(hostname, port string, da da.DA) *proxy.Server {
mockServer := &MockServer{
Server: proxy.NewServer(hostname, port, da),
StartFunc: func(ctx context.Context) error {
return tt.mockServerErr
},
}
return mockServer.Server
}

srv, err := startMockDAServJSONRPC(context.Background(), tt.daAddress, newServerFunc)

if tt.expectedErr != nil {
assert.Error(t, err)
assert.IsType(t, tt.expectedErr, err)
assert.Nil(t, srv)
Comment thread
yarikbratashchuk marked this conversation as resolved.
} else {
assert.NoError(t, err)
assert.NotNil(t, srv)
}
})
}
}