1package bootstrap
2
3import (
4 "context"
5 "testing"
6 "time"
7
8 portmocks "github.com/bnema/dumber/internal/application/port/mocks"
9 "github.com/bnema/dumber/internal/application/usecase"
10 "github.com/bnema/dumber/internal/domain/entity"
11 repomocks "github.com/bnema/dumber/internal/domain/repository/mocks"
12 "github.com/bnema/dumber/internal/infrastructure/config"
13 "github.com/stretchr/testify/mock"
14 "github.com/stretchr/testify/require"
15)
16
17func TestRunSessionCleanup_DoesNotEndOtherActiveBrowserSessionsWithoutLivenessProof(t *testing.T) {
18 t.Parallel()
19
20 ctx := context.Background()
21 repo := repomocks.NewMockSessionRepository(t)
22 probe := portmocks.NewMockSessionProcessProbe(t)
23 cleanupUC := usecase.NewCleanupSessionsUseCase(repo, probe)
24 cfg := config.DefaultConfig()
25 logDir := t.TempDir()
26
27 now := time.Now().UTC()
28 current := &entity.Session{
29 ID: entity.SessionID("current"),
30 Type: entity.SessionTypeBrowser,
31 StartedAt: now,
32 }
33 livePID := 1234
34 live := &entity.Session{
35 ID: entity.SessionID("live-other-process"),
36 Type: entity.SessionTypeBrowser,
37 StartedAt: now.Add(-time.Hour),
38 ProcessID: &livePID,
39 }
40
41 repo.EXPECT().GetRecent(mock.Anything, recentSessionsLimit).Return([]*entity.Session{current, live}, nil).Once()
42 probe.EXPECT().IsProcessAlive(mock.Anything, livePID).Return(true, nil).Once()
43 repo.EXPECT().DeleteExitedBefore(mock.Anything, mock.MatchedBy(func(time.Time) bool { return true })).Return(int64(0), nil).Once()
44 repo.EXPECT().DeleteOldestExited(mock.Anything, cfg.Session.MaxExitedSessions).Return(int64(0), nil).Once()
45
46 runSessionCleanup(ctx, cleanupUC, cfg, logDir, current.ID, nil)
47}
48
49func TestRunSessionCleanup_NoPanicOnNilSessions(t *testing.T) {
50 t.Parallel()
51
52 ctx := context.Background()
53 repo := repomocks.NewMockSessionRepository(t)
54 probe := portmocks.NewMockSessionProcessProbe(t)
55 cleanupUC := usecase.NewCleanupSessionsUseCase(repo, probe)
56 cfg := config.DefaultConfig()
57 logDir := t.TempDir()
58
59 repo.EXPECT().GetRecent(mock.Anything, recentSessionsLimit).Return([]*entity.Session{nil}, nil).Once()
60 repo.EXPECT().DeleteExitedBefore(mock.Anything, mock.MatchedBy(func(time.Time) bool { return true })).Return(int64(0), nil).Once()
61 repo.EXPECT().DeleteOldestExited(mock.Anything, cfg.Session.MaxExitedSessions).Return(int64(0), nil).Once()
62
63 require.NotPanics(t, func() {
64 runSessionCleanup(ctx, cleanupUC, cfg, logDir, entity.SessionID("current"), nil)
65 })
66}