public static BasicStateMachine.Reference CreateSMSec(int instance, TestConfig cfg, TestTracer tracer) { BasicStateMachine sm = CreateSM(instance, false, cfg, tracer); return(sm.SMReference); }
public static BasicStateMachine CreateSM(int instance, bool designatedPrimary, TestConfig cfg, TestTracer tracer) { ManagedRSLNode[] nodes = new ManagedRSLNode[cfg.Ports.Length / 2]; for (int i = 0; i < nodes.Length; i++) { nodes[i] = BasicStateMachine.CreateNode(cfg.Ports[2 * i], cfg.Ports[(2 * i) + 1]); } BasicStateMachine sm = new BasicStateMachine(tracer, nodes[instance].RslPort, nodes[instance].RslLearnPort); try { sm.CanBP = designatedPrimary; using (ManagedRSLConfigParam rslCfg = SetupConfiguration(cfg.RslData)) { Stopwatch w = Stopwatch.StartNew(); while (true) { if (sm.Initialize(rslCfg, sm.SelfNode, ManagedRSLProtocolVersion.ManagedRSLProtocolVersion_5, false)) { break; } if (w.ElapsedMilliseconds > 10000) { throw new InvalidOperationException("couldn't initialize the SM"); } Thread.Sleep(100); } sm.InitiateBootstrap(nodes, 10); return(sm); } } catch (Exception e) { try { sm.Log("Exception during InitializeStateMachine {0}", e); } catch (Exception) { // ignore } sm.Dispose(); throw; } }
private void DoTest(TestConfig cfg, TestActions actions, int timeoutMillis) { ManualResetEvent ev = new ManualResetEvent(false); cfg.Ports = new ushort[6]; for (int i = 0; i < 6; i++) { cfg.Ports[i] = StateMachineManager.GetFreePort(); } cfg.RslData = ".\\rsldata"; cfg.LogPath = ".\\logpath"; if (Directory.Exists(cfg.RslData)) { Directory.Delete(cfg.RslData, true); } if (Directory.Exists(cfg.LogPath)) { Directory.Delete(cfg.LogPath, true); } TestTracer tr = new TestTracer(); AppDomainStarter ad0 = null; AppDomainStarter ad1 = null; AppDomainStarter ad2 = null; Exception resultException = null; if (cfg.Subject1 != null) { cfg.Subject1 = cfg.Subject1.Split('=').Last(); } if (cfg.Subject2 != null) { cfg.Subject2 = cfg.Subject2.Split('=').Last(); } ManagedRSLStateMachine.Init(cfg.LogPath, cfg.Th1, cfg.Th2, cfg.Subject1, cfg.ThumbprintsParent1, cfg.Subject2, cfg.Subjectparent2, false, true, false, false); ThreadPool.QueueUserWorkItem(_ => { if (!ev.WaitOne(timeoutMillis)) { resultException = new TimeoutException("not finished on time"); ad0.Stop(); ad1.Stop(); ad2.Stop(); } }); try { ad0 = new AppDomainStarter("sm0", 0, cfg); ad0.Tracer = tr; ad0.Start(true); ad1 = new AppDomainStarter("sm1", 1, cfg); ad1.Tracer = tr; ad1.Start(false); ad2 = new AppDomainStarter("sm2", 2, cfg); ad2.Tracer = tr; ad2.Start(false); ad0.SM.WaitForPrimary(30000); Console.WriteLine("we got the primary!!"); ad0.SM.ReplicateCommand(new CommandA(11)); ad0.SM.ReplicateCommand(new CommandB("eleven"), true); if (actions.HasFlag(TestActions.FailoverPrimary)) { Console.WriteLine("stopping first instance..."); ad1.SM.CanBP = true; ad0.Stop(); ad1.SM.WaitForPrimary(30000); } Thread.Sleep(5000); if (actions.HasFlag(TestActions.ThumbprintRollover)) { Console.WriteLine("rolling over thumbprints"); ManagedRSLStateMachine.ReplaceThumbprints(cfg.Th3, cfg.Th4, false, false); } if (actions.HasFlag(TestActions.RecoverFirstInstance) || actions.HasFlag(TestActions.ReturnToFirstPrimary)) { Console.WriteLine("restarting first instance"); ad0.Start(false); } if (actions.HasFlag(TestActions.ReturnToFirstPrimary)) { Console.WriteLine("failing second instance into first instance"); ad0.SM.CanBP = true; ad1.Stop(); ad0.SM.WaitForPrimary(30000); } ev.Set(); } catch (Exception e) { if (resultException == null) { resultException = e; } } finally { Console.WriteLine("Unloading all"); if (ad0 != null) { ad0.Stop(); } if (ad1 != null) { ad1.Stop(); } if (ad2 != null) { ad2.Stop(); } ManagedRSLStateMachine.Unload(); } if (resultException != null) { if (resultException.InnerException != null) { resultException = resultException.InnerException; } throw resultException; } }