livekit-protocol 0.7.9

Livekit protocol and utilities for the Rust SDK
Documentation
package observability

import (
	"testing"
	"time"

	"github.com/stretchr/testify/require"
)

func TestSessionTimer(t *testing.T) {
	t.Run("advance 100ms", func(t *testing.T) {
		ts := time.Now()
		st := NewSessionTimer(ts)

		millis, secs, mins := st.Advance(ts.Add(100 * time.Millisecond))
		require.EqualValues(t, 100, millis)
		require.EqualValues(t, 1, secs)
		require.EqualValues(t, 1, mins)

		millis, secs, mins = st.Advance(ts.Add(200 * time.Millisecond))
		require.EqualValues(t, 100, millis)
		require.EqualValues(t, 0, secs)
		require.EqualValues(t, 0, mins)
	})

	t.Run("advance 2.5m", func(t *testing.T) {
		ts := time.Now()
		st := NewSessionTimer(ts)

		millis, secs, mins := st.Advance(ts.Add(150 * time.Second))
		require.EqualValues(t, 150000, millis)
		require.EqualValues(t, 150, secs)
		require.EqualValues(t, 3, mins)
	})

	t.Run("WithMinSeconds floors first advance and consumes watermark", func(t *testing.T) {
		ts := time.Now()
		st := NewSessionTimer(ts, WithMinSeconds(60))

		_, secs, _ := st.Advance(ts.Add(time.Second))
		require.EqualValues(t, 60, secs)

		_, secs, _ = st.Advance(ts.Add(30 * time.Second))
		require.EqualValues(t, 0, secs)

		_, secs, _ = st.Advance(ts.Add(62 * time.Second))
		require.EqualValues(t, 2, secs)
	})

	t.Run("WithMinSeconds does not lower larger natural value", func(t *testing.T) {
		ts := time.Now()
		st := NewSessionTimer(ts, WithMinSeconds(60))

		_, secs, _ := st.Advance(ts.Add(120 * time.Second))
		require.EqualValues(t, 120, secs)
	})

	t.Run("WithMinSeconds does not trigger on no-op advance", func(t *testing.T) {
		ts := time.Now()
		st := NewSessionTimer(ts, WithMinSeconds(60))

		_, secs, _ := st.Advance(ts)
		require.EqualValues(t, 0, secs)

		_, secs, _ = st.Advance(ts.Add(time.Second))
		require.EqualValues(t, 60, secs)
	})

	t.Run("WithMinMinutes floors first advance", func(t *testing.T) {
		ts := time.Now()
		st := NewSessionTimer(ts, WithMinMinutes(5))

		_, _, mins := st.Advance(ts.Add(time.Second))
		require.EqualValues(t, 5, mins)

		_, _, mins = st.Advance(ts.Add(2 * time.Minute))
		require.EqualValues(t, 0, mins)

		_, _, mins = st.Advance(ts.Add(7 * time.Minute))
		require.EqualValues(t, 2, mins)
	})

	t.Run("WithMinSeconds and WithMinMinutes apply independently", func(t *testing.T) {
		ts := time.Now()
		st := NewSessionTimer(ts, WithMinSeconds(45), WithMinMinutes(3))

		_, secs, mins := st.Advance(ts.Add(time.Second))
		require.EqualValues(t, 45, secs)
		require.EqualValues(t, 3, mins)
	})

	t.Run("Reset re-anchors so pre-reset time is not counted", func(t *testing.T) {
		ts := time.Now()
		st := NewSessionTimer(ts)

		// 90s elapse before the participant actually joins; that time should not
		// be billed once we re-anchor to the join time.
		joinedAt := ts.Add(90 * time.Second)
		st.Reset(joinedAt)

		millis, secs, mins := st.Advance(joinedAt.Add(30 * time.Second))
		require.EqualValues(t, 30000, millis)
		require.EqualValues(t, 30, secs)
		require.EqualValues(t, 1, mins)
	})

	t.Run("Reset preserves min-seconds option", func(t *testing.T) {
		ts := time.Now()
		st := NewSessionTimer(ts, WithMinSeconds(45))

		joinedAt := ts.Add(10 * time.Second)
		st.Reset(joinedAt)

		_, secs, _ := st.Advance(joinedAt.Add(time.Second))
		require.EqualValues(t, 45, secs)
	})
}