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  }