Skip to content
This repository has been archived by the owner on Oct 21, 2024. It is now read-only.

Commit

Permalink
feat(BUX-207): unify logs (#60)
Browse files Browse the repository at this point in the history
* feat(BUX-207): unify logs

* chore(BUX-207): fix go.mod

* tests(BUX-207): fix tests
  • Loading branch information
pawellewandowski98 authored Dec 22, 2023
1 parent 4679376 commit 525d340
Show file tree
Hide file tree
Showing 21 changed files with 129 additions and 48 deletions.
5 changes: 3 additions & 2 deletions broadcast/broadcast-client/client_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"github.com/bitcoin-sv/go-broadcast-client/broadcast/internal/arc"
"github.com/bitcoin-sv/go-broadcast-client/broadcast/internal/composite"
"github.com/bitcoin-sv/go-broadcast-client/httpclient"
"github.com/rs/zerolog"
)

type builder struct {
Expand All @@ -25,9 +26,9 @@ func (cb *builder) WithHttpClient(client httpclient.HTTPInterface) *builder {

// WithArc sets up the connection of the broadcast client to the Arc service using the provided ArcClientConfig.
// This method can be called multiple times with different ArcClientConfigurations to establish connections to multiple Arc instances.
func (cb *builder) WithArc(config ArcClientConfig) *builder {
func (cb *builder) WithArc(config ArcClientConfig, log *zerolog.Logger) *builder {
cb.factories = append(cb.factories, func() broadcast_api.Client {
return arc.NewArcClient(&config, cb.client)
return arc.NewArcClient(&config, cb.client, log)
})
return cb
}
Expand Down
14 changes: 8 additions & 6 deletions broadcast/internal/acceptance_tests/arc_fee_quote_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package acceptancetests
import (
"context"
"errors"
"github.com/rs/zerolog"
"io"
"net/http"
"strings"
Expand Down Expand Up @@ -47,13 +48,14 @@ var secondSuccessfulFeeQuoteResponse = `
`

func TestFeeQuote(t *testing.T) {
testLogger := zerolog.Nop()
t.Run("Should successfully query from multiple ArcClients", func(t *testing.T) {
// given
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}, &testLogger).
Build()

httpResponse1 := &http.Response{
Expand Down Expand Up @@ -84,8 +86,8 @@ func TestFeeQuote(t *testing.T) {
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}, &testLogger).
Build()

httpResponse := &http.Response{}
Expand All @@ -107,7 +109,7 @@ func TestFeeQuote(t *testing.T) {
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
Build()

httpResponse1 := &http.Response{
Expand All @@ -132,7 +134,7 @@ func TestFeeQuote(t *testing.T) {
httpResponse := &http.Response{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
Build()

httpClientMock.On("DoRequest", mock.Anything, mock.Anything).
Expand Down
14 changes: 8 additions & 6 deletions broadcast/internal/acceptance_tests/arc_policy_quote_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package acceptancetests
import (
"context"
"errors"
"github.com/rs/zerolog"
"io"
"net/http"
"strings"
Expand Down Expand Up @@ -47,13 +48,14 @@ var secondSuccessfulPolicyResponse = `
`

func TestPolicyQuote(t *testing.T) {
testLogger := zerolog.Nop()
t.Run("Should successfully query from multiple ArcClients", func(t *testing.T) {
// given
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}, &testLogger).
Build()

httpResponse1 := &http.Response{
Expand Down Expand Up @@ -84,8 +86,8 @@ func TestPolicyQuote(t *testing.T) {
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}, &testLogger).
Build()

httpResponse := &http.Response{}
Expand All @@ -107,7 +109,7 @@ func TestPolicyQuote(t *testing.T) {
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
Build()

httpResponse1 := &http.Response{
Expand All @@ -132,7 +134,7 @@ func TestPolicyQuote(t *testing.T) {
httpResponse := &http.Response{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
Build()

httpClientMock.On("DoRequest", mock.Anything, mock.Anything).
Expand Down
14 changes: 8 additions & 6 deletions broadcast/internal/acceptance_tests/arc_query_tx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package acceptancetests
import (
"context"
"errors"
"github.com/rs/zerolog"
"io"
"net/http"
"strings"
Expand Down Expand Up @@ -32,13 +33,14 @@ var secondSuccessfulResponse = `
`

func TestQueryTransaction(t *testing.T) {
testLogger := zerolog.Nop()
t.Run("Should successfully query from multiple ArcClients", func(t *testing.T) {
// given
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}, &testLogger).
Build()

httpResponse1 := &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader(firstSuccessfulResponse))}
Expand All @@ -59,8 +61,8 @@ func TestQueryTransaction(t *testing.T) {
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}, &testLogger).
Build()

httpResponse := &http.Response{}
Expand All @@ -80,7 +82,7 @@ func TestQueryTransaction(t *testing.T) {
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
Build()

httpResponse1 := &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader(firstSuccessfulResponse))}
Expand All @@ -100,7 +102,7 @@ func TestQueryTransaction(t *testing.T) {
httpResponse := &http.Response{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
Build()

httpClientMock.On("DoRequest", mock.Anything, mock.Anything).Return(httpResponse, errors.New("http error")).Once()
Expand Down
21 changes: 12 additions & 9 deletions broadcast/internal/acceptance_tests/arc_submit_tx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"github.com/rs/zerolog"
"io"
"net/http"
"strings"
Expand Down Expand Up @@ -34,13 +35,14 @@ var successfulSubmitBatchResponse = `
`

func TestSubmitTransaction(t *testing.T) {
testLogger := zerolog.Nop()
t.Run("Should successfully submit transaction using first of two ArcClients", func(t *testing.T) {
// given
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}, &testLogger).
Build()

httpResponse1 := &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader(successfulSubmitResponse))}
Expand All @@ -65,8 +67,8 @@ func TestSubmitTransaction(t *testing.T) {
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}, &testLogger).
Build()

httpResponse := &http.Response{}
Expand All @@ -89,8 +91,8 @@ func TestSubmitTransaction(t *testing.T) {
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}, &testLogger).
Build()

httpResponse := &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader("invalid-response"))}
Expand All @@ -112,8 +114,8 @@ func TestSubmitTransaction(t *testing.T) {
httpClientMock := &arc.MockHttpClient{}
broadcaster := broadcast_client.Builder().
WithHttpClient(httpClientMock).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc1-api-url", Token: "arc1-token"}, &testLogger).
WithArc(broadcast_client.ArcClientConfig{APIUrl: "http://arc2-api-url", Token: "arc2-token"}, &testLogger).
Build()

httpResponse1 := &http.Response{StatusCode: http.StatusOK, Body: io.NopCloser(strings.NewReader(`{"blockHash": "hash"}`))}
Expand Down Expand Up @@ -241,13 +243,14 @@ func TestSubmitBatchTransactions(t *testing.T) {
func buildBroadcastClient(acrClients uint, httpClient *arc.MockHttpClient) broadcast.Client {
builder := broadcast_client.Builder().
WithHttpClient(httpClient)
testLogger := zerolog.Nop()

for i := uint(0); i < acrClients; i++ {
arc := broadcast_client.ArcClientConfig{
APIUrl: fmt.Sprintf("http://arc%d-api-url", i),
Token: fmt.Sprintf("arc%d-token", i),
}
builder = builder.WithArc(arc)
builder = builder.WithArc(arc, &testLogger)
}

return builder.Build()
Expand Down
10 changes: 8 additions & 2 deletions broadcast/internal/arc/arc_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package arc
import (
broadcast_api "github.com/bitcoin-sv/go-broadcast-client/broadcast"
"github.com/bitcoin-sv/go-broadcast-client/httpclient"
"github.com/rs/zerolog"
)

const (
Expand All @@ -21,16 +22,21 @@ type ArcClient struct {
apiURL string
token string
HTTPClient httpclient.HTTPInterface
Logger *zerolog.Logger
}

func NewArcClient(config Config, client httpclient.HTTPInterface) broadcast_api.Client {
func NewArcClient(config Config, client httpclient.HTTPInterface, log *zerolog.Logger) broadcast_api.Client {
if client == nil {
client = httpclient.NewHttpClient()
}

return &ArcClient{
arcClient := &ArcClient{
apiURL: config.GetApiUrl(),
token: config.GetToken(),
HTTPClient: client,
Logger: log,
}

log.Debug().Msgf("Created new arc client with api url: %s", arcClient.apiURL)
return arcClient
}
2 changes: 2 additions & 0 deletions broadcast/internal/arc/arc_fee_quote.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
func (a *ArcClient) GetFeeQuote(ctx context.Context) ([]*broadcast.FeeQuote, error) {
policyQuotes, err := a.GetPolicyQuote(ctx)
if err != nil {
a.Logger.Error().Msgf("Failed to get policy quote: %s", err.Error())
return nil, err
}

Expand All @@ -20,5 +21,6 @@ func (a *ArcClient) GetFeeQuote(ctx context.Context) ([]*broadcast.FeeQuote, err

feeQuotes := []*broadcast.FeeQuote{feeQuote}

a.Logger.Debug().Msgf("Got fee quote from miner: %s", feeQuote.Miner)
return feeQuotes, nil
}
3 changes: 3 additions & 0 deletions broadcast/internal/arc/arc_fee_quote_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"context"
"errors"
"github.com/rs/zerolog"
"io"
"net/http"
"testing"
Expand Down Expand Up @@ -63,6 +64,7 @@ func TestFeeQuote(t *testing.T) {
t.Run(tc.name, func(t *testing.T) {
// given
mockHttpClient := new(MockHttpClient)
testLogger := zerolog.Nop()

mockHttpClient.On("DoRequest", context.Background(), mock.Anything).
Return(tc.httpResponse, tc.httpError).Once()
Expand All @@ -71,6 +73,7 @@ func TestFeeQuote(t *testing.T) {
HTTPClient: mockHttpClient,
apiURL: "http://example.com",
token: "someToken",
Logger: &testLogger,
}

// when
Expand Down
3 changes: 2 additions & 1 deletion broadcast/internal/arc/arc_policy_quote.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,14 @@ func (a *ArcClient) GetPolicyQuote(ctx context.Context) ([]*broadcast.PolicyQuot

model, err := getPolicyQuote(ctx, a)
if err != nil {
a.Logger.Error().Msgf("Failed to get policy quote: %s", err.Error())
return nil, err
}

model.Miner = a.apiURL

models := []*broadcast.PolicyQuoteResponse{model}

a.Logger.Debug().Msgf("Got policy quote from miner: %s", model.Miner)
return models, nil
}

Expand Down
3 changes: 3 additions & 0 deletions broadcast/internal/arc/arc_policy_quote_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"context"
"errors"
"github.com/rs/zerolog"
"io"
"net/http"
"testing"
Expand Down Expand Up @@ -68,6 +69,7 @@ func TestPolicyQuote(t *testing.T) {
t.Run(tc.name, func(t *testing.T) {
// given
mockHttpClient := new(MockHttpClient)
testLogger := zerolog.Nop()

mockHttpClient.On("DoRequest", context.Background(), mock.Anything).
Return(tc.httpResponse, tc.httpError).Once()
Expand All @@ -76,6 +78,7 @@ func TestPolicyQuote(t *testing.T) {
HTTPClient: mockHttpClient,
apiURL: "http://example.com",
token: "someToken",
Logger: &testLogger,
}

// when
Expand Down
4 changes: 4 additions & 0 deletions broadcast/internal/arc/arc_query_tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,23 @@ var ErrMissingTxID = errors.New("missing tx id")

func (a *ArcClient) QueryTransaction(ctx context.Context, txID string) (*broadcast.QueryTxResponse, error) {
if a == nil {
a.Logger.Error().Msgf("Failed to query tx: %s", broadcast.ErrClientUndefined.Error())
return nil, broadcast.ErrClientUndefined
}

result, err := queryTransaction(ctx, a, txID)
if err != nil {
a.Logger.Error().Msgf("Failed to query tx: %s", err.Error())
return nil, err
}

err = validateQueryTxResponse(result)
if err != nil {
a.Logger.Error().Msgf("Failed to validate query tx response: %s", err.Error())
return nil, err
}

a.Logger.Debug().Msgf("Got query tx response from miner: %s", result.Miner)
return result, nil
}

Expand Down
Loading

0 comments on commit 525d340

Please sign in to comment.