Example #1
0
        public async Task ReconcileAsync_Exception_LogsError_Async()
        {
            var kubernetes = new Mock <KubernetesClient>();
            var sessions   = kubernetes.WithClient <WebDriverSession>();
            var pods       = kubernetes.WithClient <V1Pod>();

            pods.Setup(p => p.CreateAsync(It.IsAny <V1Pod>(), default)).ThrowsAsync(new NotSupportedException());

            var loggerFactory = this.services.GetRequiredService <ILoggerFactory>();
            var sink          = this.services.GetRequiredService <ITestLoggerSink>();

            using (var @operator = new ChildOperator <WebDriverSession, V1Pod>(
                       kubernetes.Object,
                       this.configuration,
                       this.filter,
                       (session, pod) => { },
                       this.feedbackLoops,
                       loggerFactory.CreateLogger <ChildOperator <WebDriverSession, V1Pod> >(),
                       this.services))
            {
                var parent = new WebDriverSession()
                {
                    Metadata = new V1ObjectMeta(),
                };

                await @operator.ReconcileAsync(parent, null, default).ConfigureAwait(false);
            }

            Assert.Collection(
                sink.LogEntries,
                e => Assert.Equal("Scheduling reconciliation for parent (null) and child (null) for operator ChildOperatorTests", e.Message),
                e => Assert.Equal("Caught error Specified method is not supported. while executing reconciliation for operator ChildOperatorTests", e.Message));
        }
Example #2
0
        public async Task ReconcileAsync_FeedbackLoopReturnsNull_DoesNothing_Async()
        {
            var kubernetes = new Mock <KubernetesClient>();
            var sessions   = kubernetes.WithClient <WebDriverSession>();
            var pods       = kubernetes.WithClient <V1Pod>();

            Feedback <WebDriverSession, V1Pod> feedback = null;

            var parent = new WebDriverSession();
            var child  = new V1Pod();

            var feedbackLoops = new Collection <FeedbackLoop <WebDriverSession, V1Pod> >()
            {
                new FeedbackLoop <WebDriverSession, V1Pod>((context, cancellationToken) =>
                {
                    return(Task.FromResult(feedback));
                }),
            };

            using (var @operator = new ChildOperator <WebDriverSession, V1Pod>(
                       kubernetes.Object,
                       this.configuration,
                       this.filter,
                       (session, pod) => { },
                       feedbackLoops,
                       this.logger,
                       this.services))
            {
                await @operator.ReconcileAsync(parent, child, default).ConfigureAwait(false);
            }

            sessions.Verify();
        }
Example #3
0
        public async Task CreateSession_HandlesError_Async()
        {
            var sessionClient = new Mock <NamespacedKubernetesClient <WebDriverSession> >(MockBehavior.Strict);
            var kubernetes    = new Mock <KubernetesClient>(MockBehavior.Strict);

            kubernetes.Setup(c => c.GetClient <WebDriverSession>()).Returns(sessionClient.Object);

            var webDriver = new KubernetesWebDriver(kubernetes.Object, NullLogger <KubernetesWebDriver> .Instance);

            var request = new NewSessionRequest()
            {
                Capabilities = new CapabilitiesRequest()
                {
                    AlwaysMatch = new Dictionary <string, object>()
                    {
                        { "platformName", "fake" },
                    },
                },
            };

            var session = new WebDriverSession()
            {
                Metadata = new V1ObjectMeta()
                {
                    Name = "fake-abcd",
                },
            };

            sessionClient
            .Setup(s => s.CreateAsync(It.IsAny <WebDriverSession>(), default))
            .ReturnsAsync(session);

            var watchHook = sessionClient.WithWatcher(session);

            var task        = webDriver.CreateSessionAsync(request, default);
            var watchClient = await watchHook.ClientRegistered.Task.ConfigureAwait(false);

            // Simulate the session going through the various stages of setup
            session.Status = new WebDriverSessionStatus()
            {
                Error      = "error",
                Data       = "data",
                Message    = "message",
                StackTrace = "stacktrace",
            };
            Assert.Equal(WatchResult.Stop, await watchClient(k8s.WatchEventType.Modified, session).ConfigureAwait(false));

            sessionClient.Setup(s => s.TryReadAsync(session.Metadata.Name, default)).ReturnsAsync(session);
            sessionClient.Setup(s => s.DeleteAsync(session, It.IsAny <TimeSpan>(), default)).Returns(Task.CompletedTask);
            watchHook.TaskCompletionSource.SetResult(WatchExitReason.ClientDisconnected);

            var result = await task.ConfigureAwait(false);

            var response = Assert.IsType <WebDriverError>(result.Value);

            Assert.Equal(WebDriverErrorCode.SessionNotCreated, response.ErrorCode);
            Assert.Equal("data", response.Data);
            Assert.Equal("message", response.Message);
            Assert.Equal("stacktrace", response.StackTrace);
        }
Example #4
0
        private void CreateSession()
        {
            var driverFactory = _GetDriverFactory(TestSuiteSettings.WebDriverSettings);
            var driverSession = new WebDriverSession(driverFactory, TestSuiteSettings);

            // Print Session ID to the console for SauceLabs plugin to work in Jenkins
            if (TestSuiteSettings.WebDriverSettings.HubType.EnumValue.Equals(HubType.SauceLabs))
            {
                Console.WriteLine("SauceOnDemandSessionID={0} job-name={1}",
                                  _GetSessionId(driverSession.Driver),
                                  TestSuiteSettings.WebDriverSettings.AdditionalCapabilities.Find(ac => ac.Id.Equals("name")).Value);
            }

            //get the launch page to start the session
            var launchPage = TestSuiteSettings.GetLaunchPage(SiteLaunchTarget);

            //if basic authentication, insert the desired username and password into the url
            if (TestSuiteSettings.ApplicationUnderTestSettings.BasicAuthentication)
            {
                var user =
                    TestSuiteSettings.ApplicationUnderTestSettings.Users.SingleOrDefault(
                        u => u.Username.Equals(BasicAuthUsername));
                if (user != null)
                {
                    launchPage = string.Format(launchPage, user.Username, user.Password);
                }
                else
                {
                    throw new InvalidDataException("The supplied username {0} could not be found in suite settings data");
                }
            }
            driverSession.Start(launchPage);
            Session = new Session(driverSession);
        }
Example #5
0
        public void BuildServiceOperator_ConfiguresService_Test(int sessionPort)
        {
            var builder = FakeOperators.BuildServiceOperator(this.host.Services);

            var session = new WebDriverSession()
            {
                Metadata = new V1ObjectMeta()
                {
                    Name = "my-session",
                },
                Status = new WebDriverSessionStatus()
                {
                    SessionPort = sessionPort,
                },
            };

            var service = new V1Service();

            builder.ChildFactory(session, service);

            Assert.Collection(
                service.Spec.Selector,
                l =>
            {
                Assert.Equal(Annotations.SessionName, l.Key);
                Assert.Equal("my-session", l.Value);
            });

            var port = Assert.Single(service.Spec.Ports);

            Assert.Equal(sessionPort, port.TargetPort);
            Assert.Equal(sessionPort, port.Port);
        }
        internal void I_open_Automate_web_url()
        {
            var session = new WebDriverSession();

            driver = session.driver;
            this.userLoginLayout = new UserLoginLayout(session.driver);
            this.userLoginLayout.SignInPage.GotoAutomationURL();
        }
Example #7
0
        /// <summary>
        /// Starts up a new session using the given driver settings
        /// </summary>
        /// <param name="suiteSettings"></param>
        /// <param name="siteUrl"></param>
        /// <returns></returns>
        protected ISession StartUpSession(ISuiteSettings suiteSettings, string siteUrl)
        {
            var driverFactory = _GetDriverFactory(suiteSettings.WebDriverSettings);
            var driverSession = new WebDriverSession(driverFactory, suiteSettings);

            driverSession.Start(siteUrl);
            return(new Session(driverSession));
        }
Example #8
0
        public async Task ReconcileAsync_Child_NoOp_Async()
        {
            var kubernetes = new Mock <KubernetesClient>();
            var sessions   = kubernetes.WithClient <WebDriverSession>();
            var pods       = kubernetes.WithClient <V1Pod>();

            using (var @operator = new ChildOperator <WebDriverSession, V1Pod>(
                       kubernetes.Object,
                       this.configuration,
                       this.filter,
                       (session, pod) =>
            {
                pod.Spec = new V1PodSpec(
                    new V1Container[]
                {
                    new V1Container()
                    {
                        Name = "fake-driver",
                        Image = "quay.io/kaponata/fake-driver:2.0.1",
                    },
                });
            },
                       this.feedbackLoops,
                       this.logger,
                       this.services))
            {
                var parent = new WebDriverSession()
                {
                    Metadata = new V1ObjectMeta()
                    {
                        Name = "my-session",
                        NamespaceProperty = "default",
                        Uid = "my-uid",
                    },
                };

                var child = new V1Pod()
                {
                    Metadata = new V1ObjectMeta()
                    {
                        Name = "my-session",
                        NamespaceProperty = "default",
                    },
                };

                await @operator.ReconcileAsync(
                    parent, child, default).ConfigureAwait(false);
            }
        }
Example #9
0
        public async Task CreateSession_TimesOut_Async()
        {
            var sessionClient = new Mock <NamespacedKubernetesClient <WebDriverSession> >(MockBehavior.Strict);
            var kubernetes    = new Mock <KubernetesClient>(MockBehavior.Strict);

            kubernetes.Setup(c => c.GetClient <WebDriverSession>()).Returns(sessionClient.Object);

            var webDriver = new KubernetesWebDriver(kubernetes.Object, NullLogger <KubernetesWebDriver> .Instance);

            webDriver.CreationTimeout = TimeSpan.FromMilliseconds(10);

            var request = new NewSessionRequest()
            {
                Capabilities = new CapabilitiesRequest()
                {
                    AlwaysMatch = new Dictionary <string, object>()
                    {
                        { "platformName", "fake" },
                    },
                },
            };

            var session = new WebDriverSession()
            {
                Metadata = new V1ObjectMeta()
                {
                    Name = "fake-abcd",
                },
            };

            sessionClient
            .Setup(s => s.CreateAsync(It.IsAny <WebDriverSession>(), default))
            .ReturnsAsync(session);

            var watchHook = sessionClient.WithWatcher(session);

            var task        = webDriver.CreateSessionAsync(request, default);
            var watchClient = await watchHook.ClientRegistered.Task.ConfigureAwait(false);

            var result = await task.ConfigureAwait(false);

            var response = Assert.IsType <WebDriverError>(result.Value);

            Assert.Equal(WebDriverErrorCode.SessionNotCreated, response.ErrorCode);
            Assert.Equal("The session creation timed out.", response.Message);
        }
Example #10
0
        public void BuildIngressOperator_ConfiguresIngress_Test(int sessionPort)
        {
            var builder = FakeOperators.BuildIngressOperator(this.host.Services);

            var session = new WebDriverSession()
            {
                Metadata = new V1ObjectMeta()
                {
                    Name = "my-session",
                },
                Status = new WebDriverSessionStatus()
                {
                    SessionId   = "1234",
                    SessionPort = sessionPort,
                },
            };

            var ingress = new V1Ingress();

            builder.ChildFactory(session, ingress);

            var rule = Assert.Single(ingress.Spec.Rules);
            var path = Assert.Single(rule.Http.Paths);

            Assert.Equal("/wd/hub/session/my-session/", path.Path);
            Assert.Equal("Prefix", path.PathType);
            Assert.Equal("my-session", path.Backend.Service.Name);
            Assert.Equal(sessionPort, path.Backend.Service.Port.Number);

            Assert.NotNull(ingress.Metadata?.Annotations);
            Assert.Collection(
                ingress.Metadata.Annotations,
                a =>
            {
                Assert.Equal(Annotations.RequestModifier, a.Key);
                Assert.Equal("ReplacePathRegex: /wd/hub/session/my-session/(.*) /wd/hub/session/1234/$1", a.Value);
            },
                a =>
            {
                Assert.Equal(Annotations.IngressClass, a.Key);
                Assert.Equal("traefik", a.Value);
            });
        }
Example #11
0
        public async Task DeleteSessionAsync_DeletesSession_Async()
        {
            var sessionClient = new Mock <NamespacedKubernetesClient <WebDriverSession> >(MockBehavior.Strict);
            var kubernetes    = new Mock <KubernetesClient>(MockBehavior.Strict);

            kubernetes.Setup(c => c.GetClient <WebDriverSession>()).Returns(sessionClient.Object);

            var webDriver = new KubernetesWebDriver(kubernetes.Object, NullLogger <KubernetesWebDriver> .Instance);

            var session = new WebDriverSession();

            sessionClient.Setup(s => s.TryReadAsync("abc", default)).ReturnsAsync(session);
            sessionClient.Setup(s => s.DeleteAsync(session, It.IsAny <V1DeleteOptions>(), It.IsAny <TimeSpan>(), default)).Returns(Task.CompletedTask).Verifiable();
            var result = await webDriver.DeleteSessionAsync("abc", default).ConfigureAwait(false);

            Assert.Null(result.Value);

            sessionClient.Verify();
        }
Example #12
0
        public async Task ConnectsDevice_Async()
        {
            var builder      = UIAutomatorOperators.BuildPodOperator(this.host.Services);
            var feedbackLoop = Assert.Single(builder.FeedbackLoops);

            var session = new WebDriverSession()
            {
                Spec = new WebDriverSessionSpec()
                {
                    Capabilities = "{}",
                    DeviceHost   = "1.2.3.4",
                },
            };

            var pod = new V1Pod()
            {
                Status = new V1PodStatus()
                {
                    Phase             = "Running",
                    ContainerStatuses = new V1ContainerStatus[] { },
                },
            };

            var adbStream = new Mock <Stream>();

            this.kubernetes
            .Setup(c => c.ConnectToPodPortAsync(pod, 5037, It.IsAny <CancellationToken>()))
            .ReturnsAsync(adbStream.Object);

            var context = new ChildOperatorContext <WebDriverSession, V1Pod>(
                parent: session,
                child: pod,
                this.host.Services);

            this.adbClient
            .Setup(c => c.ConnectDeviceAsync(new DnsEndPoint("1.2.3.4", 5555), default))
            .Returns(Task.CompletedTask)
            .Verifiable();

            this.adbClient
            .Setup(c => c.GetDevicesAsync(default))
Example #13
0
        public async Task ReconcileAsync_FeedbackLoopHasChildPatch_ExecutesPatch_Async()
        {
            var kubernetes = new Mock <KubernetesClient>();
            var sessions   = kubernetes.WithClient <WebDriverSession>();
            var pods       = kubernetes.WithClient <V1Pod>();

            var feedback = new Feedback <WebDriverSession, V1Pod>();

            feedback.ChildFeedback = new JsonPatchDocument <V1Pod>();
            feedback.ChildFeedback.Add(s => s.Status, new V1PodStatus());

            var parent = new WebDriverSession();
            var child  = new V1Pod();

            pods.Setup(p => p.PatchAsync(child, feedback.ChildFeedback, default))
            .ReturnsAsync(child)
            .Verifiable();

            var feedbackLoops = new Collection <FeedbackLoop <WebDriverSession, V1Pod> >()
            {
                new FeedbackLoop <WebDriverSession, V1Pod>((context, cancellationToken) =>
                {
                    return(Task.FromResult(feedback));
                }),
            };

            using (var @operator = new ChildOperator <WebDriverSession, V1Pod>(
                       kubernetes.Object,
                       this.configuration,
                       this.filter,
                       (session, pod) => { },
                       feedbackLoops,
                       this.logger,
                       this.services))
            {
                await @operator.ReconcileAsync(parent, child, default).ConfigureAwait(false);
            }

            sessions.Verify();
        }
Example #14
0
        public async Task ReconcileAsync_FeedbackLoop_IsPassedScopedServices_Async()
        {
            var kubernetes = new Mock <KubernetesClient>();
            var sessions   = kubernetes.WithClient <WebDriverSession>();
            var pods       = kubernetes.WithClient <V1Pod>();

            var feedbackLoops = new Collection <FeedbackLoop <WebDriverSession, V1Pod> >()
            {
                new FeedbackLoop <WebDriverSession, V1Pod>((context, cancellationToken) =>
                {
                    Assert.NotNull(context.Services);

                    // Get a scope service, and assert that the scoped service passed to the feedback
                    // loop is different than the scoped service at the root.
                    var value     = context.Services.GetRequiredService <NamespacedKubernetesClient <V1Job> >();
                    var rootValue = this.services.GetRequiredService <NamespacedKubernetesClient <V1Job> >();
                    Assert.NotSame(rootValue, value);

                    return(Task.FromResult((Feedback <WebDriverSession, V1Pod>)null));
                }),
            };

            var parent = new WebDriverSession();
            var child  = new V1Pod();

            using (var @operator = new ChildOperator <WebDriverSession, V1Pod>(
                       kubernetes.Object,
                       this.configuration,
                       this.filter,
                       (session, pod) => { },
                       feedbackLoops,
                       this.logger,
                       this.services))
            {
                await @operator.ReconcileAsync(parent, child, default).ConfigureAwait(false);
            }

            sessions.Verify();
        }
Example #15
0
        public async Task CreateDeleteWebDriverSession_Async()
        {
            string name = FormatName(nameof(this.CreateDeleteWebDriverSession_Async));

            using (var client = this.CreateKubernetesClient())
            {
                var webDriverSessionClient = client.GetClient <WebDriverSession>();

                WebDriverSession currentDevice = null;

                if ((currentDevice = await webDriverSessionClient.TryReadAsync(name, default).ConfigureAwait(false)) != null)
                {
                    await webDriverSessionClient.DeleteAsync(currentDevice, TimeSpan.FromSeconds(100), default).ConfigureAwait(false);
                }

                var session = new WebDriverSession()
                {
                    Metadata = new V1ObjectMeta()
                    {
                        Name = name,
                        NamespaceProperty = "default",
                    },
                };

                var newSession = await webDriverSessionClient.CreateAsync(session, default).ConfigureAwait(false);

                Assert.NotNull(newSession);

                var readSession = await webDriverSessionClient.TryReadAsync(name, default).ConfigureAwait(false);

                Assert.NotNull(readSession);

                await webDriverSessionClient.DeleteAsync(newSession, TimeSpan.FromMinutes(1), default).ConfigureAwait(false);

                Assert.Null(await webDriverSessionClient.TryReadAsync(name, default).ConfigureAwait(false));
            }
        }
Example #16
0
        public async Task InitializeAsync_ParentWithoutChild_SchedulesReconciliation_Async()
        {
            var kubernetes    = new Mock <KubernetesClient>();
            var sessionClient = kubernetes.WithClient <WebDriverSession>();
            var podClient     = kubernetes.WithClient <V1Pod>();

            var parent = new WebDriverSession()
            {
                Metadata = new V1ObjectMeta()
                {
                    Name = "my-session",
                    NamespaceProperty = "default",
                    Uid = "my-uid",
                },
            };

            sessionClient.WithList(
                null,
                "parent-label-selector",
                parent);

            podClient.WithList(
                null,
                labelSelector: "app.kubernetes.io/managed-by=ChildOperatorTests");

            var createdPods = podClient.TrackCreatedItems();

            using (var @operator = new ChildOperator <WebDriverSession, V1Pod>(
                       kubernetes.Object,
                       this.configuration,
                       this.filter,
                       (session, pod) => { },
                       this.feedbackLoops,
                       this.logger,
                       this.services))
            {
                await @operator.InitializeAsync(default).ConfigureAwait(false);
Example #17
0
        public void BuildPodOperator_ConfiguresPod_Test()
        {
            var builder = FakeOperators.BuildPodOperator(this.host.Services);

            var session = new WebDriverSession()
            {
                Metadata = new V1ObjectMeta()
                {
                    Name = "my-session",
                },
            };

            var pod = new V1Pod();

            builder.ChildFactory(session, pod);

            Assert.Collection(
                pod.Metadata.Labels,
                l =>
            {
                Assert.Equal(Annotations.SessionName, l.Key);
                Assert.Equal("my-session", l.Value);
            });

            var container = Assert.Single(pod.Spec.Containers);

            Assert.Equal("quay.io/kaponata/fake-driver:2.0.1", container.Image);
            var port = Assert.Single(container.Ports);

            Assert.Equal(4774, port.ContainerPort);

            var probe = container.ReadinessProbe.HttpGet;

            Assert.Equal("/wd/hub/status", probe.Path);
            Assert.Equal(4774, probe.Port);
        }
Example #18
0
        public void Operator_ConfiguresPod()
        {
            var builder = UIAutomatorOperators.BuildPodOperator(this.host.Services);

            var session = new WebDriverSession()
            {
                Metadata = new V1ObjectMeta()
                {
                    Name = "my-session",
                },
            };

            var child = new V1Pod();

            builder.ChildFactory(session, child);

            Assert.Collection(
                child.Metadata.Labels,
                a =>
            {
                Assert.Equal("kaponata.io/session-name", a.Key);
                Assert.Equal("my-session", a.Value);
            });

            Assert.Collection(
                child.Spec.Containers,
                c =>
            {
                Assert.Equal("quay.io/kaponata/appium-android:1.20.2", c.Image);
                Assert.Equal("appium", c.Name);
                Assert.Collection(
                    c.Args,
                    a => Assert.Equal("/app/appium/build/lib/main.js", a));

                var port = Assert.Single(c.Ports);
                Assert.Equal(4723, port.ContainerPort);
                Assert.Equal("http", port.Name);

                Assert.Equal("/wd/hub/status", c.ReadinessProbe.HttpGet.Path);
                Assert.Equal("4723", c.ReadinessProbe.HttpGet.Port);
            },
                c =>
            {
                Assert.Equal("quay.io/kaponata/appium-android:1.20.2", c.Image);
                Assert.Equal("adb", c.Name);
                Assert.Collection(
                    c.Command,
                    a => Assert.Equal("/bin/tini", a),
                    a => Assert.Equal("--", a),
                    a => Assert.Equal("/android/platform-tools/adb", a));
                Assert.Collection(
                    c.Args,
                    a => Assert.Equal("-a", a),
                    a => Assert.Equal("-P", a),
                    a => Assert.Equal("5037", a),
                    a => Assert.Equal("server", a),
                    a => Assert.Equal("nodaemon", a));

                var port = Assert.Single(c.Ports);
                Assert.Equal(5037, port.ContainerPort);
                Assert.Equal("adb", port.Name);

                Assert.Equal("5037", c.ReadinessProbe.TcpSocket.Port);
            });
        }
Example #19
0
        public async Task ReconcileAsync_NoChild_CreatesChild_Async()
        {
            var kubernetes = new Mock <KubernetesClient>();
            var sessions   = kubernetes.WithClient <WebDriverSession>();
            var pods       = kubernetes.WithClient <V1Pod>();

            (var createdPods, var _) = pods.TrackCreatedItems();

            using (var @operator = new ChildOperator <WebDriverSession, V1Pod>(
                       kubernetes.Object,
                       this.configuration,
                       this.filter,
                       (session, pod) =>
            {
                pod.Spec = new V1PodSpec(
                    new V1Container[]
                {
                    new V1Container()
                    {
                        Name = "fake-driver",
                        Image = "quay.io/kaponata/fake-driver:2.0.1",
                    },
                });
            },
                       this.feedbackLoops,
                       this.logger,
                       this.services))
            {
                var parent = new WebDriverSession()
                {
                    Metadata = new V1ObjectMeta()
                    {
                        Name = "my-session",
                        NamespaceProperty = "default",
                        Uid = "my-uid",
                    },
                };

                await @operator.ReconcileAsync(parent, null, default).ConfigureAwait(false);
            }

            Assert.Collection(
                createdPods,
                p =>
            {
                // The name, namespace and owner references are initialized correctly
                Assert.Equal("my-session", p.Metadata.Name);
                Assert.Equal("default", p.Metadata.NamespaceProperty);

                Assert.Collection(
                    p.Metadata.OwnerReferences,
                    r =>
                {
                    Assert.Equal("my-session", r.Name);
                    Assert.Equal("WebDriverSession", r.Kind);
                    Assert.Equal("kaponata.io/v1alpha1", r.ApiVersion);
                    Assert.Equal("my-uid", r.Uid);
                });

                // The labels are copied from the configuration
                Assert.Collection(
                    p.Metadata.Labels,
                    p =>
                {
                    Assert.Equal(Annotations.ManagedBy, p.Key);
                    Assert.Equal(nameof(ChildOperatorTests), p.Value);
                });
            });
        }
Example #20
0
        public async Task CreateSession_CreatesSession_Async(string platformName, string automationName, string providerName)
        {
            var sessionClient = new Mock <NamespacedKubernetesClient <WebDriverSession> >(MockBehavior.Strict);
            var kubernetes    = new Mock <KubernetesClient>(MockBehavior.Strict);

            kubernetes.Setup(c => c.GetClient <WebDriverSession>()).Returns(sessionClient.Object);

            var webDriver = new KubernetesWebDriver(kubernetes.Object, NullLogger <KubernetesWebDriver> .Instance);

            var request = new NewSessionRequest()
            {
                Capabilities = new CapabilitiesRequest()
                {
                    AlwaysMatch = new Dictionary <string, object>()
                    {
                        { "platformName", platformName },
                        { "appium:automationName", automationName },
                    },
                },
            };

            var session = new WebDriverSession()
            {
                Metadata = new V1ObjectMeta()
                {
                    Name = "fake-abcd",
                },
            };

            sessionClient
            .Setup(s => s.CreateAsync(It.IsAny <WebDriverSession>(), default))
            .Returns <WebDriverSession, CancellationToken>((request, ct) =>
            {
                Assert.Equal($"{providerName}-", request.Metadata.GenerateName);
                Assert.Collection(
                    request.Metadata.Labels,
                    l =>
                {
                    Assert.Equal(Annotations.AutomationName, l.Key);
                    Assert.Equal(providerName, l.Value);
                });

                if (automationName != null)
                {
                    Assert.Equal($"{{\"alwaysMatch\":{{\"platformName\":\"{platformName}\",\"appium:automationName\":\"{automationName}\"}}}}", request.Spec.Capabilities);
                }
                else
                {
                    Assert.Equal($"{{\"alwaysMatch\":{{\"platformName\":\"{platformName}\",\"appium:automationName\":null}}}}", request.Spec.Capabilities);
                }

                return(Task.FromResult(session));
            });

            var watchHook = sessionClient.WithWatcher(session);

            var task        = webDriver.CreateSessionAsync(request, default);
            var watchClient = await watchHook.ClientRegistered.Task.ConfigureAwait(false);

            // Simulate the session going through the various stages of setup
            Assert.Equal(WatchResult.Continue, await watchClient(k8s.WatchEventType.Added, session).ConfigureAwait(false));
            Assert.Equal(WatchResult.Continue, await watchClient(k8s.WatchEventType.Modified, session).ConfigureAwait(false));
            Assert.Equal(WatchResult.Continue, await watchClient(k8s.WatchEventType.Bookmark, session).ConfigureAwait(false));

            session.Status = new WebDriverSessionStatus()
            {
                IngressReady = false,
                ServiceReady = false,
                SessionReady = false,
            };

            Assert.Equal(WatchResult.Continue, await watchClient(k8s.WatchEventType.Modified, session).ConfigureAwait(false));

            session.Status.IngressReady = true;
            Assert.Equal(WatchResult.Continue, await watchClient(k8s.WatchEventType.Modified, session).ConfigureAwait(false));

            session.Status.SessionReady = true;
            session.Status.Capabilities = "{}";
            Assert.Equal(WatchResult.Continue, await watchClient(k8s.WatchEventType.Modified, session).ConfigureAwait(false));

            session.Status.ServiceReady = true;
            Assert.Equal(WatchResult.Stop, await watchClient(k8s.WatchEventType.Modified, session).ConfigureAwait(false));

            sessionClient.Setup(s => s.TryReadAsync(session.Metadata.Name, default)).ReturnsAsync(session);
            watchHook.TaskCompletionSource.SetResult(WatchExitReason.ClientDisconnected);

            var result = await task.ConfigureAwait(false);

            var response = Assert.IsType <NewSessionResponse>(result.Value);

            Assert.Equal("fake-abcd", response.SessionId);
            Assert.Empty(response.Capabilities);
        }
Example #21
0
        public async Task WatchWebDriverSession_Async()
        {
            string name = FormatName(nameof(this.WatchWebDriverSession_Async));

            using (var client = this.CreateKubernetesClient())
            {
                var webDriverSessionClient = client.GetClient <WebDriverSession>();

                var watchEvents = new Collection <(WatchEventType, WebDriverSession)>();
                WebDriverSession currentSession = null;

                if ((currentSession = await webDriverSessionClient.TryReadAsync(name, default).ConfigureAwait(false)) != null)
                {
                    await webDriverSessionClient.DeleteAsync(currentSession, TimeSpan.FromSeconds(100), default).ConfigureAwait(false);
                }

                var watch = webDriverSessionClient.WatchAsync(
                    new WebDriverSession()
                {
                    Metadata = new V1ObjectMeta()
                    {
                        NamespaceProperty = "default", Name = name
                    }
                },
                    (type, device) =>
                {
                    watchEvents.Add((type, device));

                    return(Task.FromResult(type == WatchEventType.Deleted ? WatchResult.Stop : WatchResult.Continue));
                },
                    default);

                var session = new WebDriverSession()
                {
                    Metadata = new V1ObjectMeta()
                    {
                        Name = name,
                        NamespaceProperty = "default",
                    },
                };

                await webDriverSessionClient.CreateAsync(session, default).ConfigureAwait(false);

                await webDriverSessionClient.DeleteAsync(session, TimeSpan.FromMinutes(1), default).ConfigureAwait(false);

                await watch.ConfigureAwait(false);

                Assert.Collection(
                    watchEvents,
                    e =>
                {
                    Assert.Equal(WatchEventType.Added, e.Item1);
                    Assert.NotNull(e.Item2);
                },
                    e =>
                {
                    Assert.Equal(WatchEventType.Deleted, e.Item1);
                    Assert.NotNull(e.Item2);
                });
            }
        }
 public FakeSession()
 {
     DriverSession = new WebDriverSession(new FakeWebDriverFactory(new FakeWebDriver()), new FakeSuiteSettings());
 }