/*
Copyright 2016 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package openstack

import (
	"strings"
	"testing"
)

var FakeMetadata = Metadata{
	UUID:             "83679162-1378-4288-a2d4-70e13ec132aa",
	Name:             "test",
	AvailabilityZone: "nova",
}

func SetMetadataFixture(value *Metadata) {
	metadataCache = value
}

func ClearMetadata() {
	metadataCache = nil
}

func TestParseMetadata(t *testing.T) {
	_, err := parseMetadata(strings.NewReader("bogus"))
	if err == nil {
		t.Errorf("Should fail when bad data is provided: %s", err)
	}

	data := strings.NewReader(`
{
    "availability_zone": "nova",
    "files": [
        {
            "content_path": "/content/0000",
            "path": "/etc/network/interfaces"
        },
        {
            "content_path": "/content/0001",
            "path": "known_hosts"
        }
    ],
    "hostname": "test.novalocal",
    "launch_index": 0,
    "name": "test",
    "meta": {
        "role": "webservers",
        "essential": "false"
    },
    "public_keys": {
        "mykey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDBqUfVvCSez0/Wfpd8dLLgZXV9GtXQ7hnMN+Z0OWQUyebVEHey1CXuin0uY1cAJMhUq8j98SiW+cU0sU4J3x5l2+xi1bodDm1BtFWVeLIOQINpfV1n8fKjHB+ynPpe1F6tMDvrFGUlJs44t30BrujMXBe8Rq44cCk6wqyjATA3rQ== Generated by Nova\n"
    },
    "uuid": "83679162-1378-4288-a2d4-70e13ec132aa",
    "devices": [
        {
            "bus": "scsi",
            "serial": "6df1888b-f373-41cf-b960-3786e60a28ef",
            "tags": ["fake_tag"],
            "type": "disk",
            "address": "0:0:0:0"
        }
    ]
}
`)
	md, err := parseMetadata(data)
	if err != nil {
		t.Fatalf("Should succeed when provided with valid data: %s", err)
	}

	if md.Name != "test" {
		t.Errorf("incorrect name: %s", md.Name)
	}

	if md.UUID != "83679162-1378-4288-a2d4-70e13ec132aa" {
		t.Errorf("incorrect uuid: %s", md.UUID)
	}

	if md.AvailabilityZone != "nova" {
		t.Errorf("incorrect az: %s", md.AvailabilityZone)
	}

	if len(md.Devices) != 1 {
		t.Errorf("expecting to find 1 device, found %d", len(md.Devices))
	}

	if md.Devices[0].Bus != "scsi" {
		t.Errorf("incorrect disk bus: %s", md.Devices[0].Bus)
	}

	if md.Devices[0].Address != "0:0:0:0" {
		t.Errorf("incorrect disk address: %s", md.Devices[0].Address)
	}

	if md.Devices[0].Type != "disk" {
		t.Errorf("incorrect device type: %s", md.Devices[0].Type)
	}

	if md.Devices[0].Serial != "6df1888b-f373-41cf-b960-3786e60a28ef" {
		t.Errorf("incorrect device serial: %s", md.Devices[0].Serial)
	}
}
