docs/tuf/data/root_test.go

99 lines
2.7 KiB
Go

package data
import (
"bytes"
rjson "encoding/json"
"fmt"
"reflect"
"testing"
"time"
cjson "github.com/jfrazelle/go/canonical/json"
"github.com/stretchr/testify/require"
)
type errorSerializer struct {
canonicalJSON
}
func (e errorSerializer) MarshalCanonical(from interface{}) ([]byte, error) {
return nil, fmt.Errorf("bad")
}
func TestToSignedMarshalsSignedPortionWithCanonicalJSON(t *testing.T) {
r := SignedRoot{Signed: Root{Type: "root", Version: 2, Expires: time.Now()}}
signedCanonical, err := r.ToSigned()
require.NoError(t, err)
canonicalSignedPortion, err := cjson.MarshalCanonical(r.Signed)
require.NoError(t, err)
castedCanonical := rjson.RawMessage(canonicalSignedPortion)
// don't bother testing regular JSON because it might not be different
require.True(t, bytes.Equal(signedCanonical.Signed, castedCanonical),
"expected %v == %v", signedCanonical.Signed, castedCanonical)
}
func TestToSignCopiesSignatures(t *testing.T) {
r := SignedRoot{
Signed: Root{Type: "root", Version: 2, Expires: time.Now()},
Signatures: []Signature{
{KeyID: "key1", Method: "method1", Signature: []byte("hello")},
},
}
signed, err := r.ToSigned()
require.NoError(t, err)
require.True(t, reflect.DeepEqual(r.Signatures, signed.Signatures),
"expected %v == %v", r.Signatures, signed.Signatures)
r.Signatures[0].KeyID = "changed"
require.False(t, reflect.DeepEqual(r.Signatures, signed.Signatures),
"expected %v != %v", r.Signatures, signed.Signatures)
}
func TestToSignedMarshallingErrorsPropagated(t *testing.T) {
setDefaultSerializer(errorSerializer{})
defer setDefaultSerializer(canonicalJSON{})
r := SignedRoot{
Signed: Root{Type: "root", Version: 2, Expires: time.Now()},
}
_, err := r.ToSigned()
require.EqualError(t, err, "bad")
}
func TestMarshalJSONMarshalsSignedWithRegularJSON(t *testing.T) {
r := SignedRoot{
Signed: Root{Type: "root", Version: 2, Expires: time.Now()},
Signatures: []Signature{
{KeyID: "key1", Method: "method1", Signature: []byte("hello")},
{KeyID: "key2", Method: "method2", Signature: []byte("there")},
},
}
serialized, err := r.MarshalJSON()
require.NoError(t, err)
signed, err := r.ToSigned()
require.NoError(t, err)
// don't bother testing canonical JSON because it might not be different
regular, err := rjson.Marshal(signed)
require.NoError(t, err)
require.True(t, bytes.Equal(serialized, regular),
"expected %v != %v", serialized, regular)
}
func TestMarshalJSONMarshallingErrorsPropagated(t *testing.T) {
setDefaultSerializer(errorSerializer{})
defer setDefaultSerializer(canonicalJSON{})
r := SignedRoot{
Signed: Root{Type: "root", Version: 2, Expires: time.Now()},
}
_, err := r.MarshalJSON()
require.EqualError(t, err, "bad")
}