Skip to content

Commit 26ca72a

Browse files
committed
loop on op until it succeeds before idempotency check
Signed-off-by: hfuss <hayden.fuss@kaleido.io>
1 parent ed62f39 commit 26ca72a

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed

test/e2e/client/restclient.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"crypto/rand"
2222
"crypto/sha256"
2323
"encoding/json"
24+
"errors"
2425
"fmt"
2526
"io"
2627
"math/big"
@@ -821,13 +822,13 @@ func (client *FireFlyClient) DeleteContractListener(t *testing.T, id *fftypes.UU
821822
require.Equal(t, 204, resp.StatusCode(), "DELETE %s [%d]: %s", path, resp.StatusCode(), resp.String())
822823
}
823824

824-
func (client *FireFlyClient) InvokeContractMethod(t *testing.T, req *core.ContractCallRequest, expectedStatus ...int) (interface{}, error) {
825-
var res interface{}
825+
func (client *FireFlyClient) InvokeContractMethod(t *testing.T, req *core.ContractCallRequest, expectedStatus ...int) (*core.Operation, error) {
826+
res := &core.Operation{}
826827
path := client.namespaced(urlContractInvoke)
827828
var errResult fftypes.RESTError
828829
resp, err := client.Client.R().
829830
SetBody(req).
830-
SetResult(&res).
831+
SetResult(res).
831832
SetError(&errResult).
832833
Post(path)
833834
require.NoError(t, err)
@@ -836,7 +837,7 @@ func (client *FireFlyClient) InvokeContractMethod(t *testing.T, req *core.Contra
836837
}
837838
require.Equal(t, expectedStatus[0], resp.StatusCode(), "POST %s [%d]: %s", path, resp.StatusCode(), resp.String())
838839
if err == nil && errResult.Error != "" {
839-
return res, fmt.Errorf(errResult.Error)
840+
return nil, errors.New(errResult.Error)
840841
}
841842
return res, err
842843
}
@@ -1055,6 +1056,16 @@ func (client *FireFlyClient) GetOperations(t *testing.T, startTime time.Time) (o
10551056
return operations
10561057
}
10571058

1059+
func (client *FireFlyClient) GetOperation(t *testing.T, operationID string) (operation *core.Operation) {
1060+
path := client.namespaced(urlOperations + "/" + operationID)
1061+
resp, err := client.Client.R().
1062+
SetResult(&operation).
1063+
Get(path)
1064+
require.NoError(t, err)
1065+
require.Equal(t, 200, resp.StatusCode(), "GET %s [%d]: %s", path, resp.StatusCode(), resp.String())
1066+
return operation
1067+
}
1068+
10581069
func (client *FireFlyClient) NetworkAction(t *testing.T, action core.NetworkActionType) {
10591070
path := client.namespaced(urlNetworkAction)
10601071
input := &core.NetworkAction{Type: action}

test/e2e/multiparty/ethereum_contracts.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,9 @@ func (suite *EthereumContractTestSuite) TestDirectInvokeMethod() {
190190
Location: fftypes.JSONAnyPtrBytes(locationBytes),
191191
Method: simpleStorageFFIGet(),
192192
}
193-
res, err = suite.testState.client1.QueryContractMethod(suite.T(), queryContractRequest)
193+
queryRes, err := suite.testState.client1.QueryContractMethod(suite.T(), queryContractRequest)
194194
assert.NoError(suite.T(), err)
195-
resJSON, err := json.Marshal(res)
195+
resJSON, err := json.Marshal(queryRes)
196196
assert.NoError(suite.T(), err)
197197
assert.Equal(suite.T(), `{"output":"2"}`, string(resJSON))
198198
suite.testState.client1.DeleteContractListener(suite.T(), listener.ID)
@@ -232,7 +232,18 @@ func (suite *EthereumContractTestSuite) TestFFIInvokeMethod() {
232232
assert.NoError(suite.T(), err)
233233
assert.NotNil(suite.T(), res)
234234

235-
time.Sleep(1 * time.Second) // Wait for the operation to be processed
235+
// Wait for the operation to succeed before idempotency check
236+
// If the operation never succeeds, the larger test timeout will fail
237+
for {
238+
suite.T().Logf("Waiting for invoke operation to succeed: %s", res.ID.String())
239+
op := suite.testState.client1.GetOperation(suite.T(), res.ID.String())
240+
if op.Status == core.OpStatusSucceeded {
241+
suite.T().Logf("Invoke operation succeeded: %s", res.ID.String())
242+
break
243+
}
244+
time.Sleep(100 * time.Millisecond)
245+
suite.T().Logf("Retrying, invoke operation status: %s", op.Status)
246+
}
236247

237248
// Idempotency check
238249
_, err = suite.testState.client1.InvokeContractMethod(suite.T(), invokeContractRequest, 409)
@@ -256,9 +267,9 @@ func (suite *EthereumContractTestSuite) TestFFIInvokeMethod() {
256267
Interface: suite.interfaceID,
257268
MethodPath: "get",
258269
}
259-
res, err = suite.testState.client1.QueryContractMethod(suite.T(), queryContractRequest)
270+
queryRes, err := suite.testState.client1.QueryContractMethod(suite.T(), queryContractRequest)
260271
assert.NoError(suite.T(), err)
261-
resJSON, err := json.Marshal(res)
272+
resJSON, err := json.Marshal(queryRes)
262273
assert.NoError(suite.T(), err)
263274
assert.Equal(suite.T(), `{"output":"42"}`, string(resJSON))
264275
suite.testState.client1.DeleteContractListener(suite.T(), listener.ID)

0 commit comments

Comments
 (0)