11defmodule Cadet.Logger.CloudWatchLoggerTest do
22 use ExUnit.Case , async: false
3+
34 require Logger
45 import Mox
56 alias Cadet.Logger.CloudWatchLogger
@@ -15,36 +16,27 @@ defmodule Cadet.Logger.CloudWatchLoggerTest do
1516 level: :info ,
1617 log_group: "test_log_group" ,
1718 log_stream: "test_log_stream" ,
18- buffer_size: 10 ,
1919 format: "$time $metadata[$level] $message" ,
2020 metadata: [ :request_id ]
2121 )
2222
2323 LoggerBackends . add ( { CloudWatchLogger , :cloudwatch_logger } )
2424
25+ Logger . configure_backend ( :console , level: :error )
26+
2527 on_exit ( fn ->
2628 LoggerBackends . remove ( { CloudWatchLogger , :cloudwatch_logger } )
29+ Logger . configure_backend ( :console , level: :warning )
2730 end )
2831
2932 :ok
3033 end
3134
3235 test "flushes buffered events via ExAws" do
3336 expect ( ExAwsMock , :request , fn % ExAws.Operation.JSON { } = op ->
34- IO . puts ( "ExAws request: #{ inspect ( op ) } " )
35- % { http_method: http_method , data: data , headers: headers , service: service } = op
36-
37- assert http_method == :post
38- assert service == :logs
37+ % { data: data } = op
3938
40- assert headers == [
41- { "x-amz-target" , "Logs_20140328.PutLogEvents" } ,
42- { "content-type" , "application/x-amz-json-1.1" }
43- ]
44-
45- assert data [ "logGroupName" ] == "test_log_group"
46- assert data [ "logStreamName" ] == "test_log_stream"
47- assert is_list ( data [ "logEvents" ] )
39+ assert_config ( op )
4840
4941 assert Enum . all? ( data [ "logEvents" ] , fn event ->
5042 is_map ( event ) and
@@ -55,8 +47,11 @@ defmodule Cadet.Logger.CloudWatchLoggerTest do
5547 assert Enum . all? (
5648 data [ "logEvents" ] ,
5749 fn event ->
58- String . contains? ( event [ "message" ] , "[error] this is an error" ) or
59- String . contains? ( event [ "message" ] , "[warn] this is a warning" )
50+ is_map ( event ) and
51+ Map . has_key? ( event , "message" ) and
52+ ( String . contains? ( event [ "message" ] , "[error] this is an error" ) or
53+ String . contains? ( event [ "message" ] , "[warning] this is a warning" ) or
54+ String . contains? ( event [ "message" ] , "[warn] this is a warning" ) )
6055 end
6156 )
6257
@@ -67,9 +62,70 @@ defmodule Cadet.Logger.CloudWatchLoggerTest do
6762 end )
6863
6964 Logger . error ( "this is an error" )
70- Logger . warn ( "this is a warning" )
65+ Logger . warning ( "this is a warning" )
7166
72- # wait for async flush
67+ # wait for timer to flush the buffer
7368 Process . sleep ( 5100 )
7469 end
70+
71+ test "Force flush the buffer when the buffer size is reached" do
72+ expect ( ExAwsMock , :request , fn % ExAws.Operation.JSON { } = op ->
73+ % { data: data } = op
74+
75+ assert_config ( op )
76+
77+ assert Enum . all? ( data [ "logEvents" ] , fn event ->
78+ is_map ( event ) and
79+ Map . has_key? ( event , "timestamp" ) and
80+ Map . has_key? ( event , "message" )
81+ end )
82+
83+ assert Enum . all? (
84+ data [ "logEvents" ] ,
85+ fn event ->
86+ is_map ( event ) and
87+ Map . has_key? ( event , "message" ) and
88+ ( String . contains? ( event [ "message" ] , "[warning] this is a warning" ) or
89+ String . contains? ( event [ "message" ] , "[warn] this is a warning" ) )
90+ end
91+ )
92+
93+ { :ok ,
94+ % {
95+ status_code: 200
96+ } }
97+ end )
98+
99+ for _ <- 1 .. 1000 do
100+ Logger . warning ( "this is a warning" )
101+ end
102+
103+ # don't wait for timer
104+ Process . sleep ( 100 )
105+ end
106+
107+ test "Failed to send log to CloudWatch" do
108+ expect ( ExAwsMock , :request , 3 , fn % ExAws.Operation.JSON { } = op ->
109+ assert_config ( op )
110+
111+ { :error , "Failed to send log to CloudWatch" }
112+ end )
113+
114+ Logger . warning ( "this is a warning" )
115+
116+ Process . sleep ( 6000 )
117+ end
118+
119+ defp assert_config ( % { http_method: http_method , data: data , headers: headers , service: service } ) do
120+ assert http_method == :post
121+ assert service == :logs
122+
123+ assert headers == [
124+ { "x-amz-target" , "Logs_20140328.PutLogEvents" } ,
125+ { "content-type" , "application/x-amz-json-1.1" }
126+ ]
127+
128+ assert data [ "logGroupName" ] == "test_log_group"
129+ assert data [ "logStreamName" ] == "test_log_stream"
130+ end
75131end
0 commit comments