/// <summary>
        /// Return the test environment created using CSM environment variables
        /// </summary>
        /// <returns>The test environment.</returns>
        protected override TestEnvironment GetTestEnvironmentFromContext()
        {
            TestEnvironment environment = null;
            try
            {
                environment = base.GetOrgIdTestEnvironment(TestCSMOrgIdConnectionStringKey);
            }
            catch (ArgumentException exception)
            {
                // allow running gallery tests
                TracingAdapter.Information("Node.exe was not found on the system, please install the x86 version of node.exe to run tests, received exception {0}", exception);
            }

            string galleryUri = Environment.GetEnvironmentVariable(TestCSMGalleryUri);
            if (null == environment)
            {
                // we shouild be able to run gallery tests, even if credentials are not set up
                environment = new TestEnvironment();
            }

            if (!string.IsNullOrEmpty(galleryUri))
            {
                environment.GalleryUri = new Uri(galleryUri);
            }
            else
            {
                environment.GalleryUri = new Uri(DefaultGalleryUri);
            }

            return environment;
        }
        /// <summary>
        /// Return test credentials and URI using AAD auth for an OrgID account.  Use this emthod with causion, it may take a dependency on ADAL
        /// </summary>
        /// <returns>The test credentials, or null if nthe appropriate environment variablke is not set.</returns>
        protected virtual TestEnvironment GetOrgIdTestEnvironment(string orgIdVariable)
        {
            TestEnvironment orgIdEnvironment = null;
            string orgIdAuth = GetOrgId(orgIdVariable);
            if (!string.IsNullOrEmpty(orgIdAuth))
            {
                string token = null;
                IDictionary<string, string> authSettings = ParseConnectionString(orgIdAuth);
                string subscription = authSettings[SubscriptionIdKey];
                string authEndpoint = authSettings.ContainsKey(AADAuthEndpoint) ? authSettings[AADAuthEndpoint] : AADAuthEndpointDefault;
                string tenant = authSettings.ContainsKey(AADTenant) ? authSettings[AADTenant] : AADTenantDefault;
                string user = null;

                // Preserve/restore subscription ID
                if (HttpMockServer.Mode == HttpRecorderMode.Record)
                {
                    HttpMockServer.Variables[SubscriptionIdKey] = subscription;
                    if (authSettings.ContainsKey(AADUserIdKey) && authSettings.ContainsKey(AADPasswordKey))
                    {
                        user = authSettings[AADUserIdKey];
                        string password = authSettings[AADPasswordKey];
                        Tracing.Information("Using AAD auth with username and password combination");
                        token = TokenCloudCredentialsHelper.GetTokenFromBasicCredentials(user, password, authEndpoint, tenant);
                    }
                    else
                    {
                        Tracing.Information("Using AAD auth with pop-up dialog");
                        string clientId = authSettings.ContainsKey(ClientID) ? authSettings[ClientID] : ClientIdDefault;
                        if (authSettings.ContainsKey(RawToken))
                        {
                            token = authSettings[RawToken];
                        }
                        else
                        {
                            token = TokenCloudCredentialsHelper.GetToken(authEndpoint, tenant, clientId);
                        }
                    }
                }

                if (HttpMockServer.Mode == HttpRecorderMode.Playback)
                {
                    // playback mode but no stored credentials in mocks
                    Tracing.Information("Using dummy token for playback");
                    token = Guid.NewGuid().ToString();
                }

                orgIdEnvironment = new TestEnvironment
                {
                    Credentials = token == null ? null : new TokenCloudCredentials(subscription, token),
                    UserName = user
                };

                if (authSettings.ContainsKey(BaseUriKey))
                {
                    orgIdEnvironment.BaseUri = new Uri(authSettings[BaseUriKey]);
                }

                if (!string.IsNullOrEmpty(authEndpoint))
                {
                    orgIdEnvironment.ActiveDirectoryEndpoint = new Uri(authEndpoint);
                }

                orgIdEnvironment.SubscriptionId = subscription;
            }

            return orgIdEnvironment;
        }
        /// <summary>
        /// Get the test environment from a connection string specifying a certificate
        /// </summary>
        /// <param name="testConnectionString">The connetcion string to parse</param>
        /// <returns>The test environment from parsing the connection string.</returns>
        protected virtual TestEnvironment GetCertificateTestEnvironmentFromConnectionString(string testConnectionString)
        {
            IDictionary<string, string> connections = ParseConnectionString(testConnectionString);
            string certificateReference = connections[ManagementCertificateKey];
            string subscriptionId = connections[SubscriptionIdKey];
            Assert.IsNotNull(certificateReference);
            X509Certificate2 managementCertificate;
            if (IsCertificateReference(certificateReference))
            {
                managementCertificate = GetCertificateFromReference(certificateReference);
            }
            else
            {
                managementCertificate = GetCertificateFromBase64String(certificateReference);
            }

            CertificateCloudCredentials credentials = new CertificateCloudCredentials(subscriptionId, managementCertificate);
            TestEnvironment currentEnvironment = new TestEnvironment { Credentials = credentials };
            if (connections.ContainsKey(BaseUriKey))
            {
                currentEnvironment.BaseUri = new Uri(connections[BaseUriKey]);
            }

            return currentEnvironment;
        }
        /// <summary>
        /// Return test credentials and URI using AAD auth for an OrgID account.  Use this emthod with causion, it may take a dependency on ADAL
        /// </summary>
        /// <returns>The test credentials, or null if nthe appropriate environment variablke is not set.</returns>
        protected virtual TestEnvironment GetOrgIdTestEnvironment(string orgIdVariable)
        {
            TestEnvironment orgIdEnvironment = null;
            string orgIdAuth = Environment.GetEnvironmentVariable(orgIdVariable);
            if (!string.IsNullOrEmpty(orgIdAuth))
            {
                string token = null;
                IDictionary<string, string> authSettings = ParseConnectionString(orgIdAuth);
                string subscription = authSettings[SubscriptionIdKey];
                string authEndpoint = authSettings.ContainsKey(AADAuthEndpoint) ? authSettings[AADAuthEndpoint] : AADAuthEndpointDefault;
                string tenant = authSettings.ContainsKey(AADTenant) ? authSettings[AADTenant] : AADTenantDefault;
                string user = null;
                if (authSettings.ContainsKey(AADUserIdKey) && authSettings.ContainsKey(AADPasswordKey))
                {
                    user = authSettings[AADUserIdKey];
                    string password = authSettings[AADPasswordKey];
                    Tracing.Information("Using AAD auth with username and password combination");
                    token = TokenCloudCredentialsHelper.GetTokenFromBasicCredentials(user, password, authEndpoint, tenant);
                    Tracing.Information("Using token {0}", token);
                }
                else
                {
                    Tracing.Information("Using AAD auth with pop-up dialog");
                    string clientId = authSettings.ContainsKey(ClientID) ? authSettings[ClientID] : ClientIdDefault;
                    if (authSettings.ContainsKey(RawToken))
                    {
                        token = authSettings[RawToken];
                    }
                }

                orgIdEnvironment = new TestEnvironment
                {
                    Credentials = token == null ? null : new TokenCloudCredentials(subscription, token),
                    UserName = user
                };

                if (authSettings.ContainsKey(BaseUriKey))
                {
                    orgIdEnvironment.BaseUri = new Uri(authSettings[BaseUriKey]);
                }

                if (!string.IsNullOrEmpty(authEndpoint))
                {
                    orgIdEnvironment.ActiveDirectoryEndpoint = new Uri(authEndpoint);
                }

                orgIdEnvironment.SubscriptionId = subscription;
            }

            return orgIdEnvironment;
        }
        private void SetupAzureEnvironmentFromEnvironmentVariables()
        {
            ServiceManagementTestEnvironmentFactory serviceManagementTestEnvironmentFactory = new ServiceManagementTestEnvironmentFactory();
            TestEnvironment rdfeEnvironment = serviceManagementTestEnvironmentFactory.GetTestEnvironment();
            ResourceManagerTestEnvironmentFactory resourceManagerTestEnvironmentFactory = new ResourceManagerTestEnvironmentFactory();
            TestEnvironment csmEnvironment = resourceManagerTestEnvironmentFactory.GetTestEnvironment();
            string jwtToken;
            
            if (_moduleMode == AzureModule.AzureResourceManager) 
            {
                jwtToken = csmEnvironment.Credentials != null ? 
                ((TokenCloudCredentials)csmEnvironment.Credentials).Token : null;
            } else if (_moduleMode == AzureModule.AzureServiceManagement) 
            {
                jwtToken = rdfeEnvironment.Credentials != null ?
                ((TokenCloudCredentials)rdfeEnvironment.Credentials).Token : null;
            } else 
            {
                throw new ArgumentException("Invalid module mode.");
            }

            WindowsAzureProfile.Instance.TokenProvider = new FakeAccessTokenProvider(jwtToken, csmEnvironment.UserName);
            
            WindowsAzureProfile.Instance.CurrentEnvironment = WindowsAzureProfile.Instance.Environments[testEnvironmentName];

            WindowsAzureProfile.Instance.CurrentEnvironment.ActiveDirectoryEndpoint =
                csmEnvironment.ActiveDirectoryEndpoint.AbsoluteUri;
            WindowsAzureProfile.Instance.CurrentEnvironment.GalleryEndpoint =
                csmEnvironment.GalleryUri.AbsoluteUri;
            WindowsAzureProfile.Instance.CurrentEnvironment.ResourceManagerEndpoint =
                csmEnvironment.BaseUri.AbsoluteUri;
            WindowsAzureProfile.Instance.CurrentEnvironment.ServiceEndpoint =
                rdfeEnvironment.BaseUri.AbsoluteUri;

            testSubscrption = new WindowsAzureSubscription(false, false)
            {
                SubscriptionId = csmEnvironment.SubscriptionId,
                ActiveDirectoryEndpoint =
                    WindowsAzureProfile.Instance.CurrentEnvironment.ActiveDirectoryEndpoint,
                ActiveDirectoryUserId = csmEnvironment.UserName,
                SubscriptionName = csmEnvironment.SubscriptionId,
                ServiceEndpoint = new Uri(WindowsAzureProfile.Instance.CurrentEnvironment.ServiceEndpoint),
                ResourceManagerEndpoint = new Uri(WindowsAzureProfile.Instance.CurrentEnvironment.ResourceManagerEndpoint),
                TokenProvider = WindowsAzureProfile.Instance.TokenProvider,
                GalleryEndpoint = new Uri(WindowsAzureProfile.Instance.CurrentEnvironment.GalleryEndpoint),
                SqlDatabaseDnsSuffix = WindowsAzureProfile.Instance.CurrentEnvironment.SqlDatabaseDnsSuffix,
                CurrentStorageAccountName = csmEnvironment.StorageAccount,
                IsDefault = true
            };

            testEnvironment = csmEnvironment;
            if (HttpMockServer.GetCurrentMode() == HttpRecorderMode.Playback)
            {
                testSubscrption.SetAccessToken(new FakeAccessToken
                {
                    AccessToken = "123",
                    UserId = testEnvironment.UserName
                });
            }
            else
            {
                testSubscrption.SetAccessToken(WindowsAzureProfile.Instance.TokenProvider.GetNewToken(WindowsAzureProfile.Instance.CurrentEnvironment));
            }

            WindowsAzureProfile.Instance.AddSubscription(testSubscrption);
            WindowsAzureProfile.Instance.Save();
        }