alertcontext_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package alertcontext
  2. import (
  3. "fmt"
  4. "testing"
  5. "github.com/crowdsecurity/crowdsec/pkg/models"
  6. "github.com/crowdsecurity/crowdsec/pkg/types"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func TestNewAlertContext(t *testing.T) {
  10. tests := []struct {
  11. name string
  12. contextToSend map[string][]string
  13. valueLength int
  14. expectedErr error
  15. }{
  16. {
  17. name: "basic config test",
  18. contextToSend: map[string][]string{
  19. "test": {"evt.Parsed.source_ip"},
  20. },
  21. valueLength: 100,
  22. expectedErr: nil,
  23. },
  24. }
  25. for _, test := range tests {
  26. fmt.Printf("Running test '%s'\n", test.name)
  27. err := NewAlertContext(test.contextToSend, test.valueLength)
  28. assert.ErrorIs(t, err, test.expectedErr)
  29. }
  30. }
  31. func TestEventToContext(t *testing.T) {
  32. tests := []struct {
  33. name string
  34. contextToSend map[string][]string
  35. valueLength int
  36. events []types.Event
  37. expectedResult models.Meta
  38. }{
  39. {
  40. name: "basic test",
  41. contextToSend: map[string][]string{
  42. "source_ip": {"evt.Parsed.source_ip"},
  43. "nonexistent_field": {"evt.Parsed.nonexist"},
  44. },
  45. valueLength: 100,
  46. events: []types.Event{
  47. {
  48. Parsed: map[string]string{
  49. "source_ip": "1.2.3.4",
  50. "source_machine": "mymachine",
  51. },
  52. },
  53. },
  54. expectedResult: []*models.MetaItems0{
  55. {
  56. Key: "source_ip",
  57. Value: "[\"1.2.3.4\"]",
  58. },
  59. },
  60. },
  61. {
  62. name: "test many events",
  63. contextToSend: map[string][]string{
  64. "source_ip": {"evt.Parsed.source_ip"},
  65. "source_machine": {"evt.Parsed.source_machine"},
  66. "cve": {"evt.Parsed.cve"},
  67. },
  68. valueLength: 100,
  69. events: []types.Event{
  70. {
  71. Parsed: map[string]string{
  72. "source_ip": "1.2.3.4",
  73. "source_machine": "mymachine",
  74. "cve": "CVE-2022-1234",
  75. },
  76. },
  77. {
  78. Parsed: map[string]string{
  79. "source_ip": "1.2.3.4",
  80. "source_machine": "mymachine",
  81. "cve": "CVE-2022-1235",
  82. },
  83. },
  84. {
  85. Parsed: map[string]string{
  86. "source_ip": "1.2.3.4",
  87. "source_machine": "mymachine",
  88. "cve": "CVE-2022-125",
  89. },
  90. },
  91. },
  92. expectedResult: []*models.MetaItems0{
  93. {
  94. Key: "source_ip",
  95. Value: "[\"1.2.3.4\"]",
  96. },
  97. {
  98. Key: "source_machine",
  99. Value: "[\"mymachine\"]",
  100. },
  101. {
  102. Key: "cve",
  103. Value: "[\"CVE-2022-1234\",\"CVE-2022-1235\",\"CVE-2022-125\"]",
  104. },
  105. },
  106. },
  107. {
  108. name: "test many events with result above max length (need truncate, keep only 2 on 3 elements)",
  109. contextToSend: map[string][]string{
  110. "source_ip": {"evt.Parsed.source_ip"},
  111. "source_machine": {"evt.Parsed.source_machine"},
  112. "uri": {"evt.Parsed.uri"},
  113. },
  114. valueLength: 100,
  115. events: []types.Event{
  116. {
  117. Parsed: map[string]string{
  118. "source_ip": "1.2.3.4",
  119. "source_machine": "mymachine",
  120. "uri": "/test/test/test/../../../../../../../../",
  121. },
  122. },
  123. {
  124. Parsed: map[string]string{
  125. "source_ip": "1.2.3.4",
  126. "source_machine": "mymachine",
  127. "uri": "/admin/admin/admin/../../../../../../../../",
  128. },
  129. },
  130. {
  131. Parsed: map[string]string{
  132. "source_ip": "1.2.3.4",
  133. "source_machine": "mymachine",
  134. "uri": "/login/login/login/../../../../../../../../../../../",
  135. },
  136. },
  137. },
  138. expectedResult: []*models.MetaItems0{
  139. {
  140. Key: "source_ip",
  141. Value: "[\"1.2.3.4\"]",
  142. },
  143. {
  144. Key: "source_machine",
  145. Value: "[\"mymachine\"]",
  146. },
  147. {
  148. Key: "uri",
  149. Value: "[\"/test/test/test/../../../../../../../../\",\"/admin/admin/admin/../../../../../../../../\"]",
  150. },
  151. },
  152. },
  153. {
  154. name: "test one events with result above max length (need truncate on one element)",
  155. contextToSend: map[string][]string{
  156. "source_ip": {"evt.Parsed.source_ip"},
  157. "source_machine": {"evt.Parsed.source_machine"},
  158. "uri": {"evt.Parsed.uri"},
  159. },
  160. valueLength: 100,
  161. events: []types.Event{
  162. {
  163. Parsed: map[string]string{
  164. "source_ip": "1.2.3.4",
  165. "source_machine": "mymachine",
  166. "uri": "/test/test/test/../../../../.should_truncate_just_after_this/../../../..../../../../../../../../../../../../../../../end",
  167. },
  168. },
  169. },
  170. expectedResult: []*models.MetaItems0{
  171. {
  172. Key: "source_machine",
  173. Value: "[\"mymachine\"]",
  174. },
  175. {
  176. Key: "uri",
  177. Value: "[\"/test/test/test/../../../../.should_truncate_just_after_this...\"]",
  178. },
  179. {
  180. Key: "source_ip",
  181. Value: "[\"1.2.3.4\"]",
  182. },
  183. },
  184. },
  185. }
  186. for _, test := range tests {
  187. fmt.Printf("Running test '%s'\n", test.name)
  188. err := NewAlertContext(test.contextToSend, test.valueLength)
  189. assert.ErrorIs(t, err, nil)
  190. metas, _ := EventToContext(test.events)
  191. assert.ElementsMatch(t, test.expectedResult, metas)
  192. }
  193. }