oras.land/oras-go/v2@v2.5.1-0.20240520045656-aef90e4d04c4/registry/remote/warning_test.go (about)

     1  /*
     2  Copyright The ORAS Authors.
     3  Licensed under the Apache License, Version 2.0 (the "License");
     4  you may not use this file except in compliance with the License.
     5  You may obtain a copy of the License at
     6  
     7  http://www.apache.org/licenses/LICENSE-2.0
     8  
     9  Unless required by applicable law or agreed to in writing, software
    10  distributed under the License is distributed on an "AS IS" BASIS,
    11  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  See the License for the specific language governing permissions and
    13  limitations under the License.
    14  */
    15  
    16  package remote
    17  
    18  import (
    19  	"errors"
    20  	"reflect"
    21  	"testing"
    22  )
    23  
    24  func Test_parseWarningHeader(t *testing.T) {
    25  	tests := []struct {
    26  		name    string
    27  		header  string
    28  		want    WarningValue
    29  		wantErr error
    30  	}{
    31  		{
    32  			name:   "Valid warning",
    33  			header: `299 - "This is a warning."`,
    34  			want: WarningValue{
    35  				Code:  299,
    36  				Agent: "-",
    37  				Text:  "This is a warning.",
    38  			},
    39  		},
    40  		{
    41  			name:   "Valid meaningless warning",
    42  			header: `299 - " "`,
    43  			want: WarningValue{
    44  				Code:  299,
    45  				Agent: "-",
    46  				Text:  " ",
    47  			},
    48  		},
    49  		{
    50  			name:    "Multiple spaces in warning",
    51  			header:  `299  -   "This is a warning."`,
    52  			want:    WarningValue{},
    53  			wantErr: errUnexpectedWarningFormat,
    54  		},
    55  		{
    56  			name:    "Leading space in warning",
    57  			header:  ` 299 - "This is a warning."`,
    58  			want:    WarningValue{},
    59  			wantErr: errUnexpectedWarningFormat,
    60  		},
    61  		{
    62  			name:    "Trailing space in warning",
    63  			header:  `299 - "This is a warning." `,
    64  			want:    WarningValue{},
    65  			wantErr: errUnexpectedWarningFormat,
    66  		},
    67  		{
    68  			name:    "Warning with a non-299 code",
    69  			header:  `199 - "This is a warning."`,
    70  			want:    WarningValue{},
    71  			wantErr: errUnexpectedWarningFormat,
    72  		},
    73  		{
    74  			name:    "Warning with a non-unknown agent",
    75  			header:  `299 localhost:5000 "This is a warning."`,
    76  			want:    WarningValue{},
    77  			wantErr: errUnexpectedWarningFormat,
    78  		},
    79  		{
    80  			name:    "Warning with a date",
    81  			header:  `299 - "This is a warning." "Sat, 25 Aug 2012 23:34:45 GMT"`,
    82  			want:    WarningValue{},
    83  			wantErr: errUnexpectedWarningFormat,
    84  		},
    85  		{
    86  			name:    "Invalid format",
    87  			header:  `299 - "This is a warning." something strange`,
    88  			want:    WarningValue{},
    89  			wantErr: errUnexpectedWarningFormat,
    90  		},
    91  		{
    92  			name:    "Not a warning",
    93  			header:  `foo bar baz`,
    94  			want:    WarningValue{},
    95  			wantErr: errUnexpectedWarningFormat,
    96  		},
    97  		{
    98  			name:    "No code",
    99  			header:  `- "This is a warning."`,
   100  			want:    WarningValue{},
   101  			wantErr: errUnexpectedWarningFormat,
   102  		},
   103  		{
   104  			name:    "No agent",
   105  			header:  `299 "This is a warning."`,
   106  			want:    WarningValue{},
   107  			wantErr: errUnexpectedWarningFormat,
   108  		},
   109  		{
   110  			name:    "No text",
   111  			header:  `299 -`,
   112  			want:    WarningValue{},
   113  			wantErr: errUnexpectedWarningFormat,
   114  		},
   115  		{
   116  			name:    "Empty text",
   117  			header:  `299 - ""`,
   118  			want:    WarningValue{},
   119  			wantErr: errUnexpectedWarningFormat,
   120  		},
   121  		{
   122  			name:    "Unquoted text",
   123  			header:  `299 - This is a warning.`,
   124  			want:    WarningValue{},
   125  			wantErr: errUnexpectedWarningFormat,
   126  		},
   127  		{
   128  			name:    "Single-quoted text",
   129  			header:  `299 - 'This is a warning.'`,
   130  			want:    WarningValue{},
   131  			wantErr: errUnexpectedWarningFormat,
   132  		},
   133  		{
   134  			name:    "Back-quoted text",
   135  			header:  "299 - `This is a warning.`",
   136  			want:    WarningValue{},
   137  			wantErr: errUnexpectedWarningFormat,
   138  		},
   139  		{
   140  			name:    "Invalid quotes",
   141  			header:  `299 - 'This is a warning."`,
   142  			want:    WarningValue{},
   143  			wantErr: errUnexpectedWarningFormat,
   144  		},
   145  	}
   146  	for _, tt := range tests {
   147  		t.Run(tt.name, func(t *testing.T) {
   148  			got, err := parseWarningHeader(tt.header)
   149  			if !errors.Is(err, tt.wantErr) {
   150  				t.Errorf("parseWarningHeader() error = %v, wantErr %v", err, tt.wantErr)
   151  				return
   152  			}
   153  			if !reflect.DeepEqual(got, tt.want) {
   154  				t.Errorf("parseWarningHeader() = %v, want %v", got, tt.want)
   155  			}
   156  		})
   157  	}
   158  }