Add unit tests for manifest package
Signed-off-by: Stephen J Day <stephen.day@docker.com>master
							parent
							
								
									a4024b2f90
								
							
						
					
					
						commit
						579aa3b617
					
				|  | @ -0,0 +1,110 @@ | |||
| package manifest | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"reflect" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/docker/libtrust" | ||||
| ) | ||||
| 
 | ||||
| type testEnv struct { | ||||
| 	name, tag string | ||||
| 	manifest  *Manifest | ||||
| 	signed    *SignedManifest | ||||
| 	pk        libtrust.PrivateKey | ||||
| } | ||||
| 
 | ||||
| func TestManifestMarshaling(t *testing.T) { | ||||
| 	env := genEnv(t) | ||||
| 
 | ||||
| 	// Check that the Raw field is the same as json.MarshalIndent with these
 | ||||
| 	// parameters.
 | ||||
| 	p, err := json.MarshalIndent(env.signed, "", "   ") | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("error marshaling manifest: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if !bytes.Equal(p, env.signed.Raw) { | ||||
| 		t.Fatalf("manifest bytes not equal: %q != %q", string(env.signed.Raw), string(p)) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestManifestUnmarshaling(t *testing.T) { | ||||
| 	env := genEnv(t) | ||||
| 
 | ||||
| 	var signed SignedManifest | ||||
| 	if err := json.Unmarshal(env.signed.Raw, &signed); err != nil { | ||||
| 		t.Fatalf("error unmarshaling signed manifest: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if !reflect.DeepEqual(&signed, env.signed) { | ||||
| 		t.Fatalf("manifests are different after unmarshaling: %v != %v", signed, env.signed) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestManifestVerification(t *testing.T) { | ||||
| 	env := genEnv(t) | ||||
| 
 | ||||
| 	publicKeys, err := env.signed.Verify() | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("error verifying manifest: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if len(publicKeys) == 0 { | ||||
| 		t.Fatalf("no public keys found in signature") | ||||
| 	} | ||||
| 
 | ||||
| 	var found bool | ||||
| 	publicKey := env.pk.PublicKey() | ||||
| 	// ensure that one of the extracted public keys matches the private key.
 | ||||
| 	for _, candidate := range publicKeys { | ||||
| 		if candidate.KeyID() == publicKey.KeyID() { | ||||
| 			found = true | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if !found { | ||||
| 		t.Fatalf("expected public key, %v, not found in verified keys: %v", publicKey, publicKeys) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func genEnv(t *testing.T) *testEnv { | ||||
| 	pk, err := libtrust.GenerateECP256PrivateKey() | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("error generating test key: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	name, tag := "foo/bar", "test" | ||||
| 
 | ||||
| 	m := Manifest{ | ||||
| 		Versioned: Versioned{ | ||||
| 			SchemaVersion: 1, | ||||
| 		}, | ||||
| 		Name: name, | ||||
| 		Tag:  tag, | ||||
| 		FSLayers: []FSLayer{ | ||||
| 			{ | ||||
| 				BlobSum: "asdf", | ||||
| 			}, | ||||
| 			{ | ||||
| 				BlobSum: "qwer", | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	sm, err := m.Sign(pk) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("error signing manifest: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	return &testEnv{ | ||||
| 		name:     name, | ||||
| 		tag:      tag, | ||||
| 		manifest: &m, | ||||
| 		signed:   sm, | ||||
| 		pk:       pk, | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in New Issue