public static SimulacronManager GetForPeersTests()
        {
            var manager = new SimulacronManager(8189, "127.0.0.111", 9011);

            manager.Start();
            return(manager);
        }
示例#2
0
        public void Start()
        {
            if (_initialized)
            {
                return;
            }

            lock (SimulacronManager.GlobalLock)
            {
                if (_initialized)
                {
                    return;
                }

                if (SimulacronManager._currentInstance != null)
                {
                    SimulacronManager._currentInstance.Stop();
                }

                SimulacronManager._currentInstance = this;

                var started      = false;
                var errorMessage = "Simulacron is taking too long to start. Aborting initialization...";
                _simulacronProcess = new Process();
                var jarPath = Environment.GetEnvironmentVariable("SIMULACRON_PATH");
                if (string.IsNullOrEmpty(jarPath))
                {
                    jarPath = Environment.GetEnvironmentVariable("HOME") + "/simulacron.jar";
                }
                if (!File.Exists(jarPath))
                {
                    throw new Exception("Simulacron: Simulacron jar not found: " + jarPath);
                }

                var args = $"-jar {jarPath} --ip {StartIp} -p {HttpPort}";
                if (StartPort.HasValue)
                {
                    args += $" -s {StartPort}";
                }

                _simulacronProcess.StartInfo.FileName               = "java";
                _simulacronProcess.StartInfo.Arguments              = args;
                _simulacronProcess.StartInfo.UseShellExecute        = false;
                _simulacronProcess.StartInfo.CreateNoWindow         = true;
                _simulacronProcess.StartInfo.RedirectStandardOutput = true;
                _simulacronProcess.StartInfo.RedirectStandardError  = true;
                _simulacronProcess.StartInfo.WindowStyle            = ProcessWindowStyle.Hidden;

                var eventWaitHandler = new AutoResetEvent(false);
                _simulacronProcess.OutputDataReceived += (sender, e) =>
                {
                    if (e.Data == null || started)
                    {
                        return;
                    }
                    Trace.TraceInformation(e.Data);
                    if (e.Data.Contains("Address already in use"))
                    {
                        errorMessage = $"Simulacron start error: {e.Data}";
                        eventWaitHandler.Set();
                        return;
                    }
                    if (e.Data.Contains("Created nodes will start with ip"))
                    {
                        started = true;
                        eventWaitHandler.Set();
                    }
                };
                _simulacronProcess.ErrorDataReceived += (sender, e) =>
                {
                    if (e.Data == null)
                    {
                        return;
                    }
                    Trace.TraceError(e.Data);
                    errorMessage = $"Simulacron start error: {e.Data}";
                };
                _simulacronProcess.Start();

                _simulacronProcess.BeginOutputReadLine();
                _simulacronProcess.BeginErrorReadLine();

                eventWaitHandler.WaitOne(30000);
                if (!started)
                {
                    Trace.TraceError(errorMessage);
                    Stop();
                    SimulacronManager._currentInstance = null;
                    throw new Exception("Simulacron failed to start! " + Environment.NewLine + errorMessage);
                }
                _initialized = true;
                Trace.TraceInformation("Simulacron started");
            }
        }