internal: fix unmarshalling attestation version numbers from JSON (#2187)

* Fix unmarshalling attestation version numbers from JSON

* Add unit test for UnmarshalJSON

---------

Signed-off-by: Daniel Weiße <dw@edgeless.systems>
This commit is contained in:
Daniel Weiße 2023-08-09 15:11:14 +02:00 committed by GitHub
parent 656cdbb4bb
commit c9cae643e2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 154 additions and 53 deletions

View file

@ -7,6 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only
package config
import (
"encoding/json"
"testing"
"github.com/stretchr/testify/require"
@ -14,21 +15,18 @@ import (
)
func TestVersionMarshalYAML(t *testing.T) {
tests := []struct {
name string
tests := map[string]struct {
sut AttestationVersion
want string
}{
{
name: "isLatest resolves to latest",
"isLatest resolves to latest": {
sut: AttestationVersion{
Value: 1,
WantLatest: true,
},
want: "latest\n",
},
{
name: "value 5 resolves to 5",
"value 5 resolves to 5": {
sut: AttestationVersion{
Value: 5,
WantLatest: false,
@ -36,81 +34,177 @@ func TestVersionMarshalYAML(t *testing.T) {
want: "5\n",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
bt, err := yaml.Marshal(tt.sut)
require.NoError(t, err)
require.Equal(t, tt.want, string(bt))
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
require := require.New(t)
bt, err := yaml.Marshal(tc.sut)
require.NoError(err)
require.Equal(tc.want, string(bt))
})
}
}
func TestVersionUnmarshalYAML(t *testing.T) {
tests := []struct {
name string
tests := map[string]struct {
sut string
want AttestationVersion
wantErr bool
}{
{
name: "latest resolves to isLatest",
sut: "latest",
"latest resolves to isLatest": {
sut: "latest",
want: AttestationVersion{
Value: 0,
WantLatest: true,
},
wantErr: false,
},
{
name: "1 resolves to value 1",
sut: "1",
"1 resolves to value 1": {
sut: "1",
want: AttestationVersion{
Value: 1,
WantLatest: false,
},
wantErr: false,
},
{
name: "max uint8+1 errors",
"max uint8+1 errors": {
sut: "256",
wantErr: true,
},
{
name: "-1 errors",
"-1 errors": {
sut: "-1",
wantErr: true,
},
{
name: "2.6 errors",
"2.6 errors": {
sut: "2.6",
wantErr: true,
},
{
name: "2.0 errors",
"2.0 errors": {
sut: "2.0",
wantErr: true,
},
{
name: "hex format is invalid",
"hex format is invalid": {
sut: "0x10",
wantErr: true,
},
{
name: "octal format is invalid",
"octal format is invalid": {
sut: "010",
wantErr: true,
},
"0 resolves to value 0": {
sut: "0",
want: AttestationVersion{
Value: 0,
WantLatest: false,
},
},
"00 errors": {
sut: "00",
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
require := require.New(t)
var sut AttestationVersion
err := yaml.Unmarshal([]byte(tt.sut), &sut)
if tt.wantErr {
require.Error(t, err)
err := yaml.Unmarshal([]byte(tc.sut), &sut)
if tc.wantErr {
require.Error(err)
return
}
require.NoError(t, err)
require.Equal(t, tt.want, sut)
require.NoError(err)
require.Equal(tc.want, sut)
})
}
}
func TestVersionUnmarshalJSON(t *testing.T) {
tests := map[string]struct {
sut string
want AttestationVersion
wantErr bool
}{
"latest resolves to isLatest": {
sut: `"latest"`,
want: AttestationVersion{
Value: 0,
WantLatest: true,
},
},
"1 resolves to value 1": {
sut: "1",
want: AttestationVersion{
Value: 1,
WantLatest: false,
},
},
"quoted number resolves to value": {
sut: `"1"`,
want: AttestationVersion{
Value: 1,
WantLatest: false,
},
},
"quoted float errors": {
sut: `"1.0"`,
wantErr: true,
},
"max uint8+1 errors": {
sut: "256",
wantErr: true,
},
"-1 errors": {
sut: "-1",
wantErr: true,
},
"2.6 errors": {
sut: "2.6",
wantErr: true,
},
"2.0 errors": {
sut: "2.0",
wantErr: true,
},
"hex format is invalid": {
sut: "0x10",
wantErr: true,
},
"octal format is invalid": {
sut: "010",
wantErr: true,
},
"0 resolves to value 0": {
sut: "0",
want: AttestationVersion{
Value: 0,
WantLatest: false,
},
},
"quoted 0 resolves to value 0": {
sut: `"0"`,
want: AttestationVersion{
Value: 0,
WantLatest: false,
},
},
"00 errors": {
sut: "00",
wantErr: true,
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
require := require.New(t)
var sut AttestationVersion
err := json.Unmarshal([]byte(tc.sut), &sut)
if tc.wantErr {
require.Error(err)
return
}
require.NoError(err)
require.Equal(tc.want, sut)
})
}
}