log_publisher_test.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License").
5  * You may not use this file except in compliance with the License.
6  * A copy of the License is located at
7  *
8  * http://aws.amazon.com/apache2.0
9  *
10  * or in the "license" file accompanying this file. This file is distributed
11  * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12  * express or implied. See the License for the specific language governing
13  * permissions and limitations under the License.
14  */
15 
16 #include <aws/core/Aws.h>
17 #include <aws/logs/model/InputLogEvent.h>
20 #include <gtest/gtest.h>
21 
22 using namespace Aws::CloudWatchLogs;
23 
24 #define _unused(x) ((void)(x))
25 
26 constexpr int WAIT_TIME =
27  2000; // the amount of time (ms) to wait for publisher thread to do its work
28 
30 {
31 public:
32  uint32_t send_logs_call_count{};
33  std::string last_log_group;
34  std::string last_log_stream;
35  std::list<Aws::CloudWatchLogs::Model::InputLogEvent> last_logs;
36  Aws::String next_token;
37  bool fail_cw_log_group{};
38  bool fail_cw_log_stream{};
39  bool fail_cw_create_log_group{};
40  bool fail_cw_create_log_stream{};
41  bool fail_cw_init_token{};
42  bool fail_cw_send_logs{};
43  void Reset()
44  {
45  this->last_log_group = "";
46  this->last_log_stream = "";
47  this->send_logs_call_count = 0;
48  this->fail_cw_log_group = false;
49  this->fail_cw_log_stream = false;
50  this->fail_cw_create_log_group = false;
51  this->fail_cw_create_log_stream = false;
52  this->fail_cw_init_token = false;
53  this->fail_cw_send_logs = false;
54  }
55 
57  Reset();
58  }
59 
61  const std::string & log_group) override
62  {
63  _unused(log_group);
65  }
66 
68  const std::string & log_group, const std::string & log_stream,
69  Aws::CloudWatchLogs::Model::LogStream * log_stream_object) override
70  {
71  _unused(log_group);
72  _unused(log_stream);
73  _unused(log_stream_object);
75  }
76 
78  const std::string & log_group) override
79  {
80  _unused(log_group);
81 
83  }
84 
86  const std::string & log_group, const std::string & log_stream) override
87  {
88  _unused(log_group);
89  _unused(log_stream);
91  }
92 
94  const std::string & log_group,
95  const std::string & log_stream,
96  Aws::String & next_token) override {
97  _unused(log_group);
98  _unused(log_stream );
99  _unused(next_token);
100  if (fail_cw_init_token) {
101 
102  return CW_LOGS_FAILED;
103  } else {
104  next_token = Aws::String("this token has been set");
106  }
107  }
108 
110  Aws::String & next_token,
111  const std::string & last_log_group,
112  const std::string & last_log_stream,
113  std::list<Aws::CloudWatchLogs::Model::InputLogEvent> & logs) override
114  {
115  this->last_log_group = last_log_group;
116  this->last_log_stream = last_log_stream;
117  this->last_logs = logs;
118  this->send_logs_call_count++;
119  this->next_token = next_token;
121  }
122 };
123 
129 class TestLogPublisherFixture : public ::testing::Test
130 {
131 protected:
132 
133  std::list<Aws::CloudWatchLogs::Model::InputLogEvent> logs_list_;
134  Aws::SDKOptions options_;
135  std::shared_ptr<MockCloudWatchFacade> mock_cw_;
136  std::shared_ptr<LogPublisher> publisher_;
137 
139  {
140  EXPECT_EQ(ServiceState::CREATED, publisher_->getState());
141  EXPECT_EQ(true, publisher_->start());
142  EXPECT_EQ(ServiceState::STARTED, publisher_->getState());
143  }
144 
145  void SetUp() override
146  {
147  // the tests require non-empty logs_list_
148  logs_list_.emplace_back();
149  logs_list_.emplace_back();
150  EXPECT_FALSE(logs_list_.empty());
151 
152  mock_cw_ = std::make_shared<MockCloudWatchFacade>();
153  std::shared_ptr<Aws::CloudWatchLogs::Utils::CloudWatchLogsFacade> cw = mock_cw_;
154  publisher_ = std::make_shared<LogPublisher>("test_log_group", "test_log_stream", cw);
155  EXPECT_EQ(LOG_PUBLISHER_RUN_CREATE_GROUP, publisher_->getRunState());
156  }
157 
158  void TearDown() override
159  {
160  publisher_->shutdown();
161  }
162 };
163 
165  ASSERT_TRUE(true);
166 }
167 
168 TEST_F(TestLogPublisherFixture, TestLogPublisher_PublishLogs_ReturnsFalseWhenEmpty)
169 {
170  StartPublisher();
171 
172  //empty list
173  std::list<Aws::CloudWatchLogs::Model::InputLogEvent> empty_list;
174  EXPECT_EQ(Aws::DataFlow::UploadStatus::INVALID_DATA, publisher_->attemptPublish(empty_list));
175  EXPECT_EQ(PublisherState::NOT_CONNECTED, publisher_->getPublisherState());
176 }
177 
178 TEST_F(TestLogPublisherFixture, TestLogPublisher_PublishLogs_ReturnsSuccessWhenListIngested)
179 {
180  StartPublisher();
181 
182  EXPECT_EQ(Aws::DataFlow::UploadStatus::SUCCESS, publisher_->attemptPublish(logs_list_));
183  EXPECT_EQ(PublisherState::CONNECTED, publisher_->getPublisherState());
184  EXPECT_EQ(LOG_PUBLISHER_ATTEMPT_SEND_LOGS, publisher_->getRunState());
185 }
186 
187 TEST_F(TestLogPublisherFixture, TestLogPublisher_CallsSendLogsToCW)
188 {
189  StartPublisher();
190 
191  EXPECT_EQ(Aws::DataFlow::UploadStatus::SUCCESS, publisher_->attemptPublish(logs_list_));
192  EXPECT_EQ(PublisherState::CONNECTED, publisher_->getPublisherState());
193  EXPECT_EQ(1u, mock_cw_->send_logs_call_count);
194  EXPECT_EQ(LOG_PUBLISHER_ATTEMPT_SEND_LOGS, publisher_->getRunState());
195 }
196 
197 TEST_F(TestLogPublisherFixture, TestLogPublisher_FailCreateGroup)
198 {
199  StartPublisher();
200 
201  mock_cw_->fail_cw_log_group = true;
202  mock_cw_->fail_cw_create_log_group = true;
203  EXPECT_EQ(Aws::DataFlow::UploadStatus::FAIL, publisher_->attemptPublish(logs_list_));
204 
205  EXPECT_EQ(LOG_PUBLISHER_RUN_CREATE_GROUP, publisher_->getRunState());
206 }
207 
208 TEST_F(TestLogPublisherFixture, TestLogPublisher_FailCreateStream)
209 {
210  StartPublisher();
211 
212  mock_cw_->fail_cw_log_stream = true;
213  mock_cw_->fail_cw_create_log_stream = true;
214  EXPECT_EQ(Aws::DataFlow::UploadStatus::FAIL, publisher_->attemptPublish(logs_list_));
215 
216  EXPECT_EQ(LOG_PUBLISHER_RUN_CREATE_STREAM, publisher_->getRunState());
217 }
218 
219 TEST_F(TestLogPublisherFixture, TestLogPublisher_FailInitToken)
220 {
221  StartPublisher();
222 
223  mock_cw_->fail_cw_init_token = true;
224  EXPECT_EQ(Aws::DataFlow::UploadStatus::FAIL, publisher_->attemptPublish(logs_list_));
225 
226  EXPECT_EQ(LOG_PUBLISHER_RUN_INIT_TOKEN, publisher_->getRunState());
227 }
228 
229 TEST_F(TestLogPublisherFixture, TestLogPublisher_FailSendLogs)
230 {
231  StartPublisher();
232 
233  mock_cw_->fail_cw_send_logs = true;
234  EXPECT_EQ(Aws::DataFlow::UploadStatus::FAIL, publisher_->attemptPublish(logs_list_));
235 
236  EXPECT_EQ(LOG_PUBLISHER_RUN_INIT_TOKEN, publisher_->getRunState());
237 }
238 
239 TEST_F(TestLogPublisherFixture, TestLogPublisher_FailNotStarted)
240 {
241  EXPECT_EQ(Aws::DataFlow::UploadStatus::FAIL, publisher_->attemptPublish(logs_list_));
242  EXPECT_TRUE(publisher_->shutdown());
243  EXPECT_EQ(Aws::DataFlow::UploadStatus::FAIL, publisher_->attemptPublish(logs_list_));
244 }
constexpr int WAIT_TIME
Aws::CloudWatchLogs::ROSCloudWatchLogsErrors CheckLogGroupExists(const std::string &log_group) override
Check if a log group exists.
std::shared_ptr< MockCloudWatchFacade > mock_cw_
This test requires a fixture to init and shutdown the SDK or else it causes seg faults when trying to...
std::shared_ptr< LogPublisher > publisher_
std::list< Aws::CloudWatchLogs::Model::InputLogEvent > last_logs
Aws::CloudWatchLogs::ROSCloudWatchLogsErrors CheckLogStreamExists(const std::string &log_group, const std::string &log_stream, Aws::CloudWatchLogs::Model::LogStream *log_stream_object) override
Check if a log stream in a log group exists.
This class is a simple Facade over the CloudWatch client. This class is a very small abstraction over...
Aws::CloudWatchLogs::ROSCloudWatchLogsErrors CreateLogStream(const std::string &log_group, const std::string &log_stream) override
Creates a log stream in the specified log group.
Contains Error handling functionality for ROS AWS CloudWatch Logs libraries.
Aws::CloudWatchLogs::ROSCloudWatchLogsErrors GetLogStreamToken(const std::string &log_group, const std::string &log_stream, Aws::String &next_token) override
Gets the next sequence token to use for sending logs to cloudwatch.
Aws::CloudWatchLogs::ROSCloudWatchLogsErrors SendLogsToCloudWatch(Aws::String &next_token, const std::string &last_log_group, const std::string &last_log_stream, std::list< Aws::CloudWatchLogs::Model::InputLogEvent > &logs) override
std::list< Aws::CloudWatchLogs::Model::InputLogEvent > logs_list_
#define _unused(x)
TEST_F(TestLogPublisherFixture, Sanity)
Aws::CloudWatchLogs::ROSCloudWatchLogsErrors CreateLogGroup(const std::string &log_group) override
Creates a log group.
ROSCloudWatchLogsErrors
Defines error return codes for functions This enum defines standard error codes that will be returned...


cloudwatch_logs_common
Author(s): AWS RoboMaker
autogenerated on Fri May 7 2021 02:18:24