From dec2e2e26fa3a87e8e995bf12497f80046942ca1 Mon Sep 17 00:00:00 2001 From: Nattharat Wiriyakulnan Date: Wed, 27 May 2020 14:13:57 +0700 Subject: [PATCH 1/6] add request test --- chain/x/oracle/keeper/request_test.go | 121 ++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/chain/x/oracle/keeper/request_test.go b/chain/x/oracle/keeper/request_test.go index 4166671c05..4613facb4a 100644 --- a/chain/x/oracle/keeper/request_test.go +++ b/chain/x/oracle/keeper/request_test.go @@ -135,3 +135,124 @@ func TestGetRandomValidatorsTooBigSize(t *testing.T) { _, err := k.GetRandomValidators(ctx, 9999, int64(1)) require.Error(t, err) } + +func TestSaveResult(t *testing.T) { + _, ctx, k := createTestInput() + ctx = ctx.WithBlockTime(time.Unix(int64(1581589090), 0)) + + oracleScriptID := types.OracleScriptID(1) + calldata := []byte("CALLDATA") + vals := []sdk.ValAddress{Validator1.ValAddress, Validator2.ValAddress, Validator3.ValAddress} + minCount := int64(1) + requestHeight := int64(999) + requestTime := int64(1581589700) + clientID := "beeb" + ibcInfo := types.NewIBCInfo("source_port", "source_channel") + rawRequestID := []types.ExternalID{1, 2, 3} + resolveStatus := types.ResolveStatus_Success + result := []byte("RESULT") + id := k.AddRequest(ctx, types.NewRequest( + oracleScriptID, calldata, vals, minCount, requestHeight, + requestTime, clientID, &ibcInfo, rawRequestID)) + + res := k.SaveResult(ctx, id, resolveStatus, result) + + require.Equal(t, clientID, res.ClientID) + require.Equal(t, id, res.RequestID) + require.Equal(t, int64(0), res.AnsCount) + require.Equal(t, requestTime, res.RequestTime) + require.Equal(t, resolveStatus, res.ResolveStatus) + require.Equal(t, int64(1581589090), res.ResolveTime) + require.Equal(t, result, res.Result) +} + +func TestProcessExpiredRequests(t *testing.T) { + _, ctx, k := createTestInput() + ctx = ctx.WithBlockHeight(5000) + k.SetValidatorReportInfo(ctx, Validator1.ValAddress, types.NewValidatorReportInfo(Validator1.ValAddress, 1)) + + oracleScriptID := types.OracleScriptID(1) + calldata := []byte("CALLDATA") + vals := []sdk.ValAddress{Validator1.ValAddress} + minCount := int64(1) + requestHeight := int64(4000) + requestTime := int64(1581589700) + clientID := "beeb" + ibcInfo := types.NewIBCInfo("source_port", "source_channel") + rawRequestID := []types.ExternalID{1, 2} + + request1 := types.NewRequest( + oracleScriptID, calldata, vals, minCount, requestHeight, + requestTime, clientID, &ibcInfo, rawRequestID) + request2 := types.NewRequest( + oracleScriptID, calldata, vals, 999, requestHeight, + requestTime, clientID, &ibcInfo, rawRequestID) + request3 := types.NewRequest( + oracleScriptID, calldata, vals, minCount, 1000000, + requestTime, clientID, &ibcInfo, rawRequestID) + + id1 := k.AddRequest(ctx, request1) + id2 := k.AddRequest(ctx, request2) + id3 := k.AddRequest(ctx, request3) + + rq1, err := k.GetRequest(ctx, id1) + require.NoError(t, err) + require.Equal(t, rq1, request1) + rq2, err := k.GetRequest(ctx, id2) + require.NoError(t, err) + require.Equal(t, rq2, request2) + rq3, err := k.GetRequest(ctx, id3) + require.NoError(t, err) + require.Equal(t, rq3, request3) + + reports1 := k.GetReports(ctx, id1) + reports2 := k.GetReports(ctx, id2) + reports3 := k.GetReports(ctx, id3) + + require.Equal(t, []types.Report(nil), reports1) + require.Equal(t, []types.Report(nil), reports2) + require.Equal(t, []types.Report(nil), reports3) + + rep := types.NewReport( + Validator1.ValAddress, []types.RawReport{ + types.NewRawReport(1, 1, []byte("data1/1")), + types.NewRawReport(2, 0, []byte("data2/1")), + }, + ) + + k.AddReport(ctx, id1, rep) + k.AddReport(ctx, id2, rep) + k.AddReport(ctx, id3, rep) + + k.ProcessExpiredRequests(ctx) + + reports1 = k.GetReports(ctx, id1) + reports2 = k.GetReports(ctx, id2) + reports3 = k.GetReports(ctx, id3) + + info := k.GetValidatorReportInfoWithDefault(ctx, Validator1.ValAddress) + require.Equal(t, types.NewValidatorReportInfo(Validator1.ValAddress, 0), info) + + require.Equal(t, []types.Report(nil), reports1) + require.Equal(t, []types.Report(nil), reports2) + require.Equal(t, []types.Report{rep}, reports3) + + _, err = k.GetRequest(ctx, id1) + require.Error(t, err) + _, err = k.GetRequest(ctx, id2) + require.Error(t, err) + rq3, err = k.GetRequest(ctx, id3) + require.NoError(t, err) + require.Equal(t, rq3, request3) +} + +// TODO: revisit this test +func TestProcessExpiredRequestsNoRequestInStore(t *testing.T) { + _, ctx, k := createTestInput() + + before := ctx.MultiStore() + k.ProcessExpiredRequests(ctx) + after := ctx.MultiStore() + + require.Equal(t, before, after) +} From 11a16249385f5db9fa88457682fd66b3d3ff632a Mon Sep 17 00:00:00 2001 From: Nattharat Wiriyakulnan Date: Fri, 29 May 2020 18:47:26 +0700 Subject: [PATCH 2/6] iterator check store --- chain/x/oracle/keeper/keeper.go | 6 ++++++ chain/x/oracle/keeper/request_test.go | 31 ++++++++++++++++----------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/chain/x/oracle/keeper/keeper.go b/chain/x/oracle/keeper/keeper.go index b5ade4d74d..dcf652ecab 100644 --- a/chain/x/oracle/keeper/keeper.go +++ b/chain/x/oracle/keeper/keeper.go @@ -12,6 +12,7 @@ import ( paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/cosmos/cosmos-sdk/x/staking" "github.com/tendermint/tendermint/libs/log" + db "github.com/tendermint/tm-db" "github.com/bandprotocol/bandchain/chain/pkg/filecache" "github.com/bandprotocol/bandchain/chain/x/oracle/types" @@ -171,3 +172,8 @@ func (k Keeper) AddFile(file []byte) string { func (k Keeper) GetFile(name string) []byte { return k.fileCache.MustGetFile(name) } + +// GetIterator returns iterator overall oracle key. +func (k Keeper) GetIterator(ctx sdk.Context) db.Iterator { + return sdk.KVStorePrefixIterator(ctx.KVStore(k.storeKey), []byte{}) +} diff --git a/chain/x/oracle/keeper/request_test.go b/chain/x/oracle/keeper/request_test.go index 4613facb4a..f91330730d 100644 --- a/chain/x/oracle/keeper/request_test.go +++ b/chain/x/oracle/keeper/request_test.go @@ -168,14 +168,14 @@ func TestSaveResult(t *testing.T) { func TestProcessExpiredRequests(t *testing.T) { _, ctx, k := createTestInput() - ctx = ctx.WithBlockHeight(5000) + ctx = ctx.WithBlockHeight(5000) // set block height 5000 k.SetValidatorReportInfo(ctx, Validator1.ValAddress, types.NewValidatorReportInfo(Validator1.ValAddress, 1)) oracleScriptID := types.OracleScriptID(1) calldata := []byte("CALLDATA") vals := []sdk.ValAddress{Validator1.ValAddress} minCount := int64(1) - requestHeight := int64(4000) + requestHeight := int64(4000) // request at height 4000 requestTime := int64(1581589700) clientID := "beeb" ibcInfo := types.NewIBCInfo("source_port", "source_channel") @@ -184,10 +184,10 @@ func TestProcessExpiredRequests(t *testing.T) { request1 := types.NewRequest( oracleScriptID, calldata, vals, minCount, requestHeight, requestTime, clientID, &ibcInfo, rawRequestID) - request2 := types.NewRequest( + request2 := types.NewRequest( // request min count 999 oracleScriptID, calldata, vals, 999, requestHeight, requestTime, clientID, &ibcInfo, rawRequestID) - request3 := types.NewRequest( + request3 := types.NewRequest( // request height 1000000 oracleScriptID, calldata, vals, minCount, 1000000, requestTime, clientID, &ibcInfo, rawRequestID) @@ -233,26 +233,31 @@ func TestProcessExpiredRequests(t *testing.T) { info := k.GetValidatorReportInfoWithDefault(ctx, Validator1.ValAddress) require.Equal(t, types.NewValidatorReportInfo(Validator1.ValAddress, 0), info) - require.Equal(t, []types.Report(nil), reports1) - require.Equal(t, []types.Report(nil), reports2) + require.Equal(t, []types.Report(nil), reports1) // report1 was removed because it already expired + require.Equal(t, []types.Report(nil), reports2) // report2 was removed because it already expired require.Equal(t, []types.Report{rep}, reports3) - _, err = k.GetRequest(ctx, id1) + _, err = k.GetRequest(ctx, id1) // this request was removed because it already expired require.Error(t, err) - _, err = k.GetRequest(ctx, id2) + _, err = k.GetRequest(ctx, id2) // this request was removed because it already expired require.Error(t, err) rq3, err = k.GetRequest(ctx, id3) require.NoError(t, err) require.Equal(t, rq3, request3) } -// TODO: revisit this test func TestProcessExpiredRequestsNoRequestInStore(t *testing.T) { _, ctx, k := createTestInput() - - before := ctx.MultiStore() + before := 0 + iterator := k.GetIterator(ctx) + for ; iterator.Valid(); iterator.Next() { + before++ + } k.ProcessExpiredRequests(ctx) - after := ctx.MultiStore() - + after := 0 + iterator = k.GetIterator(ctx) + for ; iterator.Valid(); iterator.Next() { + after++ + } require.Equal(t, before, after) } From 53fdde90a75c2c775548cd13d8b5b3ff00fc32aa Mon Sep 17 00:00:00 2001 From: Nattharat Wiriyakulnan Date: Fri, 29 May 2020 19:08:15 +0700 Subject: [PATCH 3/6] update request test --- chain/x/oracle/keeper/request_test.go | 30 +++++++-------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/chain/x/oracle/keeper/request_test.go b/chain/x/oracle/keeper/request_test.go index f91330730d..27441b5824 100644 --- a/chain/x/oracle/keeper/request_test.go +++ b/chain/x/oracle/keeper/request_test.go @@ -143,14 +143,14 @@ func TestSaveResult(t *testing.T) { oracleScriptID := types.OracleScriptID(1) calldata := []byte("CALLDATA") vals := []sdk.ValAddress{Validator1.ValAddress, Validator2.ValAddress, Validator3.ValAddress} - minCount := int64(1) + minCount := uint64(1) requestHeight := int64(999) requestTime := int64(1581589700) clientID := "beeb" ibcInfo := types.NewIBCInfo("source_port", "source_channel") rawRequestID := []types.ExternalID{1, 2, 3} resolveStatus := types.ResolveStatus_Success - result := []byte("RESULT") + result := []byte("beeb") id := k.AddRequest(ctx, types.NewRequest( oracleScriptID, calldata, vals, minCount, requestHeight, requestTime, clientID, &ibcInfo, rawRequestID)) @@ -159,7 +159,7 @@ func TestSaveResult(t *testing.T) { require.Equal(t, clientID, res.ClientID) require.Equal(t, id, res.RequestID) - require.Equal(t, int64(0), res.AnsCount) + require.Equal(t, uint64(0), res.AnsCount) require.Equal(t, requestTime, res.RequestTime) require.Equal(t, resolveStatus, res.ResolveStatus) require.Equal(t, int64(1581589090), res.ResolveTime) @@ -174,7 +174,7 @@ func TestProcessExpiredRequests(t *testing.T) { oracleScriptID := types.OracleScriptID(1) calldata := []byte("CALLDATA") vals := []sdk.ValAddress{Validator1.ValAddress} - minCount := int64(1) + minCount := uint64(1) requestHeight := int64(4000) // request at height 4000 requestTime := int64(1581589700) clientID := "beeb" @@ -184,16 +184,12 @@ func TestProcessExpiredRequests(t *testing.T) { request1 := types.NewRequest( oracleScriptID, calldata, vals, minCount, requestHeight, requestTime, clientID, &ibcInfo, rawRequestID) - request2 := types.NewRequest( // request min count 999 - oracleScriptID, calldata, vals, 999, requestHeight, - requestTime, clientID, &ibcInfo, rawRequestID) - request3 := types.NewRequest( // request height 1000000 + request2 := types.NewRequest( // request height 1000000 oracleScriptID, calldata, vals, minCount, 1000000, requestTime, clientID, &ibcInfo, rawRequestID) id1 := k.AddRequest(ctx, request1) id2 := k.AddRequest(ctx, request2) - id3 := k.AddRequest(ctx, request3) rq1, err := k.GetRequest(ctx, id1) require.NoError(t, err) @@ -201,17 +197,12 @@ func TestProcessExpiredRequests(t *testing.T) { rq2, err := k.GetRequest(ctx, id2) require.NoError(t, err) require.Equal(t, rq2, request2) - rq3, err := k.GetRequest(ctx, id3) - require.NoError(t, err) - require.Equal(t, rq3, request3) reports1 := k.GetReports(ctx, id1) reports2 := k.GetReports(ctx, id2) - reports3 := k.GetReports(ctx, id3) require.Equal(t, []types.Report(nil), reports1) require.Equal(t, []types.Report(nil), reports2) - require.Equal(t, []types.Report(nil), reports3) rep := types.NewReport( Validator1.ValAddress, []types.RawReport{ @@ -222,28 +213,23 @@ func TestProcessExpiredRequests(t *testing.T) { k.AddReport(ctx, id1, rep) k.AddReport(ctx, id2, rep) - k.AddReport(ctx, id3, rep) k.ProcessExpiredRequests(ctx) reports1 = k.GetReports(ctx, id1) reports2 = k.GetReports(ctx, id2) - reports3 = k.GetReports(ctx, id3) info := k.GetValidatorReportInfoWithDefault(ctx, Validator1.ValAddress) require.Equal(t, types.NewValidatorReportInfo(Validator1.ValAddress, 0), info) require.Equal(t, []types.Report(nil), reports1) // report1 was removed because it already expired - require.Equal(t, []types.Report(nil), reports2) // report2 was removed because it already expired - require.Equal(t, []types.Report{rep}, reports3) + require.Equal(t, []types.Report{rep}, reports2) _, err = k.GetRequest(ctx, id1) // this request was removed because it already expired require.Error(t, err) - _, err = k.GetRequest(ctx, id2) // this request was removed because it already expired - require.Error(t, err) - rq3, err = k.GetRequest(ctx, id3) + rq2, err = k.GetRequest(ctx, id2) require.NoError(t, err) - require.Equal(t, rq3, request3) + require.Equal(t, rq2, request2) } func TestProcessExpiredRequestsNoRequestInStore(t *testing.T) { From bd2fed4c2d26eb4898e7be869af67ee8333cc8ed Mon Sep 17 00:00:00 2001 From: Nattharat Wiriyakulnan Date: Tue, 2 Jun 2020 19:33:37 +0700 Subject: [PATCH 4/6] fix 100% test coverage --- chain/x/oracle/keeper/request_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/x/oracle/keeper/request_test.go b/chain/x/oracle/keeper/request_test.go index 27441b5824..bd1ecfdd09 100644 --- a/chain/x/oracle/keeper/request_test.go +++ b/chain/x/oracle/keeper/request_test.go @@ -174,7 +174,7 @@ func TestProcessExpiredRequests(t *testing.T) { oracleScriptID := types.OracleScriptID(1) calldata := []byte("CALLDATA") vals := []sdk.ValAddress{Validator1.ValAddress} - minCount := uint64(1) + minCount := uint64(2) requestHeight := int64(4000) // request at height 4000 requestTime := int64(1581589700) clientID := "beeb" From 83a28643fc3e844604df5a9b1775cff084966193 Mon Sep 17 00:00:00 2001 From: Nattharat Wiriyakulnan Date: Tue, 2 Jun 2020 21:00:10 +0700 Subject: [PATCH 5/6] fix as comment --- chain/x/oracle/keeper/request_test.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/chain/x/oracle/keeper/request_test.go b/chain/x/oracle/keeper/request_test.go index bd1ecfdd09..8c5bc58f39 100644 --- a/chain/x/oracle/keeper/request_test.go +++ b/chain/x/oracle/keeper/request_test.go @@ -155,15 +155,9 @@ func TestSaveResult(t *testing.T) { oracleScriptID, calldata, vals, minCount, requestHeight, requestTime, clientID, &ibcInfo, rawRequestID)) - res := k.SaveResult(ctx, id, resolveStatus, result) - - require.Equal(t, clientID, res.ClientID) - require.Equal(t, id, res.RequestID) - require.Equal(t, uint64(0), res.AnsCount) - require.Equal(t, requestTime, res.RequestTime) - require.Equal(t, resolveStatus, res.ResolveStatus) - require.Equal(t, int64(1581589090), res.ResolveTime) - require.Equal(t, result, res.Result) + packet := k.SaveResult(ctx, id, resolveStatus, result) + expectPacket := types.NewOracleResponsePacketData(clientID, id, uint64(0), requestTime, int64(1581589090), resolveStatus, result) + require.Equal(t, expectPacket, packet) } func TestProcessExpiredRequests(t *testing.T) { @@ -225,6 +219,13 @@ func TestProcessExpiredRequests(t *testing.T) { require.Equal(t, []types.Report(nil), reports1) // report1 was removed because it already expired require.Equal(t, []types.Report{rep}, reports2) + res, err := k.GetResult(ctx, id1) + require.NotNil(t, res) + require.Nil(t, err) + res, err = k.GetResult(ctx, id2) + require.Nil(t, res) + require.NotNil(t, err) + _, err = k.GetRequest(ctx, id1) // this request was removed because it already expired require.Error(t, err) rq2, err = k.GetRequest(ctx, id2) From 4d0fc0921e15578c7c21b8c0302c9ce12c992f04 Mon Sep 17 00:00:00 2001 From: Nattharat Wiriyakulnan Date: Fri, 5 Jun 2020 10:22:36 +0700 Subject: [PATCH 6/6] add comment --- chain/x/oracle/keeper/request_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/x/oracle/keeper/request_test.go b/chain/x/oracle/keeper/request_test.go index 8c5bc58f39..9564357425 100644 --- a/chain/x/oracle/keeper/request_test.go +++ b/chain/x/oracle/keeper/request_test.go @@ -219,10 +219,10 @@ func TestProcessExpiredRequests(t *testing.T) { require.Equal(t, []types.Report(nil), reports1) // report1 was removed because it already expired require.Equal(t, []types.Report{rep}, reports2) - res, err := k.GetResult(ctx, id1) + res, err := k.GetResult(ctx, id1) // Have result because request-id 1 is already expired require.NotNil(t, res) require.Nil(t, err) - res, err = k.GetResult(ctx, id2) + res, err = k.GetResult(ctx, id2) // No result because request-id 2 isn't expired yet require.Nil(t, res) require.NotNil(t, err)