public void AzureInstanceMetadataObtainedSuccessfully()
        {
            AzureInstanceComputeMetadata expected = new AzureInstanceComputeMetadata()
            {
                Location             = "US-West",
                Name                 = "test-vm01",
                Offer                = "D9_USWest",
                OsType               = "Linux",
                PlatformFaultDomain  = "0",
                PlatformUpdateDomain = "0",
                Publisher            = "Microsoft",
                ResourceGroupName    = "test.resource-group_01",
                Sku            = "Windows_10",
                SubscriptionId = Guid.NewGuid().ToString(),
                Version        = "10.8a",
                VmId           = Guid.NewGuid().ToString(),
                VmSize         = "A8"
            };

            HeartbeatProviderMock            hbeatMock = new HeartbeatProviderMock();
            AzureInstanceMetadataRequestMock azureInstanceRequestorMock = new AzureInstanceMetadataRequestMock(
                getComputeMetadata: () =>
            {
                return(expected);
            });
            var azureIMSFields = new AzureComputeMetadataHeartbeatPropertyProvider(azureInstanceRequestorMock);
            var defaultFields  = azureIMSFields.ExpectedAzureImsFields;

            // not adding the fields we're looking for, simulation of the Azure Instance Metadata service not being present...
            var taskWaiter = azureIMSFields.SetDefaultPayloadAsync(hbeatMock).ConfigureAwait(false);

            Assert.True(taskWaiter.GetAwaiter().GetResult()); // nop await for tests

            foreach (string fieldName in defaultFields)
            {
                string heartbeatFieldName = string.Concat(AzureComputeMetadataHeartbeatPropertyProvider.HeartbeatPropertyPrefix, fieldName);
                Assert.True(hbeatMock.HbeatProps.ContainsKey(heartbeatFieldName));
                Assert.Equal(expected.GetValueForField(fieldName), hbeatMock.HbeatProps[heartbeatFieldName]);
            }
        }
        public void AzureIMSReturnsExpectedValuesForEachFieldAfterSerialization()
        {
            AzureInstanceComputeMetadata expectMetadata = new AzureInstanceComputeMetadata()
            {
                Location             = "US-West",
                Name                 = "test-vm01",
                Offer                = "D9_USWest",
                OsType               = "Linux",
                PlacementGroupId     = "placement-grp",
                PlatformFaultDomain  = "0",
                PlatformUpdateDomain = "0",
                Publisher            = "Microsoft",
                ResourceGroupName    = "test.resource-group_01",
                Sku            = "Windows_10",
                SubscriptionId = Guid.NewGuid().ToString(),
                Tags           = "thisTag;thatTag",
                Version        = "10.8a",
                VmId           = Guid.NewGuid().ToString(),
                VmSize         = "A8"
            };

            DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(AzureInstanceComputeMetadata));

            // use the expected JSON field name style, uses camelCase...
            string jsonFormatString =
                @"{{ 
  ""osType"": ""{0}"",
  ""location"": ""{1}"",
  ""name"": ""{2}"",
  ""offer"": ""{3}"",
  ""placementGroupId"": ""{4}"",
  ""platformFaultDomain"": ""{5}"",
  ""platformUpdateDomain"": ""{6}"",
  ""publisher"": ""{7}"",
  ""sku"": ""{8}"",
  ""version"": ""{9}"",
  ""vmId"": ""{10}"",
  ""vmSize"": ""{11}"",
  ""subscriptionId"": ""{12}"",
  ""tags"": ""{13}"",
  ""resourceGroupName"": ""{14}""
}}";
            string json = string.Format(
                System.Globalization.CultureInfo.InvariantCulture,
                jsonFormatString,
                expectMetadata.OsType,
                expectMetadata.Location,
                expectMetadata.Name,
                expectMetadata.Offer,
                expectMetadata.PlacementGroupId,
                expectMetadata.PlatformFaultDomain,
                expectMetadata.PlatformUpdateDomain,
                expectMetadata.Publisher,
                expectMetadata.Sku,
                expectMetadata.Version,
                expectMetadata.VmId,
                expectMetadata.VmSize,
                expectMetadata.SubscriptionId,
                expectMetadata.Tags,
                expectMetadata.ResourceGroupName);

            var          jsonBytes  = Encoding.UTF8.GetBytes(json);
            MemoryStream jsonStream = new MemoryStream(jsonBytes, 0, jsonBytes.Length);

            AzureInstanceComputeMetadata compareMetadata = (AzureInstanceComputeMetadata)deserializer.ReadObject(jsonStream);

            AzureComputeMetadataHeartbeatPropertyProvider heartbeatProps = new AzureComputeMetadataHeartbeatPropertyProvider();

            foreach (string fieldName in heartbeatProps.ExpectedAzureImsFields)
            {
                Assert.Equal(expectMetadata.GetValueForField(fieldName), compareMetadata.GetValueForField(fieldName));
            }
        }
        public void AzureIMSGetFieldByNameFailsWithException()
        {
            AzureInstanceComputeMetadata md = new AzureInstanceComputeMetadata();

            Assert.Throws(typeof(ArgumentOutOfRangeException), () => md.GetValueForField("not-a-field"));
        }