github.com/Axway/agent-sdk@v1.1.101/pkg/transaction/httpprotocolbuilder_test.go (about)

     1  package transaction
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/Axway/agent-sdk/pkg/traceability/redaction"
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  func createHTTPProtocol(uri, method, reqHeaders, resHeaders string, status, reqLen, resLen int, redactionConfig redaction.Redactions) (TransportProtocol, error) {
    11  	redaction.SetupGlobalRedaction(redaction.Config{})
    12  	return NewHTTPProtocolBuilder().
    13  		SetURI(uri).
    14  		SetVersion("1.1").
    15  		SetArgs(`{"param1": ["date"], "param2": ["day, time"]}`).
    16  		SetMethod(method).
    17  		SetStatus(status, "statusTxt").
    18  		SetUserAgent("userAgent").
    19  		SetHost("host").
    20  		SetByteLength(reqLen, resLen).
    21  		SetRemoteAddress("remoteName", "remoteAddr", 2222).
    22  		SetLocalAddress("localAddr", 1111).
    23  		SetAuthSubjectID("authsubject").
    24  		SetSSLProperties("TLS1.1", "sslServer", "sslSubject").
    25  		SetHeaders(reqHeaders, resHeaders).
    26  		SetIndexedHeaders(`{"indexedrequest": "value", "x-amplify-indexed": "random", "x-amplify-indexedagain": "else"}`,
    27  			`{"indexedresponse": "value", "x-indexedresponse": "random", "x-indexed": "test"}`).
    28  		SetPayload("requestPayload", "responsePayload").
    29  		SetWAFStatus(1).
    30  		SetRedactionConfig(redactionConfig).
    31  		Build()
    32  }
    33  
    34  func TestHTTPProtocolBuilder(t *testing.T) {
    35  	config := redaction.Config{
    36  		Path: redaction.Path{
    37  			Allowed: []redaction.Show{},
    38  		},
    39  		Args: redaction.Filter{
    40  			Allowed:  []redaction.Show{},
    41  			Sanitize: []redaction.Sanitize{},
    42  		},
    43  		RequestHeaders: redaction.Filter{
    44  			Allowed:  []redaction.Show{},
    45  			Sanitize: []redaction.Sanitize{},
    46  		},
    47  		ResponseHeaders: redaction.Filter{
    48  			Allowed:  []redaction.Show{},
    49  			Sanitize: []redaction.Sanitize{},
    50  		},
    51  		MaskingCharacters: "{*}",
    52  		JMSProperties: redaction.Filter{
    53  			Allowed:  []redaction.Show{},
    54  			Sanitize: []redaction.Sanitize{},
    55  		},
    56  	}
    57  
    58  	redactionConfig, _ := config.SetupRedactions()
    59  
    60  	httpProtocol, err := createHTTPProtocol("/testuri", "GET", `{"request": "value", "x-amplify-something": "random", "x-amplify-somethingelse": "else"}`,
    61  		`{"response": "value", "x-response": "random", "x-value": "test"}`, 200, 10, 10, redactionConfig)
    62  	assert.Nil(t, err)
    63  	assert.NotNil(t, httpProtocol)
    64  
    65  	httpProtocolBuilder := NewHTTPProtocolBuilder()
    66  
    67  	httpProtocol, err = httpProtocolBuilder.Build()
    68  	assert.Nil(t, httpProtocol)
    69  	assert.NotNil(t, err)
    70  	assert.Equal(t, "Raw Uri property not set in HTTP protocol details", err.Error())
    71  
    72  	httpProtocol, err = httpProtocolBuilder.
    73  		SetURI("/test").
    74  		Build()
    75  	assert.Nil(t, httpProtocol)
    76  	assert.NotNil(t, err)
    77  	assert.Equal(t, "method property not set in HTTP protocol details", err.Error())
    78  	httpProtocol, err = httpProtocolBuilder.
    79  		SetURI("/test").
    80  		SetMethod("GET").
    81  		Build()
    82  	assert.Nil(t, httpProtocol)
    83  	assert.NotNil(t, err)
    84  	assert.Equal(t, "host property not set in HTTP protocol details", err.Error())
    85  
    86  	httpProtocol, err = httpProtocolBuilder.
    87  		SetURI("/test").
    88  		SetMethod("GET").
    89  		SetHost("host").
    90  		SetStatus(20, "OK").
    91  		Build()
    92  	assert.Nil(t, httpProtocol)
    93  	assert.NotNil(t, err)
    94  	assert.Equal(t, "invalid status code set in HTTP protocol details", err.Error())
    95  
    96  	httpProtocol, err = httpProtocolBuilder.
    97  		SetURI("/test").
    98  		SetMethod("GET").
    99  		SetHost("host").
   100  		SetStatus(200, "OK").
   101  		Build()
   102  	assert.Nil(t, err)
   103  	assert.NotNil(t, httpProtocol)
   104  
   105  	httpProtocol, err = httpProtocolBuilder.
   106  		SetURI("/test").
   107  		SetMethod("GET").
   108  		SetHost("host").
   109  		SetStatus(200, "OK").
   110  		AddArg("newarg", []string{"one", "two"}).
   111  		Build()
   112  	assert.Nil(t, err)
   113  	assert.NotNil(t, httpProtocol)
   114  
   115  	httpProtocol, err = httpProtocolBuilder.
   116  		SetURI("/test").
   117  		SetMethod("GET").
   118  		SetHost("host").
   119  		SetStatus(200, "OK").
   120  		SetArgsMap(map[string][]string{"test": {"one", "two"}}).
   121  		Build()
   122  	assert.Nil(t, err)
   123  	assert.NotNil(t, httpProtocol)
   124  
   125  	httpProtocol, err = httpProtocolBuilder.
   126  		SetURI("/test").
   127  		SetMethod("GET").
   128  		SetHost("host").
   129  		SetStatus(200, "OK").
   130  		SetRequestHeaders(map[string]string{"reqHead": "one"}).
   131  		SetResponseHeaders(map[string]string{"rspHead": "two"}).
   132  		Build()
   133  	assert.Nil(t, err)
   134  	assert.NotNil(t, httpProtocol)
   135  
   136  	httpProtocol, err = httpProtocolBuilder.
   137  		SetURI("/test").
   138  		SetMethod("GET").
   139  		SetHost("host").
   140  		SetStatus(200, "OK").
   141  		AddRequestHeader("key", "two").
   142  		AddResponseHeader("key", "two").
   143  		Build()
   144  	assert.Nil(t, err)
   145  	assert.NotNil(t, httpProtocol)
   146  
   147  	httpProtocol, err = httpProtocolBuilder.
   148  		SetURI("/test").
   149  		SetMethod("GET").
   150  		SetHost("host").
   151  		SetStatus(200, "OK").
   152  		SetIndexedRequestHeaders(map[string]string{"test": "one"}).
   153  		SetIndexedResponseHeaders(map[string]string{"test": "two"}).
   154  		Build()
   155  	assert.Nil(t, err)
   156  	assert.NotNil(t, httpProtocol)
   157  
   158  	httpProtocol, err = httpProtocolBuilder.
   159  		SetURI("/test").
   160  		SetMethod("GET").
   161  		SetHost("host").
   162  		SetStatus(200, "OK").
   163  		AddIndexedRequestHeader("key", "one").
   164  		AddIndexedResponseHeader("key", "two").
   165  		Build()
   166  	assert.Nil(t, err)
   167  	assert.NotNil(t, httpProtocol)
   168  
   169  	httpProtocol, err = httpProtocolBuilder.
   170  		SetURI("/test").
   171  		SetMethod("GET").
   172  		SetHost("host").
   173  		SetStatus(200, "OK").
   174  		SetArgsMap(map[string][]string{"test": {"one", "two"}}).
   175  		SetRedactionConfig(redactionConfig).
   176  		Build()
   177  	assert.Nil(t, err)
   178  	assert.NotNil(t, httpProtocol)
   179  }
   180  
   181  type redactionTest struct {
   182  	uriRedactionCalled             bool
   183  	pathRedactionCalled            bool
   184  	queryArgsRedactionCalled       bool
   185  	queryArgsRedactionStringCalled bool
   186  	requestHeadersRedactionCalled  bool
   187  	responseHeadersRedactionCalled bool
   188  	jmsPropertiesRedactionCalled   bool
   189  }
   190  
   191  func (r *redactionTest) URIRedaction(uri string) (string, error) {
   192  	r.uriRedactionCalled = true
   193  	return "test", nil
   194  }
   195  
   196  func (r *redactionTest) PathRedaction(path string) string {
   197  	r.pathRedactionCalled = true
   198  	return "test"
   199  }
   200  
   201  func (r *redactionTest) QueryArgsRedaction(queryArgs map[string][]string) (map[string][]string, error) {
   202  	r.queryArgsRedactionCalled = true
   203  	return queryArgs, nil
   204  }
   205  
   206  func (r *redactionTest) QueryArgsRedactionString(queryArgs string) (string, error) {
   207  	r.queryArgsRedactionStringCalled = true
   208  	return queryArgs, nil
   209  }
   210  
   211  func (r *redactionTest) RequestHeadersRedaction(requestHeaders map[string]string) (map[string]string, error) {
   212  	r.requestHeadersRedactionCalled = true
   213  	return requestHeaders, nil
   214  }
   215  
   216  func (r *redactionTest) ResponseHeadersRedaction(responseHeaders map[string]string) (map[string]string, error) {
   217  	r.responseHeadersRedactionCalled = true
   218  	return responseHeaders, nil
   219  }
   220  
   221  func (r *redactionTest) JMSPropertiesRedaction(jmsProperties map[string]string) (map[string]string, error) {
   222  	r.jmsPropertiesRedactionCalled = true
   223  	return jmsProperties, nil
   224  }
   225  func TestRedactionOverride(t *testing.T) {
   226  
   227  	redactionConfig := &redactionTest{}
   228  
   229  	httpProtocolBuilder := NewHTTPProtocolBuilder()
   230  
   231  	httpProtocol, err := httpProtocolBuilder.
   232  		SetURI("/test").
   233  		SetMethod("GET").
   234  		SetHost("host").
   235  		SetStatus(200, "OK").
   236  		SetArgsMap(map[string][]string{"test": {"one", "two"}}).
   237  		AddRequestHeader("key", "one").
   238  		AddResponseHeader("key", "two").
   239  		SetRedactionConfig(redactionConfig).
   240  		Build()
   241  	assert.Nil(t, err)
   242  	assert.NotNil(t, httpProtocol)
   243  	assert.True(t, redactionConfig.uriRedactionCalled)
   244  	assert.False(t, redactionConfig.pathRedactionCalled)
   245  	assert.True(t, redactionConfig.queryArgsRedactionCalled)
   246  	assert.False(t, redactionConfig.queryArgsRedactionStringCalled)
   247  	assert.True(t, redactionConfig.requestHeadersRedactionCalled)
   248  	assert.True(t, redactionConfig.responseHeadersRedactionCalled)
   249  	assert.False(t, redactionConfig.jmsPropertiesRedactionCalled)
   250  }