public void TestParallelStepsLimitOfTest()
        {
            bool isOnlyOneRender     = true;
            int  runningRendersCount = 0;

            VisualGridRunner runner = new VisualGridRunner();
            Configuration    config = new Configuration();

            config.AddBrowser(new IosDeviceInfo(IosDeviceName.iPhone_7));
            ConfigurationProvider configurationProvider = new ConfigurationProvider(config);

            VisualGridEyes eyes = new VisualGridEyes(configurationProvider, runner);

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

            IWebDriver driver = SeleniumUtils.CreateChromeDriver();

            try
            {
                driver.Url = "http://applitools.github.io/demo";
                eyes.Open(driver, "Eyes SDK", "UFG Server Concurrency", new RectangleSize(800, 800));
                MockEyesConnector mockEyesConnector = (MockEyesConnector)eyes.eyesConnector_;

                mockEyesConnector.BeforeRender += (renderRequests) =>
                {
                    int runningRendersCountBeforeInc = runningRendersCount;
                    Interlocked.Increment(ref runningRendersCount);
                    if (runningRendersCountBeforeInc >= RunningTest.PARALLEL_STEPS_LIMIT)
                    {
                        isOnlyOneRender = false;
                    }

                    Thread.Sleep(1000);
                    if (renderRequests.Length != 1)
                    {
                        isOnlyOneRender = false;
                    }
                };

                mockEyesConnector.AfterRender += (results, renderRequests) =>
                {
                    Interlocked.Decrement(ref runningRendersCount);
                };

                for (int i = 0; i < 10; i++)
                {
                    eyes.Check(Target.Window().Fully());
                }
                eyes.CloseAsync(false);
            }
            finally
            {
                eyes.AbortAsync();
                driver.Quit();
                runner.GetAllTestResults(false);
            }

            Assert.IsTrue(isOnlyOneRender);
        }
        private static MockEyesConnector OpenEyesAndGetConnector_(Eyes eyes, Configuration config, IWebDriver webDriver, out IWebDriver eyesDriver)
        {
            eyesDriver = eyes.Open(webDriver, "Mock app", "Mock Test");

            MockEyesConnector mockEyesConnector = (MockEyesConnector)eyes.visualGridEyes_.eyesConnector_;

            //MockServerConnector mockServerConnector = new MockServerConnector(eyes.Logger, new Uri(eyes.ServerUrl));
            //EyesConnector eyesConnector = new EyesConnector(config.GetBrowsersInfo()[0], config)
            //    runningSession_ = new RunningSession(),
            //    ServerConnector = mockServerConnector
            //};
            //mockEyesConnector.WrappedConnector = eyesConnector;
            return(mockEyesConnector);
        }
        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);
        }
        //[Test]
        public void TestVisualGridSkipList()
        {
            VisualGridRunner runner = new VisualGridRunner(10);
            Eyes             eyes   = new Eyes(runner);

            TestUtils.SetupLogging(eyes);
            //eyes.visualGridEyes_.EyesConnectorFactory = new MockEyesConnectorFactory();

            Configuration config = eyes.GetConfiguration();

            config.AddBrowser(1050, 600, BrowserType.CHROME);
            config.SetBatch(TestDataProvider.BatchInfo);
            eyes.SetConfiguration(config);

            AutoResetEvent waitHandle = new AutoResetEvent(false);

            runner.debugLock_ = waitHandle;

            IWebDriver driver = SeleniumUtils.CreateChromeDriver();

            //driver.Url = "https://applitools.github.io/demo/DomSnapshot/test-iframe.html";
            driver.Url = "https://applitools.github.io/demo/TestPages/VisualGridTestPage/";
            try
            {
                MockEyesConnector mockEyesConnector = OpenEyesAndGetConnector_(eyes, config, driver, out IWebDriver eyesDriver);

                eyes.Check(Target.Window());
                string[] expectedUrls = new string[] {
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/AbrilFatface-Regular.woff2",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/applitools_logo_combined.svg",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/company_name.png",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/frame.html",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/innerstyle0.css",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/innerstyle1.css",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/innerstyle2.css",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/logo.svg",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/minions-800x500_green_sideways.png",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/minions-800x500.jpg",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/slogan.svg",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/style0.css",
                    "https://applitools.github.io/demo/TestPages/VisualGridTestPage/style1.css",
                    "https://fonts.googleapis.com/css?family=Raleway",
                    "https://fonts.googleapis.com/css?family=Unlock",
                    "https://fonts.gstatic.com/s/raleway/v18/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCFPrEHJA.woff2",
                    "https://fonts.gstatic.com/s/raleway/v18/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCGPrEHJA.woff2",
                    "https://fonts.gstatic.com/s/raleway/v18/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCHPrEHJA.woff2",
                    "https://fonts.gstatic.com/s/raleway/v18/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCIPrE.woff2",
                    "https://fonts.gstatic.com/s/raleway/v18/1Ptxg8zYS_SKggPN4iEgvnHyvveLxVvaorCMPrEHJA.woff2",
                    "https://fonts.gstatic.com/s/unlock/v10/7Au-p_8ykD-cDl72LwLT.woff2",
                    "https://use.fontawesome.com/releases/v5.8.2/css/all.css",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-brands-400.eot",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-brands-400.svg",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-brands-400.ttf",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-brands-400.woff",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-brands-400.woff2",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-regular-400.eot",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-regular-400.svg",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-regular-400.ttf",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-regular-400.woff",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-regular-400.woff2",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-solid-900.eot",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-solid-900.svg",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-solid-900.ttf",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-solid-900.woff",
                    "https://use.fontawesome.com/releases/v5.8.2/webfonts/fa-solid-900.woff2"
                };

                waitHandle.WaitOne(TimeSpan.FromSeconds(5));

                CollectionAssert.AreEquivalent(expectedUrls, ((IVisualGridRunner)runner).CachedBlobsURLs.Keys);

                UserAgent userAgent = eyes.visualGridEyes_.userAgent_;
                EyesWebDriverTargetLocator switchTo = (EyesWebDriverTargetLocator)eyesDriver.SwitchTo();

                FrameData domData = VisualGridEyes.CaptureDomSnapshot_(
                    switchTo, userAgent, config,
                    runner, (EyesWebDriver)eyesDriver, eyes.Logger);

                //DomAnalyzer domAnalyzer = new DomAnalyzer(runner,
                //    domData,
                //    eyes.visualGridEyes_.eyesConnector_,
                //    userAgent,
                //    eyes.visualGridEyes_.debugResourceWriter_);
                //IDictionary<string, RGridResource> resourceMap = domAnalyzer.Analyze();
                //CollectionAssert.AreEquivalent(expectedUrls, resourceMap.Keys);
                //eyes.Check(Target.Window());
                eyes.Close();

                runner.GetAllTestResults();
            }
            finally
            {
                eyes.AbortIfNotClosed();
                driver.Close();
            }
        }
        public void TestVisualGridOptions()
        {
            // We want VG mode
            EyesRunner  runner     = new VisualGridRunner(10);
            ILogHandler logHandler = TestUtils.InitLogHandler();

            runner.SetLogHandler(logHandler);
            Eyes eyes = new Eyes(runner);
            //eyes.visualGridEyes_.EyesConnectorFactory = new MockEyesConnectorFactory();
            Configuration config = eyes.GetConfiguration();

            config.AddBrowser(800, 600, BrowserType.CHROME);
            config.SetVisualGridOptions(new VisualGridOption("option1", "value1"), new VisualGridOption("option2", false));
            config.SetBatch(TestDataProvider.BatchInfo);
            eyes.SetConfiguration(config);

            IWebDriver driver = SeleniumUtils.CreateChromeDriver();

            driver.Url = "https://applitools.github.io/demo/TestPages/DynamicResolution/desktop.html";
            try
            {
                IWebDriver eyesDriver;
                // First check - global + fluent config
                eyes.Logger.Verbose("starting first check");
                MockEyesConnector mockEyesConnector = OpenEyesAndGetConnector_(eyes, config, driver, out eyesDriver);
                eyes.Logger.Verbose("calling eyes.Check");
                eyes.Check(Target.Window().VisualGridOptions(new VisualGridOption("option3", "value3"), new VisualGridOption("option4", 5)));
                eyes.Logger.Verbose("calling eyes.Close");
                eyes.Close();
                var expected1 = new Dictionary <string, object>()
                {
                    { "option1", "value1" }, { "option2", false }, { "option3", "value3" }, { "option4", 5 }
                };
                eyes.Logger.Verbose("getting results...");
                var actual1 = mockEyesConnector.LastRenderRequests[0].Options;
                eyes.Logger.Verbose("comparing results...");
                CollectionAssert.AreEquivalent(expected1, actual1);
                eyes.Logger.Verbose("done first check");


                // Second check - only global
                mockEyesConnector = OpenEyesAndGetConnector_(eyes, config, driver, out eyesDriver);
                eyes.CheckWindow();
                eyes.Close();
                var expected2 = new Dictionary <string, object>()
                {
                    { "option1", "value1" }, { "option2", false }
                };
                var actual2 = mockEyesConnector.LastRenderRequests[0].Options;
                CollectionAssert.AreEquivalent(expected2, actual2);

                // Third check - resetting
                mockEyesConnector = OpenEyesAndGetConnector_(eyes, config, driver, out eyesDriver);
                config            = eyes.GetConfiguration();
                config.SetVisualGridOptions(null);
                eyes.SetConfiguration(config);
                eyes.CheckWindow();
                eyes.Close();
                var actual3 = mockEyesConnector.LastRenderRequests[0].Options;
                Assert.IsNull(actual3);
                runner.GetAllTestResults();
            }
            finally
            {
                eyes.AbortIfNotClosed();
                driver.Close();
            }
        }