github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/syz-ci/jobs_test.go (about)

     1  // Copyright 2019 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 main
     5  
     6  import (
     7  	"bytes"
     8  	"errors"
     9  	"fmt"
    10  	"testing"
    11  
    12  	"github.com/google/syzkaller/pkg/instance"
    13  	"github.com/google/syzkaller/pkg/report"
    14  )
    15  
    16  func TestAggregateTestResults(t *testing.T) {
    17  	tests := []struct {
    18  		results []instance.EnvTestResult
    19  		title   string
    20  		err     error
    21  		rawOut  []byte
    22  	}{
    23  		{
    24  			results: []instance.EnvTestResult{{}, {}, {RawOutput: []byte{1, 2, 3}}},
    25  			title:   "",
    26  			err:     nil,
    27  			rawOut:  []byte{1, 2, 3},
    28  		},
    29  		{
    30  			results: []instance.EnvTestResult{
    31  				{Error: &instance.CrashError{Report: &report.Report{Title: "title1"}}},
    32  				{Error: &instance.CrashError{Report: &report.Report{Title: "title2"}}},
    33  				{Error: &instance.CrashError{Report: &report.Report{Title: "title3"}}},
    34  			},
    35  			title: "title1",
    36  			err:   nil,
    37  		},
    38  		{
    39  			results: []instance.EnvTestResult{
    40  				{},
    41  				{Error: &instance.CrashError{Report: &report.Report{Title: "title2"}}},
    42  				{},
    43  			},
    44  			title: "title2",
    45  			err:   nil,
    46  		},
    47  		{
    48  			results: []instance.EnvTestResult{
    49  				{Error: &instance.TestError{Title: "test error1"}},
    50  				{Error: &instance.CrashError{Report: &report.Report{Title: "title2"}}},
    51  				{Error: &instance.TestError{Title: "test error2"}},
    52  			},
    53  			title: "title2",
    54  			err:   nil,
    55  		},
    56  		{
    57  			results: []instance.EnvTestResult{
    58  				{Error: &instance.TestError{Title: "test error1"}},
    59  				{Error: &instance.TestError{Title: "test error2"}},
    60  				{},
    61  			},
    62  			title: "",
    63  			err:   nil,
    64  		},
    65  		{
    66  			results: []instance.EnvTestResult{
    67  				{Error: &instance.TestError{Title: "test error1"}},
    68  				{Error: &instance.TestError{Title: "test error2"}},
    69  				{Error: &instance.TestError{Title: "test error3", Output: []byte("output")}},
    70  			},
    71  			title: "",
    72  			err:   errors.New("test error3\n\noutput"),
    73  		},
    74  		{
    75  			results: []instance.EnvTestResult{
    76  				{Error: errors.New("infra error1")},
    77  				{Error: errors.New("infra error2")},
    78  				{Error: &instance.TestError{Title: "test error", Report: &report.Report{
    79  					Title:  "report title",
    80  					Report: []byte("report body"),
    81  					Output: []byte("output"),
    82  				}}},
    83  			},
    84  			title: "",
    85  			err:   errors.New("report title\n\nreport body\n\noutput"),
    86  		},
    87  		{
    88  			results: []instance.EnvTestResult{
    89  				{Error: errors.New("infra error1")},
    90  				{Error: errors.New("infra error2")},
    91  				{Error: errors.New("infra error3")},
    92  			},
    93  			title: "",
    94  			err:   errors.New("infra error3"),
    95  		},
    96  		{
    97  			results: []instance.EnvTestResult{
    98  				{Error: &instance.CrashError{Report: &report.Report{Title: "title1"}}},
    99  				{Error: &instance.CrashError{
   100  					Report: &report.Report{
   101  						Title:  "title2",
   102  						Report: []byte("report"),
   103  					}},
   104  					RawOutput: []byte{2, 3, 4},
   105  				},
   106  				{Error: &instance.CrashError{Report: &report.Report{Title: "title3"}}},
   107  			},
   108  			title:  "title2",
   109  			err:    nil,
   110  			rawOut: []byte{2, 3, 4},
   111  		},
   112  	}
   113  	for i, test := range tests {
   114  		rep, err := aggregateTestResults(test.results)
   115  		if fmt.Sprint(err) != fmt.Sprint(test.err) {
   116  			t.Errorf("test #%v: got err: %q, want: %q", i, err, test.err)
   117  		}
   118  		got := ""
   119  		if rep != nil && rep.report != nil {
   120  			got = rep.report.Title
   121  		}
   122  		if got != test.title {
   123  			t.Errorf("test #%v: got title: %q, want: %q", i, got, test.title)
   124  		}
   125  		var gotOutput []byte
   126  		if rep != nil {
   127  			gotOutput = rep.rawOutput
   128  		}
   129  		if !bytes.Equal(test.rawOut, gotOutput) {
   130  			t.Errorf("test #%v: got raw out: %q, want: %q", i, gotOutput, test.rawOut)
   131  		}
   132  	}
   133  }