func TestFetchUserdata(t *testing.T) {
	for _, tt := range []struct {
		root  string
		files test.MockFilesystem

		userdata string
	}{
		{
			"/",
			test.NewMockFilesystem(),
			"",
		},
		{
			"/",
			test.NewMockFilesystem(test.File{Path: "/openstack/latest/user_data", Contents: "userdata"}),
			"userdata",
		},
		{
			"/media/configdrive",
			test.NewMockFilesystem(test.File{Path: "/media/configdrive/openstack/latest/user_data", Contents: "userdata"}),
			"userdata",
		},
	} {
		cd := configDrive{tt.root, tt.files.ReadFile}
		userdata, err := cd.FetchUserdata()
		if err != nil {
			t.Fatalf("bad error for %+v: want %v, got %q", tt, nil, err)
		}
		if string(userdata) != tt.userdata {
			t.Fatalf("bad userdata for %+v: want %q, got %q", tt, tt.userdata, userdata)
		}
	}
}
func TestFetchUserdata(t *testing.T) {
	for _, tt := range []struct {
		root  string
		files test.MockFilesystem
	}{
		{
			"/",
			test.NewMockFilesystem(),
		},
		{
			"/",
			test.NewMockFilesystem(test.File{Path: "/CustomData", Contents: ""}),
		},
		{
			"/var/lib/waagent/",
			test.NewMockFilesystem(test.File{Path: "/var/lib/waagent/CustomData", Contents: ""}),
		},
	} {
		a := waagent{tt.root, tt.files.ReadFile}
		_, err := a.FetchUserdata()
		if err != nil {
			t.Fatalf("bad error for %+v: want %v, got %q", tt, nil, err)
		}
	}
}
func TestFetchMetadata(t *testing.T) {
	for _, tt := range []struct {
		root  string
		files test.MockFilesystem

		metadata datasource.Metadata
	}{
		{
			root:  "/",
			files: test.NewMockFilesystem(test.File{Path: "/openstack/latest/meta_data.json", Contents: ""}),
		},
		{
			root:  "/",
			files: test.NewMockFilesystem(test.File{Path: "/openstack/latest/meta_data.json", Contents: `{"ignore": "me"}`}),
		},
		{
			root:     "/",
			files:    test.NewMockFilesystem(test.File{Path: "/openstack/latest/meta_data.json", Contents: `{"hostname": "host"}`}),
			metadata: datasource.Metadata{Hostname: "host"},
		},
		{
			root: "/media/configdrive",
			files: test.NewMockFilesystem(test.File{Path: "/media/configdrive/openstack/latest/meta_data.json", Contents: `{"hostname": "host", "network_config": {"content_path": "config_file.json"}, "public_keys":{"1": "key1", "2": "key2"}}`},
				test.File{Path: "/media/configdrive/openstack/config_file.json", Contents: "make it work"},
			),
			metadata: datasource.Metadata{
				Hostname:      "host",
				NetworkConfig: []byte("make it work"),
				SSHPublicKeys: map[string]string{
					"1": "key1",
					"2": "key2",
				},
			},
		},
	} {
		cd := configDrive{tt.root, tt.files.ReadFile}
		metadata, err := cd.FetchMetadata()
		if err != nil {
			t.Fatalf("bad error for %+v: want %v, got %q", tt, nil, err)
		}
		if !reflect.DeepEqual(tt.metadata, metadata) {
			t.Fatalf("bad metadata for %+v: want %#v, got %#v", tt, tt.metadata, metadata)
		}
	}
}
func TestFetchMetadata(t *testing.T) {
	for _, tt := range []struct {
		root     string
		files    test.MockFilesystem
		metadata datasource.Metadata
	}{
		{
			root:  "/",
			files: test.NewMockFilesystem(),
		},
		{
			root:  "/",
			files: test.NewMockFilesystem(test.File{Path: "/SharedConfig.xml", Contents: ""}),
		},
		{
			root:  "/var/lib/waagent",
			files: test.NewMockFilesystem(test.File{Path: "/var/lib/waagent/SharedConfig.xml", Contents: ""}),
		},
		{
			root: "/var/lib/waagent",
			files: test.NewMockFilesystem(test.File{Path: "/var/lib/waagent/SharedConfig.xml", Contents: `<?xml version="1.0" encoding="utf-8"?>
<SharedConfig version="1.0.0.0" goalStateIncarnation="1">
  <Deployment name="c8f9e4c9c18948e1bebf57c5685da756" guid="{1d10394f-c741-4a1a-a6bb-278f213c5a5e}" incarnation="0" isNonCancellableTopologyChangeEnabled="false">
    <Service name="core-test-1" guid="{00000000-0000-0000-0000-000000000000}" />
    <ServiceInstance name="c8f9e4c9c18948e1bebf57c5685da756.0" guid="{1e202e9a-8ffe-4915-b6ef-4118c9628fda}" />
  </Deployment>
  <Incarnation number="1" instance="core-test-1" guid="{8767eb4b-b445-4783-b1f5-6c0beaf41ea0}" />
  <Role guid="{53ecc81e-257f-fbc9-a53a-8cf1a0a122b4}" name="core-test-1" settleTimeSeconds="0" />
  <LoadBalancerSettings timeoutSeconds="0" waitLoadBalancerProbeCount="8">
    <Probes>
      <Probe name="D41D8CD98F00B204E9800998ECF8427E" />
      <Probe name="C9DEC1518E1158748FA4B6081A8266DD" />
    </Probes>
  </LoadBalancerSettings>
  <OutputEndpoints>
    <Endpoint name="core-test-1:openInternalEndpoint" type="SFS">
      <Target instance="core-test-1" endpoint="openInternalEndpoint" />
    </Endpoint>
  </OutputEndpoints>
  <Instances>
    <Instance id="core-test-1" address="100.73.202.64">
      <FaultDomains randomId="0" updateId="0" updateCount="0" />
      <InputEndpoints>
        <Endpoint name="openInternalEndpoint" address="100.73.202.64" protocol="any" isPublic="false" enableDirectServerReturn="false" isDirectAddress="false" disableStealthMode="false">
          <LocalPorts>
            <LocalPortSelfManaged />
          </LocalPorts>
        </Endpoint>
        <Endpoint name="ssh" address="100.73.202.64:22" protocol="tcp" hostName="core-test-1ContractContract" isPublic="true" loadBalancedPublicAddress="191.239.39.77:22" enableDirectServerReturn="false" isDirectAddress="false" disableStealthMode="false">
          <LocalPorts>
            <LocalPortRange from="22" to="22" />
          </LocalPorts>
        </Endpoint>
      </InputEndpoints>
    </Instance>
  </Instances>
</SharedConfig>`}),
			metadata: datasource.Metadata{
				PrivateIPv4: net.ParseIP("100.73.202.64"),
				PublicIPv4:  net.ParseIP("191.239.39.77"),
			},
		},
	} {
		a := waagent{tt.root, tt.files.ReadFile}
		metadata, err := a.FetchMetadata()
		if err != nil {
			t.Fatalf("bad error for %+v: want %v, got %q", tt, nil, err)
		}
		if !reflect.DeepEqual(tt.metadata, metadata) {
			t.Fatalf("bad metadata for %+v: want %#v, got %#v", tt, tt.metadata, metadata)
		}
	}
}