blob: 1fd22c2362bd73d86af78eec42ab873cd6b06efd [file] [log] [blame]
Tom Cherrye18346d2020-05-21 12:13:20 -07001/*
2 * Copyright (C) 2020 The Android Open Source Project
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 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <string>
20#include <vector>
21
22#include <gtest/gtest.h>
23
24#include "ChattyLogBuffer.h"
25#include "LogReaderList.h"
26#include "LogStatistics.h"
27#include "LogTags.h"
Tom Cherry0efb4102020-06-16 10:14:09 -070028#include "PruneList.h"
Tom Cherry1a796bc2020-05-13 09:28:37 -070029#include "SerializedLogBuffer.h"
Tom Cherry8f613462020-05-12 12:46:43 -070030#include "SimpleLogBuffer.h"
Tom Cherrye18346d2020-05-21 12:13:20 -070031
32struct LogMessage {
33 logger_entry entry;
34 std::string message;
35 bool regex_compare = false; // Only set for expected messages, when true 'message' should be
36 // interpretted as a regex.
37};
38
39// Compares the ordered list of expected and result, causing a test failure with appropriate
40// information on failure.
41void CompareLogMessages(const std::vector<LogMessage>& expected,
42 const std::vector<LogMessage>& result);
43// Sets hdr_size and len parameters appropriately.
44void FixupMessages(std::vector<LogMessage>* messages);
45
46class TestWriter : public LogWriter {
47 public:
48 TestWriter(std::vector<LogMessage>* msgs, bool* released)
Tom Cherryeb49b042020-05-28 21:03:43 -070049 : LogWriter(0, true), msgs_(msgs), released_(released) {}
Tom Cherrye18346d2020-05-21 12:13:20 -070050 bool Write(const logger_entry& entry, const char* message) override {
51 msgs_->emplace_back(LogMessage{entry, std::string(message, entry.len), false});
52 return true;
53 }
54
55 void Release() {
56 if (released_) *released_ = true;
57 }
58
59 std::string name() const override { return "test_writer"; }
60
61 private:
62 std::vector<LogMessage>* msgs_;
63 bool* released_;
64};
65
66class LogBufferTest : public testing::TestWithParam<std::string> {
67 protected:
68 void SetUp() override {
69 if (GetParam() == "chatty") {
70 log_buffer_.reset(new ChattyLogBuffer(&reader_list_, &tags_, &prune_, &stats_));
Tom Cherry1a796bc2020-05-13 09:28:37 -070071 } else if (GetParam() == "serialized") {
72 log_buffer_.reset(new SerializedLogBuffer(&reader_list_, &tags_, &stats_));
Tom Cherry8f613462020-05-12 12:46:43 -070073 } else if (GetParam() == "simple") {
74 log_buffer_.reset(new SimpleLogBuffer(&reader_list_, &tags_, &stats_));
Tom Cherrye18346d2020-05-21 12:13:20 -070075 } else {
76 FAIL() << "Unknown buffer type selected for test";
77 }
78 }
79
80 void LogMessages(const std::vector<LogMessage>& messages) {
81 for (auto& [entry, message, _] : messages) {
82 log_buffer_->Log(static_cast<log_id_t>(entry.lid), log_time(entry.sec, entry.nsec),
83 entry.uid, entry.pid, entry.tid, message.c_str(), message.size());
84 }
85 }
86
87 LogReaderList reader_list_;
88 LogTags tags_;
89 PruneList prune_;
Tom Cherryf74503d2020-06-19 12:21:21 -070090 LogStatistics stats_{false, true};
Tom Cherrye18346d2020-05-21 12:13:20 -070091 std::unique_ptr<LogBuffer> log_buffer_;
92};