blob: 8455291f25302d6e8c7d6ede9d2f8858d7ee6c1c [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVELOPER_FORENSICS_TESTING_STUBS_LOGGER_H_
#define SRC_DEVELOPER_FORENSICS_TESTING_STUBS_LOGGER_H_
#include <fuchsia/logger/cpp/fidl.h>
#include <fuchsia/logger/cpp/fidl_test_base.h>
#include <lib/async/dispatcher.h>
#include <lib/zx/time.h>
#include <string>
#include <vector>
#include "src/developer/forensics/testing/stubs/fidl_server.h"
namespace forensics {
namespace stubs {
// Returns a LogMessage with the given severity, message and optional tags.
//
// The process and thread ids are constants. The timestamp is a constant plus the optionally
// provided offset.
fuchsia::logger::LogMessage BuildLogMessage(const int32_t severity, const std::string& text,
const zx::duration timestamp_offset = zx::duration(0),
const std::vector<std::string>& tags = {});
using LoggerBase = SINGLE_BINDING_STUB_FIDL_SERVER(fuchsia::logger, Log);
class Logger : public LoggerBase {
public:
// |fuchsia:logger::Log|
void Listen(::fidl::InterfaceHandle<fuchsia::logger::LogListener> log_listener,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options) override {
FX_NOTREACHED();
}
void DumpLogs(::fidl::InterfaceHandle<fuchsia::logger::LogListener> log_listener,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options) override {
FX_NOTREACHED();
}
void ListenSafe(::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe> log_listener,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options) override;
void DumpLogsSafe(::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe> log_listener,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options) override;
// Injection methods.
void set_messages(const std::vector<fuchsia::logger::LogMessage>& messages) {
messages_ = messages;
}
private:
std::vector<fuchsia::logger::LogMessage> messages_;
};
class LoggerClosesConnection : public LoggerBase {
public:
// |fuchsia:logger::Log|
STUB_METHOD_CLOSES_CONNECTION(ListenSafe,
::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe>,
std::unique_ptr<fuchsia::logger::LogFilterOptions>);
STUB_METHOD_CLOSES_CONNECTION(DumpLogsSafe,
::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe>,
std::unique_ptr<fuchsia::logger::LogFilterOptions>);
};
class LoggerNeverBindsToLogListener : public LoggerBase {
public:
// |fuchsia:logger::Log|
STUB_METHOD_DOES_NOT_RETURN(ListenSafe, ::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe>,
std::unique_ptr<fuchsia::logger::LogFilterOptions>);
STUB_METHOD_DOES_NOT_RETURN(DumpLogsSafe,
::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe>,
std::unique_ptr<fuchsia::logger::LogFilterOptions>);
};
class LoggerUnbindsFromLogListenerAfterOneMessage : public LoggerBase {
public:
// |fuchsia:logger::Log|
void DumpLogsSafe(::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe> log_listener,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options) override;
// Injection methods.
void set_messages(const std::vector<fuchsia::logger::LogMessage>& messages) {
messages_ = messages;
}
private:
std::vector<fuchsia::logger::LogMessage> messages_;
};
class LoggerNeverCallsLogManyBeforeDone : public LoggerBase {
public:
// |fuchsia:logger::Log|
void DumpLogsSafe(::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe> log_listener,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options) override;
};
class LoggerBindsToLogListenerButNeverCalls : public LoggerBase {
public:
// |fuchsia:logger::Log|
void DumpLogsSafe(::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe> log_listener,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options) override;
private:
// Owns the connection with the log listener so that it doesn't get closed when DumpLogs()
// returns and we can test the timeout on the log listener side.
fuchsia::logger::LogListenerSafePtr log_listener_ptr_;
};
class LoggerDelaysAfterOneMessage : public LoggerBase {
public:
LoggerDelaysAfterOneMessage(async_dispatcher_t* dispatcher, zx::duration delay)
: dispatcher_(dispatcher), delay_(delay) {}
// |fuchsia:logger::Log|
void DumpLogsSafe(::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe> log_listener,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options) override;
// Injection methods.
void set_messages(const std::vector<fuchsia::logger::LogMessage>& messages) {
messages_ = messages;
}
private:
async_dispatcher_t* dispatcher_;
zx::duration delay_;
std::vector<fuchsia::logger::LogMessage> messages_;
};
class LoggerDelayedResponses : public LoggerBase {
public:
LoggerDelayedResponses(async_dispatcher_t* dispatcher,
std::vector<std::vector<fuchsia::logger::LogMessage>> dumps,
std::vector<fuchsia::logger::LogMessage> messages,
zx::duration delay_between_responses)
: dispatcher_(dispatcher),
dumps_(dumps),
messages_(messages),
delay_between_responses_(delay_between_responses) {}
// |fuchsia:logger::Log|
void ListenSafe(::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe> log_listener,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options) override;
void DumpLogsSafe(::fidl::InterfaceHandle<fuchsia::logger::LogListenerSafe> log_listener,
std::unique_ptr<fuchsia::logger::LogFilterOptions> options) override;
zx::duration TotalDelayBetweenDumps();
zx::duration TotalDelayBetweenMessages();
private:
async_dispatcher_t* dispatcher_;
std::vector<std::vector<fuchsia::logger::LogMessage>> dumps_;
std::vector<fuchsia::logger::LogMessage> messages_;
zx::duration delay_between_responses_;
fuchsia::logger::LogListenerSafePtr log_listener_ptr_;
};
} // namespace stubs
} // namespace forensics
#endif // SRC_DEVELOPER_FORENSICS_TESTING_STUBS_LOGGER_H_