package image

import (
	"bytes"
	"io/ioutil"
	"testing"

	"github.com/docker/distribution/digest"
)

var fixtures = []string{
	"fixtures/pre1.9",
	"fixtures/post1.9",
}

func loadFixtureFile(t *testing.T, path string) []byte {
	fileData, err := ioutil.ReadFile(path)
	if err != nil {
		t.Fatalf("error opening %s: %v", path, err)
	}

	return bytes.TrimSpace(fileData)
}

// TestMakeImageConfig makes sure that MakeImageConfig returns the expected
// canonical JSON for a reference Image.
func TestMakeImageConfig(t *testing.T) {
	for _, fixture := range fixtures {
		v1Compatibility := loadFixtureFile(t, fixture+"/v1compatibility")
		expectedConfig := loadFixtureFile(t, fixture+"/expected_config")
		layerID := digest.Digest(loadFixtureFile(t, fixture+"/layer_id"))
		parentID := digest.Digest(loadFixtureFile(t, fixture+"/parent_id"))

		json, err := MakeImageConfig(v1Compatibility, layerID, parentID)
		if err != nil {
			t.Fatalf("MakeImageConfig on %s returned error: %v", fixture, err)
		}
		if !bytes.Equal(json, expectedConfig) {
			t.Fatalf("did not get expected JSON for %s\nexpected: %s\ngot: %s", fixture, expectedConfig, json)
		}
	}
}

// TestGetStrongID makes sure that GetConfigJSON returns the expected
// hash for a reference Image.
func TestGetStrongID(t *testing.T) {
	for _, fixture := range fixtures {
		expectedConfig := loadFixtureFile(t, fixture+"/expected_config")
		expectedComputedID := digest.Digest(loadFixtureFile(t, fixture+"/expected_computed_id"))

		if id, err := StrongID(expectedConfig); err != nil || id != expectedComputedID {
			t.Fatalf("did not get expected ID for %s\nexpected: %s\ngot: %s\nerror: %v", fixture, expectedComputedID, id, err)
		}
	}
}