From d70123bb062ec4309a3cd33e7407898ec6c07b2a Mon Sep 17 00:00:00 2001 From: "luca.morgese@tno.nl" Date: Thu, 7 Mar 2024 16:53:10 +0100 Subject: [PATCH] add dependency of http capability on http request and tests --- internal/capability/http/http.go | 8 +- test/unittest/capability/http/http_test.go | 169 +++++++++++++++++++++ 2 files changed, 175 insertions(+), 2 deletions(-) diff --git a/internal/capability/http/http.go b/internal/capability/http/http.go index 4e74e173..3f9513b1 100644 --- a/internal/capability/http/http.go +++ b/internal/capability/http/http.go @@ -14,6 +14,7 @@ import ( // Return response type HttpCapability struct { + soarca_http_request http.IHttpRequest } type Empty struct{} @@ -25,6 +26,10 @@ func init() { log = logger.Logger(component, logger.Info, "", logger.Json) } +func New(httpRequest http.IHttpRequest) *HttpCapability { + return &HttpCapability{soarca_http_request: httpRequest} +} + func (httpCapability *HttpCapability) Execute( metadata execution.Metadata, command cacao.Command, @@ -32,14 +37,13 @@ func (httpCapability *HttpCapability) Execute( target cacao.AgentTarget, variables cacao.VariableMap) (cacao.VariableMap, error) { - soarca_http_request := new(http.HttpRequest) soarca_http_options := http.HttpOptions{ Target: &target, Command: &command, Auth: &authentication, } - responseBytes, err := soarca_http_request.Request(soarca_http_options) + responseBytes, err := httpCapability.soarca_http_request.Request(soarca_http_options) if err != nil { log.Error(err) return cacao.VariableMap{}, err diff --git a/test/unittest/capability/http/http_test.go b/test/unittest/capability/http/http_test.go index c5a00680..fc1b9c40 100644 --- a/test/unittest/capability/http/http_test.go +++ b/test/unittest/capability/http/http_test.go @@ -1 +1,170 @@ package http_test + +// Build http capability with New() using mock http Request +// test correct parsing of HttpOptions fields and errors handling + +import ( + "errors" + "fmt" + "soarca/internal/capability/http" + "soarca/models/cacao" + "soarca/models/execution" + mock_request "soarca/test/unittest/mocks/mock_utils/http" + http_request "soarca/utils/http" + "testing" + + "github.com/go-playground/assert/v2" + "github.com/google/uuid" +) + +func TestHTTPOptionsCorrectlyGenerated(t *testing.T) { + mock_http_request := &mock_request.MockHttpRequest{} + httpCapability := http.New(mock_http_request) + + var oauth2_info = cacao.AuthenticationInformation{ + ID: "6ba7b810-9dad-11d1-80b4-00c04fd430c9", + Type: "oauth2", + Token: "this-is-a-test", + } + + target := cacao.AgentTarget{HttpUrl: "https://httpbin.org/post"} + command := cacao.Command{ + Type: "http-api", + Command: "POST / HTTP/1.1", + Headers: map[string]string{"accept": "application/json"}, + } + + var variable1 = cacao.Variable{ + Type: "string", + Name: "test request building", + Value: "", + } + + var executionId, _ = uuid.Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8") + var playbookId, _ = uuid.Parse("d09351a2-a075-40c8-8054-0b7c423db83f") + var stepId, _ = uuid.Parse("81eff59f-d084-4324-9e0a-59e353dbd28f") + metadata := execution.Metadata{ExecutionId: executionId, PlaybookId: playbookId.String(), StepId: stepId.String()} + + httpOptions := http_request.HttpOptions{ + Command: &command, + Target: &target, + Auth: &oauth2_info, + } + + payload := "payload test" + payload_byte := []byte(payload) + mock_http_request.On("Request", httpOptions).Return(payload_byte, nil) + + results, err := httpCapability.Execute( + metadata, + command, + oauth2_info, + target, + cacao.VariableMap{"test": variable1}) + if err != nil { + fmt.Println(err) + t.Fail() + } + assert.Equal(t, results["__soarca_http_result__"].Value, payload) + fmt.Println(results) + + mock_http_request.AssertExpectations(t) +} + +func TestHTTPOptionsEmptyAuth(t *testing.T) { + mock_http_request := &mock_request.MockHttpRequest{} + httpCapability := http.New(mock_http_request) + + target := cacao.AgentTarget{HttpUrl: "https://httpbin.org/post"} + command := cacao.Command{ + Type: "http-api", + Command: "POST / HTTP/1.1", + Headers: map[string]string{"accept": "application/json"}, + } + + var variable1 = cacao.Variable{ + Type: "string", + Name: "test request building", + Value: "", + } + + var executionId, _ = uuid.Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8") + var playbookId, _ = uuid.Parse("d09351a2-a075-40c8-8054-0b7c423db83f") + var stepId, _ = uuid.Parse("81eff59f-d084-4324-9e0a-59e353dbd28f") + metadata := execution.Metadata{ExecutionId: executionId, PlaybookId: playbookId.String(), StepId: stepId.String()} + empty_auth := new(cacao.AuthenticationInformation) + + httpOptions := http_request.HttpOptions{ + Command: &command, + Target: &target, + Auth: empty_auth, + } + + payload := "payload test" + payload_byte := []byte(payload) + mock_http_request.On("Request", httpOptions).Return(payload_byte, nil) + + results, err := httpCapability.Execute( + metadata, + command, + *empty_auth, + target, + cacao.VariableMap{"test": variable1}) + if err != nil { + fmt.Println(err) + t.Fail() + } + assert.Equal(t, results["__soarca_http_result__"].Value, payload) + fmt.Println(results) + + mock_http_request.AssertExpectations(t) +} + +func TestHTTPOptionsEmptyCommand(t *testing.T) { + mock_http_request := &mock_request.MockHttpRequest{} + httpCapability := http.New(mock_http_request) + + target := cacao.AgentTarget{HttpUrl: "https://httpbin.org/post"} + empty_command := new(cacao.Command) + + var oauth2_info = cacao.AuthenticationInformation{ + ID: "6ba7b810-9dad-11d1-80b4-00c04fd430c9", + Type: "oauth2", + Token: "this-is-a-test", + } + + var variable1 = cacao.Variable{ + Type: "string", + Name: "test request building", + Value: "", + } + + var executionId, _ = uuid.Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8") + var playbookId, _ = uuid.Parse("d09351a2-a075-40c8-8054-0b7c423db83f") + var stepId, _ = uuid.Parse("81eff59f-d084-4324-9e0a-59e353dbd28f") + metadata := execution.Metadata{ExecutionId: executionId, PlaybookId: playbookId.String(), StepId: stepId.String()} + + httpOptions := http_request.HttpOptions{ + Command: empty_command, + Target: &target, + Auth: &oauth2_info, + } + + expected_error := errors.New("command pointer is empty") + mock_http_request.On("Request", httpOptions).Return([]byte{}, expected_error) + + results, err := httpCapability.Execute( + metadata, + *empty_command, + oauth2_info, + target, + cacao.VariableMap{"test": variable1}) + if err == nil { + fmt.Println(err) + t.Fail() + } + assert.Equal(t, err, expected_error) + fmt.Println(results) + + mock_http_request.AssertExpectations(t) +}