public void TestOpenBeforeRender()
        {
            VisualGridRunner runner = new VisualGridRunner(10);
            Eyes             eyes   = new Eyes(runner);

            eyes.SetLogHandler(TestUtils.InitLogHandler());
            eyes.visualGridEyes_.EyesConnectorFactory = new MockEyesConnectorFactory();

            Configuration config = eyes.GetConfiguration();

            config.AddBrowser(new IosDeviceInfo(IosDeviceName.iPhone_7));
            eyes.SetConfiguration(config);

            object errorMessageLocker = new object();
            string errorMessage       = null;

            IWebDriver driver = SeleniumUtils.CreateChromeDriver();

            driver.Url = "http://applitools.github.io/demo";
            try
            {
                eyes.Open(driver, "Mock app", "Mock Test");
                MockEyesConnector mockEyesConnector = (MockEyesConnector)eyes.visualGridEyes_.eyesConnector_;

                mockEyesConnector.BeforeRender += (renderRequests) =>
                {
                    IVisualGridEyes eyes = runner.allEyes_.First();
                    if (!eyes.GetAllRunningTests().First().IsTestOpen)
                    {
                        lock (errorMessageLocker)
                        {
                            errorMessage = "Render called before open";
                        }
                    }
                };
                eyes.CheckWindow();
                eyes.CloseAsync();
            }
            finally
            {
                eyes.AbortAsync();
                driver.Quit();
                runner.GetAllTestResults(false);
            }

            Assert.IsNull(errorMessage);
        }
        public void Open(IVisualGridEyes eyes, RenderingInfo renderingInfo)
        {
            Logger.Verbose("enter");
            if (RenderingInfo == null)
            {
                RenderingInfo = renderingInfo;
            }

            Logger.Verbose("locking eyesToOpenList_");
            lock (eyesToOpenList_)
            {
                eyesToOpenList_.Add(eyes);
            }
            Logger.Verbose("releasing eyesToOpenList_");

            Logger.Verbose("locking allEyes_");
            lock (allEyes_)
            {
                if (!allEyes_.Contains(eyes))
                {
                    if (allEyes_.Count == 0 && Logger.GetILogHandler() is NullLogHandler)
                    {
                        ILogHandler handler = eyes.Logger.GetILogHandler();
                        if (handler != null)
                        {
                            Logger.SetLogHandler(handler);
                        }
                    }
                    allEyes_.Add(eyes);
                }
                else
                {
                    Logger.Verbose("eyes already in list.");
                }
            }
            Logger.Verbose("releasing allEyes");
            eyes.SetListener(eyesListener_);

            AddBatch(eyes.Batch.Id, eyes.GetBatchCloser());
            Logger.Log("exit");
        }
        void OnTaskComplete(VisualGridTask task, IVisualGridEyes eyes)
        {
            Logger.Verbose("Enter with: {0}", task.TaskType);
            TaskType type = task.TaskType;

            try
            {
                switch (type)
                {
                case TaskType.Open:
                    Logger.Verbose("locking eyesToOpenList");
                    lock (eyesToOpenList_)
                    {
                        Logger.Verbose("removing task {0}", task);
                        eyesToOpenList_.Remove(eyes);
                    }
                    Logger.Verbose("releasing eyesToOpenList");
                    break;

                case TaskType.Abort:
                case TaskType.Close:
                    Logger.Verbose("Task {0}", type);
                    eyesOpenerService_.DecrementConcurrency();
                    openerServiceConcurrencyLock_.Set();
                    break;

                case TaskType.Check:
                    Logger.Verbose("Check complete.");
                    break;
                }
            }
            catch (Exception e)
            {
                Logger.Log("Error: " + e);
            }

            NotifyAllServices();
        }
        protected override TestResultsSummary GetAllTestResultsImpl(bool shouldThrowException)
        {
            Logger.Verbose("enter");
            Dictionary <IVisualGridEyes, ICollection <Task <TestResultContainer> > > allFutures = new Dictionary <IVisualGridEyes, ICollection <Task <TestResultContainer> > >();

            List <IVisualGridEyes> allEyes;

            lock (allEyes_)
            {
                allEyes = new List <IVisualGridEyes>(allEyes_);
            }

            foreach (IVisualGridEyes eyes in allEyes)
            {
                ICollection <Task <TestResultContainer> > futureList = eyes.Close();
                Logger.Verbose("adding a {0} items list to allFutures.", futureList.Count);
                if (allFutures.TryGetValue(eyes, out ICollection <Task <TestResultContainer> > futures) && futures != null)
                {
                    foreach (Task <TestResultContainer> future in futures)
                    {
                        futureList.Add(future);
                    }
                }
                allFutures.Add(eyes, futureList);
            }

            Exception exception = null;

            NotifyAllServices();
            List <TestResultContainer> allResults = new List <TestResultContainer>();

            Logger.Verbose("trying to call future.get on {0} future lists.", allFutures.Count);
            foreach (KeyValuePair <IVisualGridEyes, ICollection <Task <TestResultContainer> > > entry in allFutures)
            {
                ICollection <Task <TestResultContainer> > value = entry.Value;
                IVisualGridEyes key = entry.Key;
                key.TestResults.Clear();
                Logger.Verbose("trying to call future.get on {0} futures of {1}", value.Count, key);
                foreach (Task <TestResultContainer> future in value)
                {
                    Logger.Verbose("calling future.get on {0}", key);
                    TestResultContainer testResultContainer = null;
                    try
                    {
                        if (Task.WhenAny(future, Task.Delay(waitForResultTimeout_)).Result == future)
                        {
                            testResultContainer = future.Result;
                            if (testResultContainer.Exception != null && exception == null)
                            {
                                exception = testResultContainer.Exception;
                            }
                            allResults.Add(testResultContainer);
                            key.TestResults.Add(testResultContainer);
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Log("Error: " + e);
                        if (exception == null)
                        {
                            exception = e;
                        }
                    }
                    Logger.Verbose("got TestResultContainer: {0}", testResultContainer);
                }
            }

            //lock (allEyes_) allEyes_.Clear();
            //eyesToOpenList_.Clear();
            //renderingTaskList_.Clear();

            StopServices();
            NotifyAllServices();

            if (shouldThrowException && exception != null)
            {
                Logger.Log("Error: " + exception);
                throw exception;
            }
            Logger.Verbose("exit");
            TaskScheduler.UnobservedTaskException -= TaskScheduler_UnobservedTaskException;
            return(new TestResultsSummary(allResults));
        }
 public void Close(IVisualGridEyes eyes)
 {
     NotifyAllServices();
 }