github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/syz-cluster/pkg/db/report_repo_test.go (about) 1 // Copyright 2025 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 package db 5 6 import ( 7 "fmt" 8 "testing" 9 "time" 10 11 "github.com/google/syzkaller/syz-cluster/pkg/api" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 const dummyReporter = "abcd" 16 17 func TestReportRepository(t *testing.T) { 18 client, ctx := NewTransientDB(t) 19 sessionRepo := NewSessionRepository(client) 20 seriesRepo := NewSeriesRepository(client) 21 reportRepo := NewReportRepository(client) 22 23 var keys []string 24 for i := 0; i < 3; i++ { 25 series := &Series{ExtID: fmt.Sprintf("series%d", i)} 26 err := seriesRepo.Insert(ctx, series, nil) 27 assert.NoError(t, err) 28 29 session := &Session{SeriesID: series.ID} 30 err = sessionRepo.Insert(ctx, session) 31 assert.NoError(t, err) 32 33 report := &SessionReport{SessionID: session.ID, Reporter: dummyReporter} 34 err = reportRepo.Insert(ctx, report) 35 assert.NoError(t, err) 36 keys = append(keys, report.ID) 37 } 38 39 list, err := reportRepo.ListNotReported(ctx, dummyReporter, 10) 40 assert.NoError(t, err) 41 assert.Len(t, list, 3) 42 43 err = reportRepo.Update(ctx, keys[0], func(rep *SessionReport) error { 44 rep.SetReportedAt(time.Now()) 45 return nil 46 }) 47 assert.NoError(t, err) 48 t.Run("not-reported-count", func(t *testing.T) { 49 // Now one less. 50 list, err := reportRepo.ListNotReported(ctx, dummyReporter, 10) 51 assert.NoError(t, err) 52 assert.Len(t, list, 2) 53 }) 54 } 55 56 func TestSessionsWithoutReports(t *testing.T) { 57 client, ctx := NewTransientDB(t) 58 sessionRepo := NewSessionRepository(client) 59 seriesRepo := NewSeriesRepository(client) 60 findingRepo := NewFindingRepository(client) 61 testsRepo := NewSessionTestRepository(client) 62 63 series := &Series{ExtID: "some-series"} 64 err := seriesRepo.Insert(ctx, series, nil) 65 assert.NoError(t, err) 66 67 // Set up 3 sessions, 2 of which would have a finding. 68 var sessions []*Session 69 for i := 0; i < 3; i++ { 70 session := &Session{SeriesID: series.ID} 71 sessions = append(sessions, session) 72 err = sessionRepo.Insert(ctx, session) 73 assert.NoError(t, err) 74 if i == 0 || i == 1 { 75 // Fake a test and a finding. 76 err = testsRepo.InsertOrUpdate(ctx, &SessionTest{ 77 SessionID: session.ID, 78 TestName: "test", 79 Result: api.TestPassed, 80 }, nil) 81 assert.NoError(t, err) 82 err = findingRepo.mustStore(ctx, &Finding{ 83 SessionID: session.ID, 84 TestName: "test", 85 Title: "A", 86 }) 87 assert.NoError(t, err) 88 } 89 } 90 // For now it should be 0 -- none are finished. 91 list, err := sessionRepo.MissingReportList(ctx, time.Time{}, 10) 92 assert.NoError(t, err) 93 assert.Len(t, list, 0) 94 95 // Finish all sessions. 96 for _, session := range sessions { 97 err := sessionRepo.Update(ctx, session.ID, func(session *Session) error { 98 session.SetFinishedAt(time.Now()) 99 return nil 100 }) 101 assert.NoError(t, err) 102 } 103 104 // Now it should be 2. 105 list, err = sessionRepo.MissingReportList(ctx, time.Time{}, 10) 106 assert.NoError(t, err) 107 assert.Len(t, list, 2) 108 109 // Create a report for the first session. 110 reportRepo := NewReportRepository(client) 111 err = reportRepo.Insert(ctx, &SessionReport{SessionID: sessions[0].ID, Reporter: dummyReporter}) 112 assert.NoError(t, err) 113 114 // Now only the second session must be returned. 115 list, err = sessionRepo.MissingReportList(ctx, time.Time{}, 10) 116 assert.NoError(t, err) 117 assert.Len(t, list, 1) 118 assert.Equal(t, list[0].ID, sessions[1].ID) 119 }