...

Source file src/github.com/google/certificate-transparency-go/x509/error_test.go

Documentation: github.com/google/certificate-transparency-go/x509

     1  package x509_test
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"reflect"
     7  	"testing"
     8  
     9  	"github.com/google/certificate-transparency-go/x509"
    10  )
    11  
    12  func TestErrors(t *testing.T) {
    13  	var tests = []struct {
    14  		errs           *x509.Errors
    15  		want           string
    16  		wantVerbose    string
    17  		wantFatal      bool
    18  		wantFirstFatal error
    19  	}{
    20  		{
    21  			errs: &x509.Errors{Errs: []x509.Error{
    22  				{Summary: "Error", Field: "a.b.c"},
    23  			}},
    24  			want:        "Error",
    25  			wantVerbose: "Error (a.b.c)",
    26  		},
    27  		{
    28  			errs: &x509.Errors{Errs: []x509.Error{
    29  				{
    30  					Summary:  "Error",
    31  					Field:    "a.b.c",
    32  					SpecRef:  "RFC5280 s4.1.2.2",
    33  					SpecText: "The serial number MUST be a positive integer",
    34  					Category: x509.MalformedCertificate,
    35  				},
    36  			}},
    37  			want:        "Error",
    38  			wantVerbose: "Error (a.b.c: Certificate does not comply with MUST clause in spec: RFC5280 s4.1.2.2, 'The serial number MUST be a positive integer')",
    39  		},
    40  		{
    41  			errs: &x509.Errors{Errs: []x509.Error{
    42  				{
    43  					Summary:  "Error",
    44  					Field:    "a.b.c",
    45  					SpecRef:  "RFC5280 s4.1.2.2",
    46  					SpecText: "The serial number MUST be a positive integer",
    47  				},
    48  			}},
    49  			want:        "Error",
    50  			wantVerbose: "Error (a.b.c: RFC5280 s4.1.2.2, 'The serial number MUST be a positive integer')",
    51  		},
    52  		{
    53  			errs: &x509.Errors{Errs: []x509.Error{
    54  				{
    55  					Summary:  "Error",
    56  					Field:    "a.b.c",
    57  					SpecRef:  "RFC5280 s4.1.2.2",
    58  					Category: x509.MalformedCertificate,
    59  				},
    60  			}},
    61  			want:        "Error",
    62  			wantVerbose: "Error (a.b.c: Certificate does not comply with MUST clause in spec: RFC5280 s4.1.2.2)",
    63  		},
    64  		{
    65  			errs: &x509.Errors{Errs: []x509.Error{
    66  				{
    67  					Summary:  "Error",
    68  					Field:    "a.b.c",
    69  					SpecText: "The serial number MUST be a positive integer",
    70  					Category: x509.MalformedCertificate,
    71  				},
    72  			}},
    73  			want:        "Error",
    74  			wantVerbose: "Error (a.b.c: Certificate does not comply with MUST clause in spec: 'The serial number MUST be a positive integer')",
    75  		},
    76  		{
    77  			errs: &x509.Errors{Errs: []x509.Error{
    78  				{
    79  					Summary: "Error",
    80  					Field:   "a.b.c",
    81  					SpecRef: "RFC5280 s4.1.2.2",
    82  				},
    83  			}},
    84  			want:        "Error",
    85  			wantVerbose: "Error (a.b.c: RFC5280 s4.1.2.2)",
    86  		},
    87  		{
    88  			errs: &x509.Errors{Errs: []x509.Error{
    89  				{
    90  					Summary:  "Error",
    91  					Field:    "a.b.c",
    92  					SpecText: "The serial number MUST be a positive integer",
    93  				},
    94  			}},
    95  			want:        "Error",
    96  			wantVerbose: "Error (a.b.c: 'The serial number MUST be a positive integer')",
    97  		},
    98  		{
    99  			errs: &x509.Errors{Errs: []x509.Error{
   100  				{
   101  					Summary:  "Error",
   102  					Field:    "a.b.c",
   103  					Category: x509.MalformedCertificate,
   104  				},
   105  			}},
   106  			want:        "Error",
   107  			wantVerbose: "Error (a.b.c: Certificate does not comply with MUST clause in spec)",
   108  		},
   109  		{
   110  			errs: &x509.Errors{Errs: []x509.Error{
   111  				{Summary: "Error"},
   112  			}},
   113  			want:        "Error",
   114  			wantVerbose: "Error",
   115  		},
   116  		{
   117  			errs: &x509.Errors{Errs: []x509.Error{
   118  				{Summary: "Error\nwith newline", Field: "x", Category: x509.InvalidASN1DER},
   119  			}},
   120  			want:        "Error\nwith newline",
   121  			wantVerbose: "Error\nwith newline (x: Invalid ASN.1 distinguished encoding)",
   122  		},
   123  		{
   124  			errs: &x509.Errors{Errs: []x509.Error{
   125  				{Summary: "Error1", Field: "a.b.c"},
   126  				{Summary: "Error2", Field: "a.b.c.d"},
   127  				{Summary: "Error3", Field: "x.y.z"},
   128  			}},
   129  			want:        "Errors:\n  Error1\n  Error2\n  Error3",
   130  			wantVerbose: "Errors:\n  Error1 (a.b.c)\n  Error2 (a.b.c.d)\n  Error3 (x.y.z)",
   131  		},
   132  		{
   133  			errs: &x509.Errors{Errs: []x509.Error{
   134  				{Summary: "Error1", Field: "a.b.c"},
   135  				{Summary: "Error2", Field: "a.b.c.d", Fatal: true},
   136  				{Summary: "Error3", Field: "x.y.z"},
   137  			}},
   138  			want:        "Errors:\n  Error1\n  Error2\n  Error3",
   139  			wantVerbose: "Errors:\n  Error1 (a.b.c)\n  Error2 (a.b.c.d)\n  Error3 (x.y.z)",
   140  			wantFatal:   true,
   141  		},
   142  	}
   143  
   144  	for _, test := range tests {
   145  		if got := test.errs.Error(); got != test.want {
   146  			t.Errorf("Errors(%+v).Error()=%q; want %q", test.errs, got, test.want)
   147  		}
   148  		if got := test.errs.VerboseError(); got != test.wantVerbose {
   149  			t.Errorf("Errors(%+v).VerboseError()=%q; want %q", test.errs, got, test.wantVerbose)
   150  		}
   151  		if got := test.errs.Fatal(); got != test.wantFatal {
   152  			t.Errorf("Errors(%+v).Fatal()=%v; want %v", test.errs, got, test.wantFatal)
   153  		}
   154  	}
   155  }
   156  
   157  func TestErrorsRawAppend(t *testing.T) {
   158  	// Pointer receiver can be nil.
   159  	var errs *x509.Errors
   160  	if got, want := errs.Empty(), true; got != want {
   161  		t.Errorf("Errors().Empty()=%t; want %t", got, want)
   162  	}
   163  	// Pointer receiver can point to empty struct.
   164  	errs = &x509.Errors{}
   165  	if got, want := errs.Error(), ""; got != want {
   166  		t.Errorf("Errors().Error()=%q; want %q", got, want)
   167  	}
   168  	if got, want := errs.Empty(), true; got != want {
   169  		t.Errorf("Errors().Empty()=%t; want %t", got, want)
   170  	}
   171  	errs.Errs = append(errs.Errs, x509.Error{
   172  		Summary: "Error",
   173  		Field:   "a.b.c",
   174  		SpecRef: "RFC5280 s4.1.2.2"})
   175  	if got, want := errs.VerboseError(), "Error (a.b.c: RFC5280 s4.1.2.2)"; got != want {
   176  		t.Errorf("Errors(%+v).Error=%q; want %q", errs, got, want)
   177  	}
   178  	if got, want := errs.Empty(), false; got != want {
   179  		t.Errorf("Errors().Empty()=%t; want %t", got, want)
   180  	}
   181  }
   182  
   183  func TestErrorsFilter(t *testing.T) {
   184  	var errs x509.Errors
   185  	id := x509.ErrMaxID + 2
   186  	errs.AddID(id, "arg1", 2, "arg3")
   187  	baseErr := errs.Error()
   188  
   189  	errs.AddID(x509.ErrMaxID + 1)
   190  	if got, want := errs.Error(), fmt.Sprintf("Errors:\n  %s\n  E%03d: Unknown error ID %v: args []", baseErr, x509.ErrMaxID+1, x509.ErrMaxID+1); got != want {
   191  		t.Errorf("Errors(%+v).Error=%q; want %q", errs, got, want)
   192  	}
   193  
   194  	errList := fmt.Sprintf("%d, %d", x509.ErrMaxID+1, x509.ErrMaxID+1)
   195  	filter := x509.ErrorFilter(errList)
   196  	errs2 := errs.Filter(filter)
   197  	if got, want := errs2.Error(), baseErr; got != want {
   198  		t.Errorf("Errors(%+v).Error=%q; want %q", errs, got, want)
   199  	}
   200  }
   201  
   202  func TestErrorsAppend(t *testing.T) {
   203  	errA := errors.New("A")
   204  	errB := errors.New("B")
   205  	errC := errors.New("C")
   206  	errD := errors.New("D")
   207  	tests := []struct {
   208  		left, right, want *x509.NonFatalErrors
   209  	}{
   210  		{
   211  			left:  &x509.NonFatalErrors{Errors: []error{errA}},
   212  			right: &x509.NonFatalErrors{Errors: []error{errB}},
   213  			want:  &x509.NonFatalErrors{Errors: []error{errA, errB}},
   214  		},
   215  		{
   216  			left:  &x509.NonFatalErrors{Errors: []error{errA, errB}},
   217  			right: &x509.NonFatalErrors{Errors: []error{errC, errD}},
   218  			want:  &x509.NonFatalErrors{Errors: []error{errA, errB, errC, errD}},
   219  		},
   220  		{
   221  			left:  nil,
   222  			right: &x509.NonFatalErrors{Errors: []error{errC, errD}},
   223  			want:  &x509.NonFatalErrors{Errors: []error{errC, errD}},
   224  		},
   225  		{
   226  			left:  &x509.NonFatalErrors{Errors: []error{errC, errD}},
   227  			right: nil,
   228  			want:  &x509.NonFatalErrors{Errors: []error{errC, errD}},
   229  		},
   230  		{
   231  			left:  nil,
   232  			right: nil,
   233  			want:  nil,
   234  		},
   235  		{
   236  			left:  &x509.NonFatalErrors{Errors: []error{}},
   237  			right: nil,
   238  			want:  &x509.NonFatalErrors{Errors: []error{}},
   239  		},
   240  	}
   241  	for _, test := range tests {
   242  		got := test.left.Append(test.right)
   243  		if !reflect.DeepEqual(got, test.want) {
   244  			t.Errorf("(%+v).Append(%+v)=%v, want %v", test.left, test.right, got, test.want)
   245  		}
   246  	}
   247  }
   248  

View as plain text