tests/testthat/test_AppenderAWSCloudWatchLog.R

test_that("set minimal setting in initialisation", {
  skip_if_not_installed("paws.management")

  mock_create_log_group <- mock()
  mock_put_retention_policy <- mock()
  mock_put_log_events <- mock()
  mock_get_log_events <- mock()

  mock_paws_management_cwl <- mock(
    list(
      create_log_group = mock_create_log_group,
      put_retention_policy = mock_put_retention_policy,
      put_log_events = mock_put_log_events,
      get_log_events = mock_get_log_events
    )
  )

  local_mocked_bindings(
    cloudwatchlogs = mock_paws_management_cwl,
    .package = "paws.management"
  )
  local_mocked_bindings(
    Sys.Date = function() "2023-10-20",
    sample = function(...) "abcde123",
    .package = "base"
  )

  app <- AppenderAWSCloudWatchLog$new(
    "lgrExtra"
  )

  private <- app$.__enclos_env__$private

  expect_equal(mock_arg(mock_paws_management_cwl), list(list()))
  expect_equal(mock_arg(mock_create_log_group), list(logGroupName = "lgrExtra"))
  expect_equal(private$.flush_threshold, 200)
  expect_equal(private$.flush_on_rotate, TRUE)
  expect_equal(private$.flush_on_exit, TRUE)

  expect_equal(private$.log_group_name, "lgrExtra")
  expect_equal(private$.log_stream_name, "lgrExtra/2023-10-20/abcde123")
  expect_equal(private$.layout, lgr::LayoutFormat$new(fmt = "%L: %m", colors = list()))
  expect_equal(private$.log_group_retention_days, NULL)
})




test_that("set minimal setting in initialisation", {
  skip_if_not_installed("paws.management")

  mock_create_log_group <- mock()
  mock_put_retention_policy <- mock()
  mock_put_log_events <- mock()
  mock_get_log_events <- mock()

  mock_paws_management_cwl <- mock(
    list(
      create_log_group = mock_create_log_group,
      put_retention_policy = mock_put_retention_policy,
      put_log_events = mock_put_log_events,
      get_log_events = mock_get_log_events
    )
  )

  local_mocked_bindings(
    cloudwatchlogs = mock_paws_management_cwl,
    .package = "paws.management"
  )
  local_mocked_bindings(
    Sys.time = function() 123456,
    sample = function(...) "abcde123",
    .package = "base"
  )

  l1 <- lgr::LayoutFormat$new(fmt = "%L: %m", colors = list())

  app <- AppenderAWSCloudWatchLog$new(
    log_group_name = "lgrExtra",
    log_stream_name = "foobar",
    log_group_retention_days = 30,
    paws_config = list(var1 = "zoo"),
    threshold = 2,
    layout = l1,
    buffer_size = 0,
    flush_threshold = "warn",
    flush_on_exit = TRUE,
    flush_on_rotate = TRUE
  )

  private <- app$.__enclos_env__$private

  expect_equal(mock_arg(mock_paws_management_cwl), list(list(var1 = "zoo")))
  expect_equal(mock_arg(mock_create_log_group), list(logGroupName = "lgrExtra"))
  expect_equal(mock_arg(mock_put_retention_policy), list(logGroupName = "lgrExtra", retentionInDays = 30))
  expect_equal(private$.flush_threshold, 300)
  expect_equal(private$.flush_on_rotate, TRUE)
  expect_equal(private$.flush_on_exit, TRUE)

  expect_equal(private$.log_group_name, "lgrExtra")
  expect_equal(private$.log_stream_name, "foobar/abcde123")
  expect_equal(private$.layout, l1)
  expect_equal(private$.log_group_retention_days, 30)
})




test_that("check logs are correctly formatted to send to cloudwatch", {
  skip_if_not_installed("paws.management")

  mock_create_log_group <- mock(cycle = T)
  mock_put_retention_policy <- mock(cycle = T)
  mock_put_log_events <- mock(list(nextSequenceToken = "123"), cycle = T)
  mock_get_log_events <- mock(cycle = T)

  mock_paws_management_cwl <- mock(
    list(
      create_log_group = mock_create_log_group,
      put_retention_policy = mock_put_retention_policy,
      put_log_events = mock_put_log_events,
      get_log_events = mock_get_log_events
    ), cycle = T
  )

  local_mocked_bindings(
    cloudwatchlogs = mock_paws_management_cwl,
    .package = "paws.management"
  )
  local_mocked_bindings(
    Sys.time = function() 123456,
    sample = function(...) "abcde123",
    .package = "base"
  )

  app <- AppenderAWSCloudWatchLog$new(
    "lgrExtra"
  )

  lg <- lgr::get_logger("lgrExtra")$add_appender(app)$set_propagate(FALSE)
  lg$info("FOO")
  lg$info("BAR")

  expect_equal(mock_args(mock_put_log_events), list(
    list(
      logGroupName = "lgrExtra",
      logStreamName = "lgrExtra/1970-01-02/abcde123",
      logEvents = list(
        list(
          timestamp = 123456000,
          message = "INFO : FOO"
        )
      )
    ),
    list(
      logGroupName = "lgrExtra",
      logStreamName = "lgrExtra/1970-01-02/abcde123",
      logEvents = list(
        list(
          timestamp = 123456000,
          message = "INFO : BAR"
        )
      ),
      sequenceToken = "123"
    )
  ))
})




test_that("check batch logs are correctly formatted to send to cloudwatch", {
  skip_if_not_installed("paws.management")

  mock_create_log_group <- mock(cycle = T)
  mock_put_retention_policy <- mock(cycle = T)
  mock_put_log_events <- mock(list(nextSequenceToken = "123"), cycle = T)
  mock_get_log_events <- mock(cycle = T)

  mock_paws_management_cwl <- mock(
    list(
      create_log_group = mock_create_log_group,
      put_retention_policy = mock_put_retention_policy,
      put_log_events = mock_put_log_events,
      get_log_events = mock_get_log_events
    ), cycle = T
  )

  local_mocked_bindings(
    cloudwatchlogs = mock_paws_management_cwl,
    .package = "paws.management"
  )
  local_mocked_bindings(
    Sys.time = function() 123456,
    sample = function(...) "abcde123",
    .package = "base"
  )

  app <- AppenderAWSCloudWatchLog$new(
    "lgrExtra", buffer_size = 1
  )

  lg <- lgr::get_logger("lgrExtra")$add_appender(app)$set_propagate(FALSE)
  lg$info("FOO")
  lg$info("BAR")
  lg$info("CHO")
  lg$info("ZOO")

  expect_equal(mock_args(mock_put_log_events), list(
    list(
      logGroupName = "lgrExtra",
      logStreamName = "lgrExtra/1970-01-02/abcde123",
      logEvents = list(
        list(
          timestamp = 123456000,
          message = "INFO : FOO"
        ),
        list(
          timestamp = 123456000,
          message = "INFO : BAR"
        )
      )
    ),
    list(
      logGroupName = "lgrExtra",
      logStreamName = "lgrExtra/1970-01-02/abcde123",
      logEvents = list(
        list(
          timestamp = 123456000,
          message = "INFO : CHO"
        ),
        list(
          timestamp = 123456000,
          message = "INFO : ZOO"
        )
      ),
      sequenceToken = "123"
    )
  ))
})




test_that("check batch logs are correctly formatted to send to cloudwatch", {
  skip_if_not_installed("paws.management")

  mock_create_log_group <- mock(cycle = T)
  mock_put_retention_policy <- mock(cycle = T)
  mock_put_log_events <- mock(list(nextSequenceToken = "123"), cycle = T)
  mock_get_log_events <- mock(cycle = T)

  mock_paws_management_cwl <- mock(
    list(
      create_log_group = mock_create_log_group,
      put_retention_policy = mock_put_retention_policy,
      put_log_events = mock_put_log_events,
      get_log_events = mock_get_log_events
    ), cycle = T
  )

  local_mocked_bindings(
    cloudwatchlogs = mock_paws_management_cwl,
    .package = "paws.management"
  )
  local_mocked_bindings(
    Sys.time = function() 123456,
    sample = function(...) "abcde123",
    .package = "base"
  )

  app <- AppenderAWSCloudWatchLog$new(
    "lgrExtra", buffer_size = 1
  )

  lg <- lgr::get_logger("lgrExtra")$add_appender(app)$set_propagate(FALSE)
  lg$info("FOO")
  lg$info("BAR")
  lg$info("CHO")
  lg$info("ZOO")

  expect_equal(mock_args(mock_put_log_events), list(
    list(
      logGroupName = "lgrExtra",
      logStreamName = "lgrExtra/1970-01-02/abcde123",
      logEvents = list(
        list(
          timestamp = 123456000,
          message = "INFO : FOO"
        ),
        list(
          timestamp = 123456000,
          message = "INFO : BAR"
        )
      )
    ),
    list(
      logGroupName = "lgrExtra",
      logStreamName = "lgrExtra/1970-01-02/abcde123",
      logEvents = list(
        list(
          timestamp = 123456000,
          message = "INFO : CHO"
        ),
        list(
          timestamp = 123456000,
          message = "INFO : ZOO"
        )
      ),
      sequenceToken = "123"
    )
  ))
})


test_that("check get logs from cloudwatch", {
  skip_if_not_installed("paws.management")

  mock_create_log_group <- mock(cycle = T)
  mock_put_retention_policy <- mock(cycle = T)
  mock_put_log_events <- mock(list(nextSequenceToken = "123"), cycle = T)
  mock_get_log_events <- mock(
    list(
      events = list(
        list(
          timestamp = 123,
          message = "INFO : FOO",
          ingestionTime = 123
        )
      ),
      nextForwardToken = "token1",
      nextBackwardToken = "token1"
    ),
    list(
      events = list(
        list(
          timestamp = 123,
          message = "INFO : BAR",
          ingestionTime = 123
        )
      ),
      nextForwardToken = "token2",
      nextBackwardToken = "token2"
    ),
    list(
      events = list(),
      nextForwardToken = "token3",
      nextBackwardToken = "token3"
    ))

  mock_paws_management_cwl <- mock(
    list(
      create_log_group = mock_create_log_group,
      put_retention_policy = mock_put_retention_policy,
      put_log_events = mock_put_log_events,
      get_log_events = mock_get_log_events
    ), cycle = T
  )

  local_mocked_bindings(
    cloudwatchlogs = mock_paws_management_cwl,
    .package = "paws.management"
  )
  local_mocked_bindings(
    Sys.time = function() 123456,
    sample = function(...) "abcde123",
    .package = "base"
  )

  app <- AppenderAWSCloudWatchLog$new(
    "lgrExtra", buffer_size = 1
  )
  expect_equal(app$data, list("INFO : FOO", "INFO : BAR"))
  expect_equal(mock_args(mock_get_log_events), list(
    list(
      logGroupName = "lgrExtra",
      logStreamName = "lgrExtra/1970-01-02/abcde123",
      startTime = 0,
      startFromHead = TRUE
    ),
    list(
      logGroupName = "lgrExtra",
      logStreamName = "lgrExtra/1970-01-02/abcde123",
      startTime = 0,
      startFromHead = TRUE,
      nextToken = "token1"
    ),
    list(
      logGroupName = "lgrExtra",
      logStreamName = "lgrExtra/1970-01-02/abcde123",
      startTime = 0,
      startFromHead = TRUE,
      nextToken = "token2"
    )
  ))
})

Try the lgrExtra package in your browser

Any scripts or data that you put into this service are public.

lgrExtra documentation built on Nov. 5, 2025, 7:13 p.m.