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

Coverage for: networkGroup, nodeGroup, proofGroup, transactionGroup, validatorGroup, vmValuesGroup #5184

Merged
merged 10 commits into from
Apr 28, 2023
78 changes: 78 additions & 0 deletions api/groups/networkGroup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -932,6 +932,84 @@ func TestGetGasConfigs(t *testing.T) {
})
}

func TestNetworkGroup_UpdateFacade(t *testing.T) {
t.Parallel()

t.Run("nil facade should error", func(t *testing.T) {
t.Parallel()

networkGroup, err := groups.NewNetworkGroup(&mock.FacadeStub{})
require.NoError(t, err)

err = networkGroup.UpdateFacade(nil)
require.Equal(t, apiErrors.ErrNilFacadeHandler, err)
})
t.Run("cast failure should error", func(t *testing.T) {
t.Parallel()

networkGroup, err := groups.NewNetworkGroup(&mock.FacadeStub{})
require.NoError(t, err)

err = networkGroup.UpdateFacade("this is not a facade handler")
require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion))
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

builtInCost := map[string]uint64{
"val1": 1,
}
expectedMap := map[string]map[string]uint64{
common.BuiltInCost: builtInCost,
}
facade := mock.FacadeStub{
GetGasConfigsCalled: func() (map[string]map[string]uint64, error) {
return expectedMap, nil
},
}
networkGroup, err := groups.NewNetworkGroup(&facade)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

L970-L981 function extraction?

require.NoError(t, err)

ws := startWebServer(networkGroup, "network", getNetworkRoutesConfig())

req, _ := http.NewRequest("GET", "/network/gas-configs", nil)
resp := httptest.NewRecorder()
ws.ServeHTTP(resp, req)

assert.Equal(t, resp.Code, http.StatusOK)
response := gasConfigsResponse{}
loadResponse(resp.Body, &response)
assert.Equal(t, builtInCost, response.Data.Configs.BuiltInCost)

expectedErr := errors.New("expected error")
newFacade := mock.FacadeStub{
GetGasConfigsCalled: func() (map[string]map[string]uint64, error) {
return nil, expectedErr
},
}
err = networkGroup.UpdateFacade(&newFacade)
require.NoError(t, err)

req, _ = http.NewRequest("GET", "/network/gas-configs", nil)
resp = httptest.NewRecorder()
ws.ServeHTTP(resp, req)

loadResponse(resp.Body, &response)
assert.Equal(t, http.StatusInternalServerError, resp.Code)
assert.True(t, strings.Contains(response.Error, expectedErr.Error()))
})
}

func TestNetworkGroup_IsInterfaceNil(t *testing.T) {
t.Parallel()

networkGroup, _ := groups.NewNetworkGroup(nil)
require.True(t, networkGroup.IsInterfaceNil())

networkGroup, _ = groups.NewNetworkGroup(&mock.FacadeStub{})
require.False(t, networkGroup.IsInterfaceNil())
}

func getNetworkRoutesConfig() config.ApiRoutesConfig {
return config.ApiRoutesConfig{
APIPackages: map[string]config.APIPackageConfig{
Expand Down
135 changes: 135 additions & 0 deletions api/groups/nodeGroup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,31 @@ func TestP2PStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) {
assert.False(t, strings.Contains(respStr, key))
}

func TestQueryDebug_ShouldBindJSONErrorsShouldErr(t *testing.T) {
t.Parallel()

facade := mock.FacadeStub{
GetQueryHandlerCalled: func(name string) (handler debug.QueryHandler, err error) {
return nil, nil
},
}

nodeGroup, err := groups.NewNodeGroup(&facade)
require.NoError(t, err)

ws := startWebServer(nodeGroup, "node", getNodeRoutesConfig())

req, _ := http.NewRequest("POST", "/node/debug", bytes.NewBuffer([]byte("invalid data")))
resp := httptest.NewRecorder()
ws.ServeHTTP(resp, req)

queryResponse := &generalResponse{}
loadResponse(resp.Body, queryResponse)

assert.Equal(t, http.StatusBadRequest, resp.Code)
assert.Contains(t, queryResponse.Error, apiErrors.ErrValidation.Error())
}

func TestQueryDebug_GetQueryErrorsShouldErr(t *testing.T) {
t.Parallel()

Expand Down Expand Up @@ -485,6 +510,32 @@ func TestPeerInfo_PeerInfoShouldWork(t *testing.T) {
assert.NotNil(t, responseInfo["info"])
}

func TestEpochStartData_InvalidEpochShouldErr(t *testing.T) {
t.Parallel()

facade := mock.FacadeStub{
GetEpochStartDataAPICalled: func(epoch uint32) (*common.EpochStartDataAPI, error) {
return nil, nil
},
}

nodeGroup, err := groups.NewNodeGroup(&facade)
require.NoError(t, err)

ws := startWebServer(nodeGroup, "node", getNodeRoutesConfig())

req, _ := http.NewRequest("GET", "/node/epoch-start/invalid", nil)
resp := httptest.NewRecorder()
ws.ServeHTTP(resp, req)

response := &shared.GenericAPIResponse{}
loadResponse(resp.Body, response)

assert.Equal(t, http.StatusBadRequest, resp.Code)
assert.True(t, strings.Contains(response.Error, apiErrors.ErrValidation.Error()))
assert.True(t, strings.Contains(response.Error, apiErrors.ErrBadUrlParams.Error()))
}

func TestEpochStartData_FacadeErrorsShouldErr(t *testing.T) {
t.Parallel()

Expand Down Expand Up @@ -603,6 +654,90 @@ func TestPrometheusMetrics_ShouldWork(t *testing.T) {
assert.True(t, keyAndValueFoundInResponse)
}

func TestNodeGroup_UpdateFacade(t *testing.T) {
t.Parallel()

t.Run("nil facade should error", func(t *testing.T) {
t.Parallel()

nodeGroup, err := groups.NewNodeGroup(&mock.FacadeStub{})
require.NoError(t, err)

err = nodeGroup.UpdateFacade(nil)
require.Equal(t, apiErrors.ErrNilFacadeHandler, err)
})
t.Run("cast failure should error", func(t *testing.T) {
t.Parallel()

nodeGroup, err := groups.NewNodeGroup(&mock.FacadeStub{})
require.NoError(t, err)

err = nodeGroup.UpdateFacade("this is not a facade handler")
require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion))
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

statusMetricsProvider := statusHandler.NewStatusMetrics()
key := "test-key"
value := uint64(37)
statusMetricsProvider.SetUInt64Value(key, value)

facade := mock.FacadeStub{}
facade.StatusMetricsHandler = func() external.StatusMetricsHandler {
return statusMetricsProvider
}

nodeGroup, err := groups.NewNodeGroup(&facade)
require.NoError(t, err)

ws := startWebServer(nodeGroup, "node", getNodeRoutesConfig())

req, _ := http.NewRequest("GET", "/node/metrics", nil)
resp := httptest.NewRecorder()
ws.ServeHTTP(resp, req)

respBytes, _ := ioutil.ReadAll(resp.Body)
respStr := string(respBytes)
assert.Equal(t, resp.Code, http.StatusOK)
keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", value))
assert.True(t, keyAndValueFoundInResponse)

expectedErr := errors.New("expected error")
newFacade := mock.FacadeStub{
StatusMetricsHandler: func() external.StatusMetricsHandler {
return &testscommon.StatusMetricsStub{
StatusMetricsWithoutP2PPrometheusStringCalled: func() (string, error) {
return "", expectedErr
},
}
},
}

err = nodeGroup.UpdateFacade(&newFacade)
require.NoError(t, err)

req, _ = http.NewRequest("GET", "/node/metrics", nil)
resp = httptest.NewRecorder()
ws.ServeHTTP(resp, req)

assert.Equal(t, http.StatusInternalServerError, resp.Code)
response := &shared.GenericAPIResponse{}
loadResponse(resp.Body, response)
assert.Equal(t, expectedErr.Error(), response.Error)
})
}

func TestNodeGroup_IsInterfaceNil(t *testing.T) {
t.Parallel()

nodeGroup, _ := groups.NewNodeGroup(nil)
require.True(t, nodeGroup.IsInterfaceNil())

nodeGroup, _ = groups.NewNodeGroup(&mock.FacadeStub{})
require.False(t, nodeGroup.IsInterfaceNil())
}

func loadResponseAsString(rsp io.Reader, response *statusResponse) {
buff, err := ioutil.ReadAll(rsp)
if err != nil {
Expand Down
88 changes: 88 additions & 0 deletions api/groups/proofGroup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,94 @@ func TestVerifyProof(t *testing.T) {
assert.True(t, isValid)
}

func TestProofGroup_UpdateFacade(t *testing.T) {
t.Parallel()

t.Run("nil facade should error", func(t *testing.T) {
t.Parallel()

proofGroup, err := groups.NewProofGroup(&mock.FacadeStub{})
require.NoError(t, err)

err = proofGroup.UpdateFacade(nil)
require.Equal(t, apiErrors.ErrNilFacadeHandler, err)
})
t.Run("cast failure should error", func(t *testing.T) {
t.Parallel()

proofGroup, err := groups.NewProofGroup(&mock.FacadeStub{})
require.NoError(t, err)

err = proofGroup.UpdateFacade("this is not a facade handler")
require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion))
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

rootHash := "rootHash"
address := "address"
validProof := []string{hex.EncodeToString([]byte("valid")), hex.EncodeToString([]byte("proof"))}
verifyProofParams := groups.VerifyProofRequest{
RootHash: rootHash,
Address: address,
Proof: validProof,
}
verifyProofBytes, _ := json.Marshal(verifyProofParams)

facade := &mock.FacadeStub{
VerifyProofCalled: func(rH string, addr string, proof [][]byte) (bool, error) {
return true, nil
},
}

proofGroup, err := groups.NewProofGroup(facade)
require.NoError(t, err)

ws := startWebServer(proofGroup, "proof", getProofRoutesConfig())

req, _ := http.NewRequest("POST", "/proof/verify", bytes.NewBuffer(verifyProofBytes))
resp := httptest.NewRecorder()
ws.ServeHTTP(resp, req)

response := shared.GenericAPIResponse{}
loadResponse(resp.Body, &response)
assert.Equal(t, shared.ReturnCodeSuccess, response.Code)
responseMap, ok := response.Data.(map[string]interface{})
assert.True(t, ok)
isValid, ok := responseMap["ok"].(bool)
assert.True(t, ok)
assert.True(t, isValid)

verifyProfErr := fmt.Errorf("VerifyProof err")
newFacade := &mock.FacadeStub{
VerifyProofCalled: func(rootHash string, address string, proof [][]byte) (bool, error) {
return false, verifyProfErr
},
}

err = proofGroup.UpdateFacade(newFacade)
require.NoError(t, err)

req, _ = http.NewRequest("POST", "/proof/verify", bytes.NewBuffer(verifyProofBytes))
resp = httptest.NewRecorder()
ws.ServeHTTP(resp, req)

loadResponse(resp.Body, &response)
assert.Equal(t, shared.ReturnCodeInternalError, response.Code)
assert.True(t, strings.Contains(response.Error, apiErrors.ErrVerifyProof.Error()))
})
}

func TestProofGroup_IsInterfaceNil(t *testing.T) {
t.Parallel()

proofGroup, _ := groups.NewProofGroup(nil)
require.True(t, proofGroup.IsInterfaceNil())

proofGroup, _ = groups.NewProofGroup(&mock.FacadeStub{})
require.False(t, proofGroup.IsInterfaceNil())
}

func getProofRoutesConfig() config.ApiRoutesConfig {
return config.ApiRoutesConfig{
APIPackages: map[string]config.APIPackageConfig{
Expand Down