public IRuntimeManager GetRuntime()
 {
     IRuntimeManager manager;
     if (_availableRuntimes.TryTake(out manager))
         return manager;
     
     int runtimeMaxCount = _settings.RuntimeMaxCount;
     if (RuntimeCurrentCount < runtimeMaxCount)
     {
         lock (_addLock)
         {
             if (RuntimeCurrentCount < runtimeMaxCount)
             {
                 var runtime = new RuntimeManager(_settings);
                 RuntimeCurrentCount++;
                 return runtime;
             }
         }
     }
     return _availableRuntimes.Take();
 }
Example #2
0
        /// <summary>
        /// Dipor do objeto
        /// </summary>
        public void Dispose()
        {
            //TimedOuts.ForEach(t=> t.Dispose());

            _engine.Interrupt();
            _manager.Cleanup();
            _manager.Dispose();
            _manager = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.WaitForFullGCComplete(60000);
            GC.Collect();
        }
Example #3
0
        /// <summary>
        /// configura o Helper para posterior execuçao
        /// </summary>
        /// <param name="diretorioJavascripts">Diretório onde estão os arquivos em js</param>
        /// <param name="setTimeout">Habilitar a função global setTimeout</param>
        /// <param name="setInterval">Habilitar a função global setInterval</param>
        private void Carregar(string diretorioJavascripts, bool setTimeout, bool setInterval)
        {
            TimedOuts = new List<IDisposable>();
            _diretorioExecucao = diretorioJavascripts;
            _timeoutTestes = int.MaxValue;
            ExecutouTestesAteFinal = false;

            SetTimeOutLigado = setTimeout;

            //O manager vai compilar e cachear as bibliotecas
            _manager = new RuntimeManager(new ManualManagerSettings() { MaxExecutableBytes = (1000000000 * 2), RuntimeMaxCount = int.MaxValue});
            _engine = _manager.GetEngine();

            //RequireManager.ClearPackages(); //garantir uma execução limpa

            #region Ler arquivos Js

            _cacheCodigos = new Dictionary<string, string>();

            foreach (var enumerateFile in Directory.EnumerateFiles(diretorioJavascripts, "*.js"))
            {
                _cacheCodigos.Add(Path.GetFileNameWithoutExtension(enumerateFile), File.ReadAllText(enumerateFile));
                //_manager.Compile(Path.GetFileNameWithoutExtension(enumerateFile), File.ReadAllText(enumerateFile), true, int.MaxValue);
            }

            #endregion

            #region Configura a Engine com o JavascriptHelper e Console, Settimeout e etc

            FalhasDosTestes = new List<string>();
            _timers = new Dictionary<int, bool>();

            _engine.AddHostObject("javascriptHelper", this);

            _engine.Execute(@"'use strict';
                        function console() {
                          if (!(this instanceof console)) {
                            return new Console();
                          }
                        }

                        console.prototype.log = function(args, args1, args2) {
                          javascriptHelper.Escrever(args, args1, args2);
                        };");

            _engine.Execute("var console = new console();");
            _engine.Execute("var GLOBAL = this;");

            _engine.Execute(@"var stFunctionsCallBack = new Array();");

            if (setTimeout)
            {
                _engine.Execute(@"var setTimeout = function (funcToCall, millis) {
                                                var textoId = javascriptHelper.CurrentThreadId;
                                                var idlocal = javascriptHelper.SetTimeout(millis);
                                                stFunctionsCallBack.push(funcToCall);
                                                return idlocal;
                            };");

                _engine.Execute(@"var clearTimeout = function(id) { javascriptHelper.ClearTimeout(id);};");
            }

            if (setInterval)
            {
                _engine.Execute(@"var setInterval = function (funcToCall, millis) {

                                                var idlocal = javascriptHelper.SetTimeout(millis);
                                                var funcaoTimeout = function() { funcToCall(); setTimeout(funcToCall, millis); };
                                                stFunctionsCallBack.push(funcaoTimeout);
                                                return idlocal;
                            };");

                _engine.Execute(@"var clearInterval = function(id) { javascriptHelper.ClearTimeout(id);};");
            }
            #endregion
        }