/// <summary> /// Start the default Primary and Secondary test silos, plus client in-process, /// using the specified silo and client config options. /// </summary> public UnitTestSiloHost(UnitTestSiloOptions siloOptions, UnitTestClientOptions clientOptions) { this.siloInitOptions = siloOptions; this.clientInitOptions = clientOptions; AppDomain.CurrentDomain.UnhandledException += ReportUnobservedException; try { Initialize(siloOptions, clientOptions); string startMsg = "----------------------------- STARTING NEW UNIT TEST SILO HOST: " + this.GetType().FullName + " -------------------------------------"; WriteLog(startMsg); } catch (TimeoutException te) { throw new TimeoutException("Timeout during test initialization", te); } catch (Exception ex) { Exception baseExc = ex.GetBaseException(); if (baseExc is TimeoutException) { throw new TimeoutException("Timeout during test initialization", ex); } throw new AggregateException( string.Format("Exception during test initialization: {0}", TraceLogger.PrintException(ex)), ex); } }
/// <summary> /// Restart the default Primary and Secondary silos. /// </summary> public void RestartDefaultSilos() { UnitTestSiloOptions primarySiloOptions = Primary.Options; UnitTestSiloOptions secondarySiloOptions = Secondary.Options; // Restart as the same deployment string deploymentId = DeploymentId; StopDefaultSilos(); DeploymentId = deploymentId; primarySiloOptions.PickNewDeploymentId = false; secondarySiloOptions.PickNewDeploymentId = false; Primary = StartOrleansSilo(Silo.SiloType.Primary, primarySiloOptions); Secondary = StartOrleansSilo(Silo.SiloType.Secondary, secondarySiloOptions); WaitForLivenessToStabilize(); GrainClient.Initialize(); }
private SiloHandle StartOrleansSilo(Silo.SiloType type, UnitTestSiloOptions options, AppDomain shared = null) { // Load initial config settings, then apply some overrides below. ClusterConfiguration config = new ClusterConfiguration(); if (options.SiloConfigFile == null) { config.StandardLoad(); } else { config.LoadFromFile(options.SiloConfigFile.FullName); } int basePort = options.BasePort < 0 ? BasePort : options.BasePort; if (config.Globals.SeedNodes.Count > 0 && options.BasePort < 0) { config.PrimaryNode = config.Globals.SeedNodes[0]; } else { config.PrimaryNode = new IPEndPoint(IPAddress.Loopback, basePort); } config.Globals.SeedNodes.Clear(); config.Globals.SeedNodes.Add(config.PrimaryNode); if (!String.IsNullOrEmpty(DeploymentId)) { config.Globals.DeploymentId = DeploymentId; } config.Defaults.PropagateActivityId = options.PropagateActivityId; if (options.LargeMessageWarningThreshold > 0) { config.Defaults.LargeMessageWarningThreshold = options.LargeMessageWarningThreshold; } config.Globals.LivenessType = options.LivenessType; globalConfig = config.Globals; string siloName; switch (type) { case Silo.SiloType.Primary: siloName = "Primary"; break; default: siloName = "Secondary_" + InstanceCounter.ToString(CultureInfo.InvariantCulture); break; } NodeConfiguration nodeConfig = config.GetConfigurationForNode(siloName); nodeConfig.HostNameOrIPAddress = "loopback"; nodeConfig.Port = basePort + InstanceCounter; nodeConfig.DefaultTraceLevel = config.Defaults.DefaultTraceLevel; nodeConfig.PropagateActivityId = config.Defaults.PropagateActivityId; nodeConfig.BulkMessageLimit = config.Defaults.BulkMessageLimit; if (nodeConfig.ProxyGatewayEndpoint != null && nodeConfig.ProxyGatewayEndpoint.Address != null) { nodeConfig.ProxyGatewayEndpoint = new IPEndPoint(nodeConfig.ProxyGatewayEndpoint.Address, ProxyBasePort + InstanceCounter); } config.Globals.ExpectedClusterSize = 2; config.Overrides[siloName] = nodeConfig; InstanceCounter++; WriteLog("Starting a new silo in app domain {0} with config {1}", siloName, config.ToString(siloName)); AppDomain appDomain; Silo silo = LoadSiloInNewAppDomain(siloName, type, config, out appDomain); silo.Start(); SiloHandle retValue = new SiloHandle { Name = siloName, Silo = silo, Options = options, Endpoint = silo.SiloAddress.Endpoint, AppDomain = appDomain, }; return(retValue); }
private void Initialize(UnitTestSiloOptions options, UnitTestClientOptions clientOptions = null) { bool doStartPrimary = false; bool doStartSecondary = false; if (options.StartFreshOrleans) { // the previous test was !startFresh, so we need to cleanup after it. if (Primary != null || Secondary != null || GrainClient.IsInitialized) { StopDefaultSilos(); } StopAdditionalSilos(); if (options.StartPrimary) { doStartPrimary = true; } if (options.StartSecondary) { doStartSecondary = true; } } else { if (options.StartPrimary && Primary == null) { // first time. doStartPrimary = true; } if (options.StartSecondary && Secondary == null) { doStartSecondary = true; } } if (options.PickNewDeploymentId && String.IsNullOrEmpty(DeploymentId)) { DeploymentId = GetDeploymentId(); } if (doStartPrimary) { Primary = StartOrleansSilo(Silo.SiloType.Primary, options); } if (doStartSecondary) { Secondary = StartOrleansSilo(Silo.SiloType.Secondary, options); } if (!GrainClient.IsInitialized && options.StartClient) { if (clientOptions.ClientConfigFile != null) { clientConfig = ClientConfiguration.LoadFromFile(clientOptions.ClientConfigFile.FullName); } else { clientConfig = ClientConfiguration.StandardLoad(); } if (clientOptions.ProxiedGateway && clientOptions.Gateways != null) { clientConfig.Gateways = clientOptions.Gateways; if (clientOptions.PreferedGatewayIndex >= 0) { clientConfig.PreferedGatewayIndex = clientOptions.PreferedGatewayIndex; } } if (clientOptions.PropagateActivityId) { clientConfig.PropagateActivityId = clientOptions.PropagateActivityId; } if (!String.IsNullOrEmpty(DeploymentId)) { clientConfig.DeploymentId = DeploymentId; } if (System.Diagnostics.Debugger.IsAttached) { // Test is running inside debugger - Make timeout ~= infinite clientConfig.ResponseTimeout = TimeSpan.FromMilliseconds(1000000); } else if (clientOptions.ResponseTimeout > TimeSpan.Zero) { clientConfig.ResponseTimeout = clientOptions.ResponseTimeout; } if (options.LargeMessageWarningThreshold > 0) { clientConfig.LargeMessageWarningThreshold = options.LargeMessageWarningThreshold; } GrainClient.Initialize(clientConfig); } }
/// <summary> /// Start the default Primary and Secondary test silos, plus client in-process, /// using the specified silo config options. /// </summary> public UnitTestSiloHost(UnitTestSiloOptions siloOptions) : this(siloOptions, new UnitTestClientOptions()) { }
private void Initialize(UnitTestSiloOptions options, UnitTestClientOptions clientOptions) { bool doStartPrimary = false; bool doStartSecondary = false; if (options.StartFreshOrleans) { // the previous test was !startFresh, so we need to cleanup after it. if (Primary != null || Secondary != null || GrainClient.IsInitialized) { StopDefaultSilos(); } StopAdditionalSilos(); if (options.StartPrimary) { doStartPrimary = true; } if (options.StartSecondary) { doStartSecondary = true; } } else { if (options.StartPrimary && Primary == null) { // first time. doStartPrimary = true; } if (options.StartSecondary && Secondary == null) { doStartSecondary = true; } } if (options.PickNewDeploymentId && String.IsNullOrEmpty(DeploymentId)) { DeploymentId = GetDeploymentId(); } if (options.ParallelStart) { var handles = new List <Task <SiloHandle> >(); if (doStartPrimary) { int instanceCount = InstanceCounter++; handles.Add(Task.Run(() => StartOrleansSilo(Silo.SiloType.Primary, options, instanceCount))); } if (doStartSecondary) { int instanceCount = InstanceCounter++; handles.Add(Task.Run(() => StartOrleansSilo(Silo.SiloType.Secondary, options, instanceCount))); } Task.WhenAll(handles.ToArray()).Wait(); if (doStartPrimary) { Primary = handles[0].Result; } if (doStartSecondary) { Secondary = handles[1].Result; } } else { if (doStartPrimary) { Primary = StartOrleansSilo(Silo.SiloType.Primary, options, InstanceCounter++); } if (doStartSecondary) { Secondary = StartOrleansSilo(Silo.SiloType.Secondary, options, InstanceCounter++); } } if (!GrainClient.IsInitialized && options.StartClient) { ClientConfiguration clientConfig; if (clientOptions.ClientConfigFile != null) { clientConfig = ClientConfiguration.LoadFromFile(clientOptions.ClientConfigFile.FullName); } else { clientConfig = ClientConfiguration.StandardLoad(); } if (clientOptions.ProxiedGateway && clientOptions.Gateways != null) { clientConfig.Gateways = clientOptions.Gateways; if (clientOptions.PreferedGatewayIndex >= 0) { clientConfig.PreferedGatewayIndex = clientOptions.PreferedGatewayIndex; } } if (clientOptions.PropagateActivityId) { clientConfig.PropagateActivityId = clientOptions.PropagateActivityId; } if (!String.IsNullOrEmpty(DeploymentId)) { clientConfig.DeploymentId = DeploymentId; } if (System.Diagnostics.Debugger.IsAttached) { // Test is running inside debugger - Make timeout ~= infinite clientConfig.ResponseTimeout = TimeSpan.FromMilliseconds(1000000); } else if (clientOptions.ResponseTimeout > TimeSpan.Zero) { clientConfig.ResponseTimeout = clientOptions.ResponseTimeout; } if (options.LargeMessageWarningThreshold > 0) { clientConfig.LargeMessageWarningThreshold = options.LargeMessageWarningThreshold; } clientConfig.AdjustForTestEnvironment(); GrainClient.Initialize(clientConfig); } }