mirror of https://github.com/docker/docs.git
99 lines
2.7 KiB
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")
|
|
}
|