// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package repo

import (
	"encoding/json"
	"reflect"
	"sort"
	"testing"

	tuf_data "github.com/flynn/go-tuf/data"
)

func TestMarshaling(t *testing.T) {
	goldenCfg := Config{
		URL: "fuchsia-pkg://example.com",
		RootKeys: []KeyConfig{
			{
				ED25519Key: "8e70ed31f117087a08ad23e00c2e1c353bf76fc0e0ac1aac334336e2b83ee7f4",
			},
		},
		Mirrors: []MirrorConfig{{
			URL:       "https://example.com/repo",
			Subscribe: true,
		}},
		RootVersion:   1,
		RootThreshold: 1,
	}

	cfgStr := `
    {
      "repo_url": "fuchsia-pkg://example.com",
      "root_keys": [
        {
          "type": "ed25519",
          "value": "8e70ed31f117087a08ad23e00c2e1c353bf76fc0e0ac1aac334336e2b83ee7f4"
        }
      ],
      "mirrors": [
        {
          "mirror_url": "https://example.com/repo",
          "subscribe": true
        }
      ]
  }`

	var cfg Config
	if err := json.Unmarshal([]byte(cfgStr), &cfg); err != nil {
		t.Fatalf("could not unmarshal golden config string: %v", err)
	}

	if !reflect.DeepEqual(cfg, goldenCfg) {
		t.Fatalf("expected\n%#v\nand\n%#v\nto be equal", cfg, goldenCfg)
	}
}

func TestGetRootKeys(t *testing.T) {
	rootJSONStr := `
{
  "_type": "root",
  "keys": {
    "33efe3720e278de9ac57c810c1be71b9ef4dd49c0951edd9a2f9a39af08b5776": {
      "keyid_hash_algorithms": [
       "sha256"
      ],
      "keytype": "ed25519",
      "keyval": {
        "public": "8e70ed31f117087a08ad23e00c2e1c353bf76fc0e0ac1aac334336e2b83ee7f4"
      },
      "scheme": "ed25519"
    },
    "8bcc00bc3575eea5fb608dea6a521845d4f287d2fa80baa40a902f1f3ec7911e": {
      "keyid_hash_algorithms": [
        "sha256"
      ],
     "keytype": "ed25519",
     "keyval": {
        "public": "be0b983f7396da675c40c6b93e47fced7c1e9ea8a32a1fe952ba8f519760b307"
      },
      "scheme": "ed25519"
    },
    "c919b6e358fdb4ed062311ac5cebd44787d0f7ae9e5a5a213929dd4e3cde07c4": {
      "keyid_hash_algorithms": [
        "sha256"
      ],
      "keytype": "ed25519",
      "keyval": {
        "public": "be0b983f7396da675c40c6b93e47fced7c1e9ea8a32a1fe952ba8f519760b307"
      },
      "scheme": "ed25519"
    },
    "f6ee2f092af683f6c1d8cbf477c2a8b7e01cc496fb4324150a172a54f514e4e7": {
      "keyid_hash_algorithms": [
        "sha256"
      ],
      "keytype": "ed25519",
      "keyval": {
        "public": "8e70ed31f117087a08ad23e00c2e1c353bf76fc0e0ac1aac334336e2b83ee7f4"
      },
      "scheme": "ed25519"
    }
  },
  "roles": {
    "root": {
      "keyids": [
        "8bcc00bc3575eea5fb608dea6a521845d4f287d2fa80baa40a902f1f3ec7911e",
        "c919b6e358fdb4ed062311ac5cebd44787d0f7ae9e5a5a213929dd4e3cde07c4",
        "f6ee2f092af683f6c1d8cbf477c2a8b7e01cc496fb4324150a172a54f514e4e7"
      ]
    },
    "other": {
      "keyids": [
        "33efe3720e278de9ac57c810c1be71b9ef4dd49c0951edd9a2f9a39af08b5776",
        "f6ee2f092af683f6c1d8cbf477c2a8b7e01cc496fb4324150a172a54f514e4e7"
      ]
    }
  }
}
`
	var root tuf_data.Root
	if err := json.Unmarshal([]byte(rootJSONStr), &root); err != nil {
		t.Fatalf("failed to unmarshal root metadata: %v", err)
	}
	actual, err := GetRootKeys(&root)
	if err != nil {
		t.Fatalf("failed to derive root keys: %v", err)
	}
	sort.Slice(actual, func(i, j int) bool {
		return actual[i].ED25519Key <= actual[j].ED25519Key
	})
	expected := []KeyConfig{
		{
			ED25519Key: "8e70ed31f117087a08ad23e00c2e1c353bf76fc0e0ac1aac334336e2b83ee7f4",
		},
		{
			ED25519Key: "be0b983f7396da675c40c6b93e47fced7c1e9ea8a32a1fe952ba8f519760b307",
		},
	}
	if !reflect.DeepEqual(expected, actual) {
		t.Errorf("unexpected keys:\nexpected: %v\nactual: %v", expected, actual)
	}
}
