From 0081f86f0d2389727345f124fd0b3652e192da1e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Oct 2022 17:18:21 +0200 Subject: [PATCH 1/8] src/api/interface.go: Adding ApiArguments struct. --- src/api/interface.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/api/interface.go b/src/api/interface.go index 910b6ac..e6233bc 100644 --- a/src/api/interface.go +++ b/src/api/interface.go @@ -5,6 +5,16 @@ import ( "github.com/eosswedenorg-go/haproxy/agentcheck" ) +/** + * Generic struct that is passed to factory functions + * to configure the API request. + */ +type ApiArguments struct { + Url string + Host string + NumBlocks int +} + type ApiInterface interface { // Returns Logging information From 6e8ffe718e2e2644519b05ad8f2ebd2dc9e90d3e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Oct 2022 17:22:33 +0200 Subject: [PATCH 2/8] src/api/interface.go: Adding Factory function type. --- src/api/interface.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/api/interface.go b/src/api/interface.go index e6233bc..dcb5760 100644 --- a/src/api/interface.go +++ b/src/api/interface.go @@ -15,6 +15,14 @@ type ApiArguments struct { NumBlocks int } +/** + * Factory function + * + * Each API must implement this function and process `args` + * returing a instance of it's implementation of the ApiInterface +*/ +type Factory func(args ApiArguments) ApiInterface + type ApiInterface interface { // Returns Logging information From 39927a2441e33335838a18bac2455cc465a3b976 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Oct 2022 17:31:36 +0200 Subject: [PATCH 3/8] src/api/debug.go: Adding DebugApiFactory function --- src/api/debug.go | 4 ++++ src/api/debug_test.go | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/api/debug.go b/src/api/debug.go index f6a0fef..a9fa905 100644 --- a/src/api/debug.go +++ b/src/api/debug.go @@ -25,6 +25,10 @@ func parseResponse(resp string) (agentcheck.Response, error) { return agentcheck.NewStatusResponse(rtype), nil } +func DebugApiFactory(args ApiArguments) ApiInterface { + return NewDebugApi(args.Url) +} + func NewDebugApi(response string) DebugApi { resp, _ := parseResponse(response) diff --git a/src/api/debug_test.go b/src/api/debug_test.go index 12078d1..d262cf3 100644 --- a/src/api/debug_test.go +++ b/src/api/debug_test.go @@ -7,6 +7,18 @@ import ( "github.com/eosswedenorg-go/haproxy/agentcheck" ) +func TestDebugApiFactory(t *testing.T) { + + api := DebugApiFactory(ApiArguments{ + Url: "up", + Host: "host", + NumBlocks: 40, + }) + + assert.IsType(t, DebugApi{}, api) + assert.Equal(t, api.(DebugApi).response, agentcheck.NewStatusResponse(agentcheck.Up)) +} + func TestNewDebugApi(t *testing.T) { type args struct { response string From 7b78d2632b7131bf8f44f254fea08936505c3a65 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Oct 2022 17:42:30 +0200 Subject: [PATCH 4/8] src/api/eosio_v1.go: Adding EosioV1Factory function --- src/api/eosio_v1.go | 4 ++++ src/api/eosio_v1_test.go | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/api/eosio_v1.go b/src/api/eosio_v1.go index c9fce59..193bac4 100644 --- a/src/api/eosio_v1.go +++ b/src/api/eosio_v1.go @@ -14,6 +14,10 @@ type EosioV1 struct { block_time float64 } +func EosioV1Factory(args ApiArguments) ApiInterface { + return NewEosioV1(args.Url, args.Host, float64(args.NumBlocks / 2)) +} + func NewEosioV1(url string, host string, block_time float64) EosioV1 { api := EosioV1{ diff --git a/src/api/eosio_v1_test.go b/src/api/eosio_v1_test.go index eba6f63..251d9ff 100644 --- a/src/api/eosio_v1_test.go +++ b/src/api/eosio_v1_test.go @@ -10,6 +10,22 @@ import ( "github.com/eosswedenorg-go/haproxy/agentcheck" ) +func TestEosioV1Factory(t *testing.T) { + + api := EosioV1Factory(ApiArguments{ + Url: "https://api.v1.example.com", + Host: "host.example.com", + NumBlocks: 120, + }) + + expected := NewEosioV1("https://api.v1.example.com", "host.example.com", 60) + + assert.IsType(t, expected, api) + assert.Equal(t, expected.client.Url, api.(EosioV1).client.Url) + assert.Equal(t, expected.client.Host, api.(EosioV1).client.Host) + assert.Equal(t, expected.block_time, api.(EosioV1).block_time) +} + func TestEosioV1LogInfo(t *testing.T) { api := NewEosioV1("https://api.v1.example.com", "host.example.com", 120) From 9fcffe375adeb0b86bd2ca33b876f5dc5069b0b1 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Oct 2022 17:42:46 +0200 Subject: [PATCH 5/8] src/api/eosio_v2.go: Adding EosioV2Factory function --- src/api/eosio_v2.go | 4 ++++ src/api/eosio_v2_test.go | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/api/eosio_v2.go b/src/api/eosio_v2.go index 196d314..f72d390 100644 --- a/src/api/eosio_v2.go +++ b/src/api/eosio_v2.go @@ -13,6 +13,10 @@ type EosioV2 struct { offset int64 } +func EosioV2Factory(args ApiArguments) ApiInterface { + return NewEosioV2(args.Url, args.Host, int64(args.NumBlocks)) +} + func NewEosioV2(url string, host string, offset int64) EosioV2 { api := EosioV2{ diff --git a/src/api/eosio_v2_test.go b/src/api/eosio_v2_test.go index b59be29..ee40188 100644 --- a/src/api/eosio_v2_test.go +++ b/src/api/eosio_v2_test.go @@ -9,6 +9,22 @@ import ( "github.com/eosswedenorg-go/haproxy/agentcheck" ) +func TestEosioV2Factory(t *testing.T) { + + api := EosioV2Factory(ApiArguments{ + Url: "https://api.v2.example.com", + Host: "host.example.com", + NumBlocks: 120, + }) + + expected := NewEosioV2("https://api.v2.example.com", "host.example.com", 120) + + assert.IsType(t, expected, api) + assert.Equal(t, expected.client.Url, api.(EosioV2).client.Url) + assert.Equal(t, expected.client.Host, api.(EosioV2).client.Host) + assert.Equal(t, expected.offset, api.(EosioV2).offset) +} + func TestEosioV2LogInfo(t *testing.T) { api := NewEosioV2("https://api.v2.example.com", "host.example.com", 120) From d8c8c14edcc047650e49b30b5a5d0e0f12f7e186 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Oct 2022 17:43:16 +0200 Subject: [PATCH 6/8] src/api/eosio_contract.go: Adding EosioContractFactory function --- src/api/eosio_contract.go | 4 ++++ src/api/eosio_contract_test.go | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/api/eosio_contract.go b/src/api/eosio_contract.go index a53cd20..8bc8687 100644 --- a/src/api/eosio_contract.go +++ b/src/api/eosio_contract.go @@ -14,6 +14,10 @@ type EosioContract struct { block_time float64 } +func EosioContractFactory(args ApiArguments) ApiInterface { + return NewEosioContract(args.Url, float64(args.NumBlocks / 2)) +} + func NewEosioContract(url string, block_time float64) EosioContract { return EosioContract{ client: contract_api.Client{ diff --git a/src/api/eosio_contract_test.go b/src/api/eosio_contract_test.go index a5561b9..9c1520f 100644 --- a/src/api/eosio_contract_test.go +++ b/src/api/eosio_contract_test.go @@ -10,6 +10,21 @@ import ( "github.com/eosswedenorg-go/haproxy/agentcheck" ) +func TestEosioContractFactory(t *testing.T) { + + api := EosioContractFactory(ApiArguments{ + Url: "https://atomic.example.com", + NumBlocks: 120, + }) + + expected := NewEosioContract("https://atomic.example.com", 60) + + assert.IsType(t, expected, api) + assert.Equal(t, expected.client.Url, api.(EosioContract).client.Url) + assert.Equal(t, expected.client.Host, api.(EosioContract).client.Host) + assert.Equal(t, expected.block_time, api.(EosioContract).block_time) +} + func TestEosioContractLogInfo(t *testing.T) { api := NewEosioContract("https://atomic.example.com", 120) From b41fb21f6abd27ef89ae52c0ca417a9057767091 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Oct 2022 17:46:32 +0200 Subject: [PATCH 7/8] src/parse_request.go: use api.ApiArguments instead of arguments struct --- src/parse_request.go | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/parse_request.go b/src/parse_request.go index 662b653..75cd4fd 100644 --- a/src/parse_request.go +++ b/src/parse_request.go @@ -8,32 +8,26 @@ import ( "github.com/eosswedenorg/eosio-api-healthcheck/src/api" ) -type arguments struct { - url string - host string - num_blocks int -} +func ParseArguments(args []string) api.ApiArguments { -func ParseArguments(args []string) arguments { - - a := arguments{ - num_blocks: 10, + a := api.ApiArguments{ + NumBlocks: 10, } // 1. url (scheme + ip/domain + port) - a.url = args[0] + a.Url = args[0] // 2. num blocks if len(args) > 1 { num, err := strconv.ParseInt(args[1], 10, 32) if err == nil { - a.num_blocks = int(num) + a.NumBlocks = int(num) } } // 3. Host if len(args) > 2 { - a.host = args[2] + a.Host = args[2] } return a @@ -53,13 +47,13 @@ func ParseRequest(request string) (api.ApiInterface, error) { switch p[0] { case "v1": - return api.NewEosioV1(a.url, a.host, float64(a.num_blocks / 2)), nil + return api.NewEosioV1(a.Url, a.Host, float64(a.NumBlocks / 2)), nil case "v2": - return api.NewEosioV2(a.url, a.host, int64(a.num_blocks)), nil + return api.NewEosioV2(a.Url, a.Host, int64(a.NumBlocks)), nil case "contract": - return api.NewEosioContract(a.url, float64(a.num_blocks / 2)), nil + return api.NewEosioContract(a.Url, float64(a.NumBlocks / 2)), nil case "debug": - return api.NewDebugApi(a.url), nil + return api.NewDebugApi(a.Url), nil } return nil, fmt.Errorf("invalid API '%s'", p[0]) From 15ff583035aec573d6be469bc697d7a2bead45e0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Oct 2022 17:48:57 +0200 Subject: [PATCH 8/8] src/parse_request.go: in ParseRequest() change switch case into a map with factory functions. --- src/parse_request.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/parse_request.go b/src/parse_request.go index 75cd4fd..c175c4a 100644 --- a/src/parse_request.go +++ b/src/parse_request.go @@ -35,6 +35,13 @@ func ParseArguments(args []string) api.ApiArguments { func ParseRequest(request string) (api.ApiInterface, error) { + factories := map[string]api.Factory{ + "v1": api.EosioV1Factory, + "v2": api.EosioV2Factory, + "contract": api.EosioContractFactory, + "debug": api.DebugApiFactory, + } + // Parse arguments. // ------------------- p := strings.Split(strings.TrimSpace(request), "|") @@ -45,15 +52,8 @@ func ParseRequest(request string) (api.ApiInterface, error) { a := ParseArguments(p[1:]) - switch p[0] { - case "v1": - return api.NewEosioV1(a.Url, a.Host, float64(a.NumBlocks / 2)), nil - case "v2": - return api.NewEosioV2(a.Url, a.Host, int64(a.NumBlocks)), nil - case "contract": - return api.NewEosioContract(a.Url, float64(a.NumBlocks / 2)), nil - case "debug": - return api.NewDebugApi(a.Url), nil + if factory, ok := factories[p[0]]; ok { + return factory(a), nil } return nil, fmt.Errorf("invalid API '%s'", p[0])