From d4a6b3e812f3bae58faab2e0db4729e3714de002 Mon Sep 17 00:00:00 2001 From: Matthew Boddewyn <31598686+mattbodd@users.noreply.github.com> Date: Tue, 30 Jan 2024 23:33:32 -0800 Subject: [PATCH] Add initial tests to opentelemetry-appender-log (#1501) --- opentelemetry-appender-log/src/lib.rs | 101 ++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/opentelemetry-appender-log/src/lib.rs b/opentelemetry-appender-log/src/lib.rs index f3b3241c71..66f58feb22 100644 --- a/opentelemetry-appender-log/src/lib.rs +++ b/opentelemetry-appender-log/src/lib.rs @@ -69,3 +69,104 @@ const fn severity_of_level(level: Level) -> Severity { Level::Trace => Severity::Trace, } } + +#[cfg(all(test, feature = "testing", feature = "logs"))] +mod tests { + use super::OpenTelemetryLogBridge; + + use opentelemetry_sdk::{logs::LoggerProvider, testing::logs::InMemoryLogsExporter}; + + use log::{Level, Log}; + + #[test] + fn logbridge_with_default_metadata_is_enabled() { + let exporter = InMemoryLogsExporter::default(); + + let logger_provider = LoggerProvider::builder() + .with_simple_exporter(exporter) + .build(); + + let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider); + + // As a result of using `with_simple_exporter` while building the logger provider, + // the processor used is a `SimpleLogProcessor` which has an implementation of `event_enabled` + // that always returns true. + #[cfg(feature = "logs_level_enabled")] + assert_eq!( + otel_log_appender.enabled(&log::Metadata::builder().build()), + true + ); + #[cfg(not(feature = "logs_level_enabled"))] + assert_eq!( + otel_log_appender.enabled(&log::Metadata::builder().build()), + true + ); + } + + #[test] + fn logbridge_with_record_can_log() { + let exporter = InMemoryLogsExporter::default(); + + let logger_provider = LoggerProvider::builder() + .with_simple_exporter(exporter.clone()) + .build(); + + let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider); + + log::set_boxed_logger(Box::new(otel_log_appender)).unwrap(); + log::set_max_level(Level::Trace.to_level_filter()); + + log::trace!("TRACE"); + log::debug!("DEBUG"); + log::info!("INFO"); + log::warn!("WARN"); + log::error!("ERROR"); + + let logs = exporter.get_emitted_logs().unwrap(); + + assert_eq!(logs.len(), 5); + for log in logs { + let body: String = match log.record.body.as_ref().unwrap() { + super::AnyValue::String(s) => s.to_string(), + _ => panic!("AnyValue::String expected"), + }; + assert_eq!(body, log.record.severity_text.unwrap()); + } + } + + #[test] + fn test_flush() { + let exporter = InMemoryLogsExporter::default(); + + let logger_provider = LoggerProvider::builder() + .with_simple_exporter(exporter) + .build(); + + let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider); + otel_log_appender.flush(); + } + + #[test] + fn check_level_severities() { + assert_eq!( + super::severity_of_level(log::Level::Error), + opentelemetry::logs::Severity::Error + ); + assert_eq!( + super::severity_of_level(log::Level::Warn), + opentelemetry::logs::Severity::Warn + ); + assert_eq!( + super::severity_of_level(log::Level::Info), + opentelemetry::logs::Severity::Info + ); + assert_eq!( + super::severity_of_level(log::Level::Debug), + opentelemetry::logs::Severity::Debug + ); + assert_eq!( + super::severity_of_level(log::Level::Trace), + opentelemetry::logs::Severity::Trace + ); + } +}