alerts_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. package apiserver
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "net/http/httptest"
  8. "strings"
  9. "sync"
  10. "testing"
  11. "time"
  12. "github.com/crowdsecurity/crowdsec/pkg/csplugin"
  13. "github.com/crowdsecurity/crowdsec/pkg/models"
  14. "github.com/gin-gonic/gin"
  15. log "github.com/sirupsen/logrus"
  16. "github.com/stretchr/testify/assert"
  17. )
  18. func InitMachineTest() (*gin.Engine, models.WatcherAuthResponse, error) {
  19. router, err := NewAPITest()
  20. if err != nil {
  21. return nil, models.WatcherAuthResponse{}, fmt.Errorf("unable to run local API: %s", err)
  22. }
  23. loginResp, err := LoginToTestAPI(router)
  24. if err != nil {
  25. return nil, models.WatcherAuthResponse{}, fmt.Errorf("%s", err.Error())
  26. }
  27. return router, loginResp, nil
  28. }
  29. func LoginToTestAPI(router *gin.Engine) (models.WatcherAuthResponse, error) {
  30. body, err := CreateTestMachine(router)
  31. if err != nil {
  32. return models.WatcherAuthResponse{}, fmt.Errorf("%s", err.Error())
  33. }
  34. err = ValidateMachine("test")
  35. if err != nil {
  36. log.Fatalln(err.Error())
  37. }
  38. w := httptest.NewRecorder()
  39. req, _ := http.NewRequest("POST", "/v1/watchers/login", strings.NewReader(body))
  40. req.Header.Add("User-Agent", UserAgent)
  41. router.ServeHTTP(w, req)
  42. loginResp := models.WatcherAuthResponse{}
  43. err = json.NewDecoder(w.Body).Decode(&loginResp)
  44. if err != nil {
  45. return models.WatcherAuthResponse{}, fmt.Errorf("%s", err.Error())
  46. }
  47. return loginResp, nil
  48. }
  49. func AddAuthHeaders(request *http.Request, authResponse models.WatcherAuthResponse) {
  50. request.Header.Add("User-Agent", UserAgent)
  51. request.Header.Add("Authorization", fmt.Sprintf("Bearer %s", authResponse.Token))
  52. }
  53. func TestSimulatedAlert(t *testing.T) {
  54. router, loginResp, err := InitMachineTest()
  55. if err != nil {
  56. log.Fatalln(err.Error())
  57. }
  58. alertContentBytes, err := ioutil.ReadFile("./tests/alert_minibulk+simul.json")
  59. if err != nil {
  60. log.Fatal(err)
  61. }
  62. alertContent := string(alertContentBytes)
  63. w := httptest.NewRecorder()
  64. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  65. AddAuthHeaders(req, loginResp)
  66. router.ServeHTTP(w, req)
  67. //exclude decision in simulation mode
  68. w = httptest.NewRecorder()
  69. req, _ = http.NewRequest("GET", "/v1/alerts?simulated=false", strings.NewReader(alertContent))
  70. AddAuthHeaders(req, loginResp)
  71. router.ServeHTTP(w, req)
  72. assert.Equal(t, 200, w.Code)
  73. assert.Contains(t, w.Body.String(), `"message":"Ip 91.121.79.178 performed crowdsecurity/ssh-bf (6 events over `)
  74. assert.NotContains(t, w.Body.String(), `"message":"Ip 91.121.79.179 performed crowdsecurity/ssh-bf (6 events over `)
  75. //include decision in simulation mode
  76. w = httptest.NewRecorder()
  77. req, _ = http.NewRequest("GET", "/v1/alerts?simulated=true", strings.NewReader(alertContent))
  78. AddAuthHeaders(req, loginResp)
  79. router.ServeHTTP(w, req)
  80. assert.Equal(t, 200, w.Code)
  81. assert.Contains(t, w.Body.String(), `"message":"Ip 91.121.79.178 performed crowdsecurity/ssh-bf (6 events over `)
  82. assert.Contains(t, w.Body.String(), `"message":"Ip 91.121.79.179 performed crowdsecurity/ssh-bf (6 events over `)
  83. }
  84. func TestCreateAlert(t *testing.T) {
  85. router, loginResp, err := InitMachineTest()
  86. if err != nil {
  87. log.Fatalln(err.Error())
  88. }
  89. // Create Alert with invalid format
  90. w := httptest.NewRecorder()
  91. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader("test"))
  92. AddAuthHeaders(req, loginResp)
  93. router.ServeHTTP(w, req)
  94. assert.Equal(t, 400, w.Code)
  95. assert.Equal(t, "{\"message\":\"invalid character 'e' in literal true (expecting 'r')\"}", w.Body.String())
  96. // Create Alert with invalid input
  97. alertContentBytes, err := ioutil.ReadFile("./tests/invalidAlert_sample.json")
  98. if err != nil {
  99. log.Fatal(err)
  100. }
  101. alertContent := string(alertContentBytes)
  102. w = httptest.NewRecorder()
  103. req, _ = http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  104. AddAuthHeaders(req, loginResp)
  105. router.ServeHTTP(w, req)
  106. assert.Equal(t, 500, w.Code)
  107. assert.Equal(t, "{\"message\":\"validation failure list:\\n0.scenario in body is required\\n0.scenario_hash in body is required\\n0.scenario_version in body is required\\n0.simulated in body is required\\n0.source in body is required\"}", w.Body.String())
  108. // Create Valid Alert
  109. alertContentBytes, err = ioutil.ReadFile("./tests/alert_sample.json")
  110. if err != nil {
  111. log.Fatal(err)
  112. }
  113. alertContent = string(alertContentBytes)
  114. w = httptest.NewRecorder()
  115. req, _ = http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  116. AddAuthHeaders(req, loginResp)
  117. router.ServeHTTP(w, req)
  118. assert.Equal(t, 201, w.Code)
  119. assert.Equal(t, "[\"1\"]", w.Body.String())
  120. }
  121. func TestCreateAlertChannels(t *testing.T) {
  122. apiServer, err := NewAPIServer()
  123. if err != nil {
  124. log.Fatalln(err.Error())
  125. }
  126. apiServer.controller.PluginChannel = make(chan csplugin.ProfileAlert)
  127. apiServer.InitController()
  128. loginResp, err := LoginToTestAPI(apiServer.router)
  129. if err != nil {
  130. log.Fatalln(err.Error())
  131. }
  132. alertContentBytes, err := ioutil.ReadFile("./tests/alert_ssh-bf.json")
  133. if err != nil {
  134. log.Fatal(err)
  135. }
  136. alertContent := string(alertContentBytes)
  137. var pd csplugin.ProfileAlert
  138. var wg sync.WaitGroup
  139. wg.Add(1)
  140. go func() {
  141. pd = <-apiServer.controller.PluginChannel
  142. wg.Done()
  143. }()
  144. go func() {
  145. for {
  146. w := httptest.NewRecorder()
  147. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  148. AddAuthHeaders(req, loginResp)
  149. apiServer.controller.Router.ServeHTTP(w, req)
  150. break
  151. }
  152. }()
  153. wg.Wait()
  154. assert.Equal(t, len(pd.Alert.Decisions), 1)
  155. apiServer.Close()
  156. }
  157. func TestAlertListFilters(t *testing.T) {
  158. router, loginResp, err := InitMachineTest()
  159. if err != nil {
  160. log.Fatalln(err.Error())
  161. }
  162. alertContentBytes, err := ioutil.ReadFile("./tests/alert_ssh-bf.json")
  163. if err != nil {
  164. log.Fatal(err)
  165. }
  166. alerts := make([]*models.Alert, 0)
  167. if err := json.Unmarshal(alertContentBytes, &alerts); err != nil {
  168. log.Fatal(err)
  169. }
  170. for _, alert := range alerts {
  171. *alert.StartAt = time.Now().UTC().Format(time.RFC3339)
  172. *alert.StopAt = time.Now().UTC().Format(time.RFC3339)
  173. }
  174. alertContent, err := json.Marshal(alerts)
  175. if err != nil {
  176. log.Fatal(err)
  177. }
  178. //create one alert
  179. w := httptest.NewRecorder()
  180. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(string(alertContent)))
  181. AddAuthHeaders(req, loginResp)
  182. router.ServeHTTP(w, req)
  183. //bad filter
  184. w = httptest.NewRecorder()
  185. req, _ = http.NewRequest("GET", "/v1/alerts?test=test", strings.NewReader(string(alertContent)))
  186. AddAuthHeaders(req, loginResp)
  187. router.ServeHTTP(w, req)
  188. assert.Equal(t, 500, w.Code)
  189. assert.Equal(t, "{\"message\":\"Filter parameter 'test' is unknown (=test): invalid filter\"}", w.Body.String())
  190. //get without filters
  191. w = httptest.NewRecorder()
  192. req, _ = http.NewRequest("GET", "/v1/alerts", nil)
  193. AddAuthHeaders(req, loginResp)
  194. router.ServeHTTP(w, req)
  195. assert.Equal(t, 200, w.Code)
  196. //check alert and decision
  197. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  198. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  199. //test decision_type filter (ok)
  200. w = httptest.NewRecorder()
  201. req, _ = http.NewRequest("GET", "/v1/alerts?decision_type=ban", nil)
  202. AddAuthHeaders(req, loginResp)
  203. router.ServeHTTP(w, req)
  204. assert.Equal(t, 200, w.Code)
  205. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  206. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  207. //test decision_type filter (bad value)
  208. w = httptest.NewRecorder()
  209. req, _ = http.NewRequest("GET", "/v1/alerts?decision_type=ratata", nil)
  210. AddAuthHeaders(req, loginResp)
  211. router.ServeHTTP(w, req)
  212. assert.Equal(t, 200, w.Code)
  213. assert.Equal(t, "null", w.Body.String())
  214. //test scope (ok)
  215. w = httptest.NewRecorder()
  216. req, _ = http.NewRequest("GET", "/v1/alerts?scope=Ip", nil)
  217. AddAuthHeaders(req, loginResp)
  218. router.ServeHTTP(w, req)
  219. assert.Equal(t, 200, w.Code)
  220. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  221. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  222. //test scope (bad value)
  223. w = httptest.NewRecorder()
  224. req, _ = http.NewRequest("GET", "/v1/alerts?scope=rarara", nil)
  225. AddAuthHeaders(req, loginResp)
  226. router.ServeHTTP(w, req)
  227. assert.Equal(t, 200, w.Code)
  228. assert.Equal(t, "null", w.Body.String())
  229. //test scenario (ok)
  230. w = httptest.NewRecorder()
  231. req, _ = http.NewRequest("GET", "/v1/alerts?scenario=crowdsecurity/ssh-bf", nil)
  232. AddAuthHeaders(req, loginResp)
  233. router.ServeHTTP(w, req)
  234. assert.Equal(t, 200, w.Code)
  235. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  236. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  237. //test scenario (bad value)
  238. w = httptest.NewRecorder()
  239. req, _ = http.NewRequest("GET", "/v1/alerts?scenario=crowdsecurity/nope", nil)
  240. AddAuthHeaders(req, loginResp)
  241. router.ServeHTTP(w, req)
  242. assert.Equal(t, 200, w.Code)
  243. assert.Equal(t, "null", w.Body.String())
  244. //test ip (ok)
  245. w = httptest.NewRecorder()
  246. req, _ = http.NewRequest("GET", "/v1/alerts?ip=91.121.79.195", nil)
  247. AddAuthHeaders(req, loginResp)
  248. router.ServeHTTP(w, req)
  249. assert.Equal(t, 200, w.Code)
  250. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  251. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  252. //test ip (bad value)
  253. w = httptest.NewRecorder()
  254. req, _ = http.NewRequest("GET", "/v1/alerts?ip=99.122.77.195", nil)
  255. AddAuthHeaders(req, loginResp)
  256. router.ServeHTTP(w, req)
  257. assert.Equal(t, 200, w.Code)
  258. assert.Equal(t, "null", w.Body.String())
  259. //test ip (invalid value)
  260. w = httptest.NewRecorder()
  261. req, _ = http.NewRequest("GET", "/v1/alerts?ip=gruueq", nil)
  262. AddAuthHeaders(req, loginResp)
  263. router.ServeHTTP(w, req)
  264. assert.Equal(t, 500, w.Code)
  265. assert.Equal(t, `{"message":"unable to convert 'gruueq' to int: invalid address: invalid ip address / range"}`, w.Body.String())
  266. //test range (ok)
  267. w = httptest.NewRecorder()
  268. req, _ = http.NewRequest("GET", "/v1/alerts?range=91.121.79.0/24&contains=false", nil)
  269. AddAuthHeaders(req, loginResp)
  270. router.ServeHTTP(w, req)
  271. assert.Equal(t, 200, w.Code)
  272. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  273. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  274. //test range
  275. w = httptest.NewRecorder()
  276. req, _ = http.NewRequest("GET", "/v1/alerts?range=99.122.77.0/24&contains=false", nil)
  277. AddAuthHeaders(req, loginResp)
  278. router.ServeHTTP(w, req)
  279. assert.Equal(t, 200, w.Code)
  280. assert.Equal(t, "null", w.Body.String())
  281. //test range (invalid value)
  282. w = httptest.NewRecorder()
  283. req, _ = http.NewRequest("GET", "/v1/alerts?range=ratata", nil)
  284. AddAuthHeaders(req, loginResp)
  285. router.ServeHTTP(w, req)
  286. assert.Equal(t, 500, w.Code)
  287. assert.Equal(t, `{"message":"unable to convert 'ratata' to int: invalid address: invalid ip address / range"}`, w.Body.String())
  288. //test since (ok)
  289. w = httptest.NewRecorder()
  290. req, _ = http.NewRequest("GET", "/v1/alerts?since=1h", nil)
  291. AddAuthHeaders(req, loginResp)
  292. router.ServeHTTP(w, req)
  293. assert.Equal(t, 200, w.Code)
  294. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  295. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  296. //test since (ok but yelds no results)
  297. w = httptest.NewRecorder()
  298. req, _ = http.NewRequest("GET", "/v1/alerts?since=1ns", nil)
  299. AddAuthHeaders(req, loginResp)
  300. router.ServeHTTP(w, req)
  301. assert.Equal(t, 200, w.Code)
  302. assert.Equal(t, "null", w.Body.String())
  303. //test since (invalid value)
  304. w = httptest.NewRecorder()
  305. req, _ = http.NewRequest("GET", "/v1/alerts?since=1zuzu", nil)
  306. AddAuthHeaders(req, loginResp)
  307. router.ServeHTTP(w, req)
  308. assert.Equal(t, 500, w.Code)
  309. assert.Contains(t, w.Body.String(), `{"message":"while parsing duration: time: unknown unit`)
  310. //test until (ok)
  311. w = httptest.NewRecorder()
  312. req, _ = http.NewRequest("GET", "/v1/alerts?until=1ns", nil)
  313. AddAuthHeaders(req, loginResp)
  314. router.ServeHTTP(w, req)
  315. assert.Equal(t, 200, w.Code)
  316. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  317. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  318. //test until (ok but no return)
  319. w = httptest.NewRecorder()
  320. req, _ = http.NewRequest("GET", "/v1/alerts?until=1m", nil)
  321. AddAuthHeaders(req, loginResp)
  322. router.ServeHTTP(w, req)
  323. assert.Equal(t, 200, w.Code)
  324. assert.Equal(t, "null", w.Body.String())
  325. //test until (invalid value)
  326. w = httptest.NewRecorder()
  327. req, _ = http.NewRequest("GET", "/v1/alerts?until=1zuzu", nil)
  328. AddAuthHeaders(req, loginResp)
  329. router.ServeHTTP(w, req)
  330. assert.Equal(t, 500, w.Code)
  331. assert.Contains(t, w.Body.String(), `{"message":"while parsing duration: time: unknown unit`)
  332. //test simulated (ok)
  333. w = httptest.NewRecorder()
  334. req, _ = http.NewRequest("GET", "/v1/alerts?simulated=true", nil)
  335. AddAuthHeaders(req, loginResp)
  336. router.ServeHTTP(w, req)
  337. assert.Equal(t, 200, w.Code)
  338. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  339. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  340. //test simulated (ok)
  341. w = httptest.NewRecorder()
  342. req, _ = http.NewRequest("GET", "/v1/alerts?simulated=false", nil)
  343. AddAuthHeaders(req, loginResp)
  344. router.ServeHTTP(w, req)
  345. assert.Equal(t, 200, w.Code)
  346. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  347. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  348. //test has active decision
  349. w = httptest.NewRecorder()
  350. req, _ = http.NewRequest("GET", "/v1/alerts?has_active_decision=true", nil)
  351. AddAuthHeaders(req, loginResp)
  352. router.ServeHTTP(w, req)
  353. assert.Equal(t, 200, w.Code)
  354. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  355. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"type":"ban","value":"91.121.79.195"`)
  356. //test has active decision
  357. w = httptest.NewRecorder()
  358. req, _ = http.NewRequest("GET", "/v1/alerts?has_active_decision=false", nil)
  359. AddAuthHeaders(req, loginResp)
  360. router.ServeHTTP(w, req)
  361. assert.Equal(t, 200, w.Code)
  362. assert.Equal(t, "null", w.Body.String())
  363. //test has active decision (invalid value)
  364. w = httptest.NewRecorder()
  365. req, _ = http.NewRequest("GET", "/v1/alerts?has_active_decision=ratatqata", nil)
  366. AddAuthHeaders(req, loginResp)
  367. router.ServeHTTP(w, req)
  368. assert.Equal(t, 500, w.Code)
  369. assert.Equal(t, `{"message":"'ratatqata' is not a boolean: strconv.ParseBool: parsing \"ratatqata\": invalid syntax: unable to parse type"}`, w.Body.String())
  370. }
  371. func TestAlertBulkInsert(t *testing.T) {
  372. router, loginResp, err := InitMachineTest()
  373. if err != nil {
  374. log.Fatalln(err.Error())
  375. }
  376. //insert a bulk of 20 alerts to trigger bulk insert
  377. alertContentBytes, err := ioutil.ReadFile("./tests/alert_bulk.json")
  378. if err != nil {
  379. log.Fatal(err)
  380. }
  381. alertContent := string(alertContentBytes)
  382. w := httptest.NewRecorder()
  383. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  384. AddAuthHeaders(req, loginResp)
  385. router.ServeHTTP(w, req)
  386. w = httptest.NewRecorder()
  387. req, _ = http.NewRequest("GET", "/v1/alerts", strings.NewReader(alertContent))
  388. AddAuthHeaders(req, loginResp)
  389. router.ServeHTTP(w, req)
  390. assert.Equal(t, 200, w.Code)
  391. }
  392. func TestListAlert(t *testing.T) {
  393. router, loginResp, err := InitMachineTest()
  394. if err != nil {
  395. log.Fatalln(err.Error())
  396. }
  397. alertContentBytes, err := ioutil.ReadFile("./tests/alert_sample.json")
  398. if err != nil {
  399. log.Fatal(err)
  400. }
  401. alertContent := string(alertContentBytes)
  402. w := httptest.NewRecorder()
  403. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  404. AddAuthHeaders(req, loginResp)
  405. router.ServeHTTP(w, req)
  406. // List Alert with invalid filter
  407. w = httptest.NewRecorder()
  408. req, _ = http.NewRequest("GET", "/v1/alerts?test=test", nil)
  409. AddAuthHeaders(req, loginResp)
  410. router.ServeHTTP(w, req)
  411. assert.Equal(t, 500, w.Code)
  412. assert.Equal(t, "{\"message\":\"Filter parameter 'test' is unknown (=test): invalid filter\"}", w.Body.String())
  413. // List Alert
  414. w = httptest.NewRecorder()
  415. req, _ = http.NewRequest("GET", "/v1/alerts", nil)
  416. AddAuthHeaders(req, loginResp)
  417. router.ServeHTTP(w, req)
  418. assert.Equal(t, 200, w.Code)
  419. assert.Contains(t, w.Body.String(), "crowdsecurity/test")
  420. }
  421. func TestCreateAlertErrors(t *testing.T) {
  422. router, loginResp, err := InitMachineTest()
  423. if err != nil {
  424. log.Fatalln(err.Error())
  425. }
  426. alertContentBytes, err := ioutil.ReadFile("./tests/alert_sample.json")
  427. if err != nil {
  428. log.Fatal(err)
  429. }
  430. alertContent := string(alertContentBytes)
  431. //test invalid bearer
  432. w := httptest.NewRecorder()
  433. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  434. req.Header.Add("User-Agent", UserAgent)
  435. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", "ratata"))
  436. router.ServeHTTP(w, req)
  437. assert.Equal(t, 401, w.Code)
  438. //test invalid bearer
  439. w = httptest.NewRecorder()
  440. req, _ = http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  441. req.Header.Add("User-Agent", UserAgent)
  442. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token+"s"))
  443. router.ServeHTTP(w, req)
  444. assert.Equal(t, 401, w.Code)
  445. }
  446. func TestDeleteAlert(t *testing.T) {
  447. router, loginResp, err := InitMachineTest()
  448. if err != nil {
  449. log.Fatalln(err.Error())
  450. }
  451. alertContentBytes, err := ioutil.ReadFile("./tests/alert_sample.json")
  452. if err != nil {
  453. log.Fatal(err)
  454. }
  455. alertContent := string(alertContentBytes)
  456. w := httptest.NewRecorder()
  457. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  458. AddAuthHeaders(req, loginResp)
  459. router.ServeHTTP(w, req)
  460. // Fail Delete Alert
  461. w = httptest.NewRecorder()
  462. req, _ = http.NewRequest("DELETE", "/v1/alerts", strings.NewReader(""))
  463. AddAuthHeaders(req, loginResp)
  464. req.RemoteAddr = "127.0.0.2:4242"
  465. router.ServeHTTP(w, req)
  466. assert.Equal(t, 403, w.Code)
  467. assert.Equal(t, `{"message":"access forbidden from this IP (127.0.0.2)"}`, w.Body.String())
  468. // Delete Alert
  469. w = httptest.NewRecorder()
  470. req, _ = http.NewRequest("DELETE", "/v1/alerts", strings.NewReader(""))
  471. AddAuthHeaders(req, loginResp)
  472. req.RemoteAddr = "127.0.0.1:4242"
  473. router.ServeHTTP(w, req)
  474. assert.Equal(t, 200, w.Code)
  475. assert.Equal(t, `{"nbDeleted":"1"}`, w.Body.String())
  476. }