Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-log

Structured event logging for Pudu: message templates, enrichment, filtering, formatting, and sinks

0.1.0Apache-2.01

InstallClose

MemoryTest.pudu

Pudu55 lines2.5 KB

GitHub ↗
1/** @Test.Sinks.Memory.Suite — in-memory event storage and queries */2module PuduLangLog.Sinks.MemoryTest34import Std.Concurrent as Concurrent5import Std.Io as Io6import Std.Option as Option7import Std.Test as Test8import PuduLangLog.Clock as Clock9import PuduLangLog.Configuration as Configuration10import PuduLangLog as Log11import PuduLangLog.Logger as Logger12import PuduLangLog.Sinks.Memory as Memory13import PuduLangLog.Value as Value1415/// Runs the suite.16fn main() -> Int {17  let memory = Memory.create()18  let logger = Configuration.create().clock(Clock.fixed(Log.Timestamp{millis: 0, offset: 0})).writeTo(Memory.sink(&memory)).createLogger()19  let empty = Memory.latest(&memory)20  logger.information("Order \{Id\} placed", [Value.int(1)])21  logger.warning("Order \{Id\} late", [Value.int(2)])22  logger.information("Order \{Id\} placed", [Value.int(3)])23  let placed = Memory.withTemplate(&memory, "Order \{Id\} placed")24  let warnings = Memory.matching(&memory, fn(event: &Log.Event) -> Bool { event.level == Log.Warning })25  let latest = Memory.latest(&memory)26  let recent = Memory.bounded(2)27  let bounded = Configuration.create().writeTo(Memory.sink(&recent)).createLogger()28  for number in [1, 2, 3] { bounded.information("\{N\}", [Value.int(number)]) }29  let shared = Memory.create()30  let concurrent = Configuration.create().writeTo(Memory.sink(&shared)).createLogger()31  var actions: Array[fn() -> ()] = []32  for _worker in [1, 2, 3, 4] {33    actions = actions.push(fn() -> () { for number in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] { concurrent.information("\{N\}", [Value.int(number)]) } })34  }35  let _ran = Concurrent.parallel(&actions)36  let checks = Test.suite("Sinks.Memory", &[37      Test.equals("nothing is latest at first", &empty, &None),38      Test.equals("messages in order", &Memory.messages(&memory), &["Order 1 placed", "Order 2 late", "Order 3 placed"]),39      Test.equals("events by template", &placed.length(), &2),40      Test.equals("events by predicate", &warnings.length(), &1),41      Test.equals("the latest event", &Option.map(latest, |event: Log.Event| event.properties), &Some([Value.property("Id", Value.int(3))])),42      Test.equals("a bounded store keeps the newest", &Memory.messages(&recent), &["2", "3"]),43      Test.equals("concurrent writers lose nothing", &Memory.events(&shared).length(), &40),44      Test.that("clearing forgets everything", {45          Memory.clear(&memory)46          Memory.events(&memory).isEmpty()47        })48    ])49  let ran = Test.run(&checks)50  for failure in Test.failuresOf(&ran) {51    let _reported = Io.writeErrorLine(failure)52  }53  Test.report(&ran)54}55