public async Task Run_for_a_while_using_WebSocket()
        {
            // Begin: README example
            var bayeuxClient = new BayeuxClient(
                new WebSocketTransportOptions()
            {
                Uri = new Uri("ws://localhost:8080/bayeux/"),
            });

            // End: README example

            bayeuxClient.EventReceived += (e, args) =>
                                          Debug.WriteLine($"Event received on channel {args.Channel} with data\n{args.Data}");

            bayeuxClient.ConnectionStateChanged += (e, args) =>
                                                   Debug.WriteLine($"Bayeux connection state changed to {args.ConnectionState}");

            bayeuxClient.AddSubscriptions("/**");

            await bayeuxClient.Start();

            using (bayeuxClient)
            {
                await Delay(60);
            }
        }
        public async Task Reconnections()
        {
            var mock = new Mock <HttpMessageHandler>();

            mock.Protected().As <IHttpMessageHandlerProtected>()
            .SetupSequence(h => h.SendAsync(It.IsAny <HttpRequestMessage>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(BuildBayeuxResponse(successfulHandshakeResponse))
            .ReturnsAsync(BuildBayeuxResponse(successfulConnectResponse))
            .ReturnsAsync(BuildBayeuxResponse(rehandshakeConnectResponse))
            .ThrowsAsync(new HttpRequestException("mock raising exception"))
            .ReturnsAsync(BuildBayeuxResponse(successfulHandshakeResponse))
            .ThrowsAsync(new HttpRequestException("mock raising exception"))
            .ThrowsAsync(new HttpRequestException("mock raising exception"))
            .ThrowsAsync(new HttpRequestException("mock raising exception"))
            .ThrowsAsync(new HttpRequestException("mock raising exception"))
            .ThrowsAsync(new HttpRequestException("mock raising exception"))
            .ReturnsIndefinitely(() =>
                                 Task.Delay(TimeSpan.FromSeconds(5))
                                 .ContinueWith(t => BuildBayeuxResponse(successfulHandshakeResponse)))
            ;

            var bayeuxClient = new BayeuxClient(
                new HttpLongPollingTransportOptions()
            {
                HttpClient = new HttpClient(mock.Object), Uri = Url
            },
                reconnectDelays: new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2) });

            using (bayeuxClient)
            {
                await bayeuxClient.Start();

                await Task.Delay(TimeSpan.FromSeconds(20));
            }
        }
        public async Task Run_for_a_while_using_HTTP()
        {
            // Begin: README example
            var httpClient   = new HttpClient();
            var bayeuxClient = new BayeuxClient(
                new HttpLongPollingTransportOptions()
            {
                HttpClient = httpClient,
                Uri        = "http://localhost:8080/bayeux/",
            });

            bayeuxClient.EventReceived += (e, args) =>
                                          Debug.WriteLine($"Event received on channel {args.Channel} with data\n{args.Data}");

            bayeuxClient.ConnectionStateChanged += (e, args) =>
                                                   Debug.WriteLine($"Bayeux connection state changed to {args.ConnectionState}");

            bayeuxClient.AddSubscriptions("/**");

            await bayeuxClient.Start();

            // End: README example

            using (bayeuxClient)
            {
                await Delay(60);
            }
        }
示例#4
0
        public async Task Too_long_connect_delay_causes_unauthorized_error_in_Workspace_API()
        {
            var httpPost =
                new AgentApiHttpPoster(
                    new HttpClientHttpPost(await InitHttpClient()),
                    BaseUrl);

            //var initResponse = await httpClient.PostAsync(
            //    BaseURL + "/workspace/v3/initialize-workspace",
            //    new StringContent(""));
            //initResponse.EnsureSuccessStatusCode();

            var bayeuxClient = new BayeuxClient(new HttpLongPollingTransportOptions()
            {
                HttpPost = httpPost,
                Uri      = BaseUrl + "/workspace/v3/notifications",
            });

            using (bayeuxClient)
            {
                await bayeuxClient.Start();

                await bayeuxClient.Subscribe("/**");

                Thread.Sleep(TimeSpan.FromSeconds(11));
            }
        }
示例#5
0
        // response: {"timestamp":1536851691737,"status":500,"error":"Internal Server Error",
        // "message":"java.lang.IllegalArgumentException: Invalid channel id: pepe",
        // "path":"/statistics/v3/notifications"}
        public async Task Subscribe_invalid_channel_id()
        {
            var httpClient = await InitHttpClient();

            var bayeuxClient = new BayeuxClient(new HttpLongPollingTransportOptions()
            {
                HttpClient = httpClient,
                Uri        = BaseUrl + "/statistics/v3/notifications",
            });
            await bayeuxClient.Start();

            await bayeuxClient.Subscribe("pepe");
        }
        private static async Task <BayeuxClient> SubToStream(String uri, String channel)
        {
            var httpClient   = new HttpClient();
            var bayeuxClient = new BayeuxClient(
                new HttpLongPollingTransportOptions()
            {
                HttpClient = httpClient,
                Uri        = uri
            });


            bayeuxClient.ConnectionStateChanged += (e, args) =>
                                                   Console.WriteLine($"Bayeux connection state changed to {args.ConnectionState}");

            bayeuxClient.AddSubscriptions(channel);

            await bayeuxClient.Start();

            return(bayeuxClient);
        }
        public async Task Automatic_subscription()
        {
            var mock          = new Mock <HttpMessageHandler>();
            var mockProtected = mock.Protected().As <IHttpMessageHandlerProtected>();

            int subscriptionCount = 0;

            mockProtected
            .Setup(h => h.SendAsync(MatchSubscriptionRequest(), It.IsAny <CancellationToken>()))
            .Returns(() =>
                     Task.Run(() => subscriptionCount++)
                     .ContinueWith(t => BuildBayeuxResponse(successfulSubscriptionResponse)));

            mockProtected
            .Setup(h => h.SendAsync(MatchHandshakeRequest(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(BuildBayeuxResponse(successfulHandshakeResponse));

            mockProtected
            .Setup(h => h.SendAsync(MatchConnectRequest(), It.IsAny <CancellationToken>()))
            .Returns(() =>
                     Task.Delay(TimeSpan.FromSeconds(5))
                     .ContinueWith(t => BuildBayeuxResponse(successfulConnectResponse)));

            var bayeuxClient = new BayeuxClient(
                new HttpLongPollingTransportOptions()
            {
                HttpClient = new HttpClient(mock.Object), Uri = Url
            },
                reconnectDelays: new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2) });

            using (bayeuxClient)
            {
                bayeuxClient.AddSubscriptions("/mychannel");
                await bayeuxClient.Start();

                await Task.Delay(TimeSpan.FromSeconds(2));
            }

            Assert.AreEqual(1, subscriptionCount);
        }
        protected override async Task StartImplAsync(UpdateResult result, CancellationToken cancellationToken)
        {
            httpClient.DefaultRequestHeaders.Remove("x-api-key");
            httpClient.DefaultRequestHeaders.Add("x-api-key", ApiKey);

            var token = await AuthApi.Authenticate(httpClient, ApiBaseUrl, new AuthApi.PasswordGrantTypeCredentials()
            {
                ClientId     = ClientId,
                ClientSecret = ClientSecret,
                UserName     = UserName,
                Password     = Password,
            }); // TODO: missing cancellationToken as a parameter here

            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

            var initResponse = await PostAsync("/workspace/v3/initialize-workspace", null, cancellationToken);

            bayeuxClient = new BayeuxClient(new HttpLongPollingTransportOptions()
            {
                HttpClient = httpClient,
                Uri        = ApiBaseUrl + "/workspace/v3/notifications"
            });

            bayeuxClient.EventReceived += (e, args) =>
            {
                Debug.WriteLine($"Event received on channel {args.Channel} with data\n{args.Data}");
                UpdateTree(result2 =>
                           result2.MessageToChildren = args);
            };

            bayeuxClient.ConnectionStateChanged += (e, args) =>
                                                   Debug.WriteLine($"Bayeux connection state changed to {args.ConnectionState}");

            await bayeuxClient.Start(cancellationToken);

            await bayeuxClient.Subscribe("/**", cancellationToken);
        }
示例#9
0
        public void Provisioning_API__Awaiting_dbUpdated_event()
        {
            #region Obtain token

            object baseUrl = TestContext.Properties["BaseUrl"];
            var    authApi = new AuthenticationApi(
                new Genesys.Internal.Authentication.Client.Configuration
            {
                BasePath      = baseUrl + "/auth/v3",
                DefaultHeader = new Dictionary <string, string>()
                {
                    ["x-api-key"] = (string)TestContext.Properties["ApiKey"],
                },
            });

            var clientId     = (string)TestContext.Properties["ClientId"];
            var clientSecret = (string)TestContext.Properties["ClientSecret"];
            var tenant       = (string)TestContext.Properties["UserNamePath"];
            var userName     = (string)TestContext.Properties["UserName"];
            var userPassword = (string)TestContext.Properties["Password"];

            var tokenResponse = authApi.RetrieveToken(
                grantType: "password",
                authorization:
                "Basic " +
                Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(
                                           clientId + ":" + clientSecret)),
                username: tenant == null ? userName : tenant + "\\" + userName,
                clientId: clientId,
                password: userPassword);

            Debug.WriteLine("Access token obtained: " + tokenResponse.AccessToken);

            #endregion

            #region Initialize Provisioning API, cookies, and notifications
            Debug.WriteLine("Initializing Provisioning API...");

            var provisioningBaseUrl = (string)TestContext.Properties["ProvisioningBaseUrl"];
            var apiKey = (string)TestContext.Properties["ApiKey"];

            var provisioningApiConfig = new Genesys.Internal.Provisioning.Client.Configuration
            {
                BasePath      = provisioningBaseUrl + "/provisioning/v3",
                DefaultHeader = new Dictionary <string, string>()
                {
                    ["x-api-key"]     = apiKey,
                    ["Authorization"] = "Bearer " + tokenResponse.AccessToken,
                },
            };

            var cookieContainer = new System.Net.CookieContainer();

            provisioningApiConfig.ApiClient.RestClient.CookieContainer = cookieContainer;

            var sessionApi = new SessionApi(provisioningApiConfig);

            var initResponse = sessionApi.InitializeProvisioning();
            Debug.WriteLine("Provisioning API initialized: " + initResponse);

            Debug.WriteLine("Starting notifications...");
            var bayeuxClient = new BayeuxClient(new HttpLongPollingTransportOptions
            {
                HttpClient = new HttpClient(new HttpClientHandler {
                    CookieContainer = cookieContainer
                }),
                Uri = provisioningBaseUrl + "/provisioning/v3/notifications",
            });

            bayeuxClient.EventReceived += (e, eventArgs) =>
                                          //Debug.WriteLine($"Event received on channel {eventArgs.Channel} with data\n{eventArgs.Data}\nFull message:\n{eventArgs.Message}");
                                          Debug.WriteLine($"Event received:\n{eventArgs.Message}");

            bayeuxClient.ConnectionStateChanged += (e, eventArgs) =>
                                                   Debug.WriteLine($"Bayeux connection state changed to {eventArgs.ConnectionState}");

            bayeuxClient.AddSubscriptions("/**");
            bayeuxClient.Start().Wait();
            Debug.WriteLine("Notifications started.");
            #endregion

            var provisioningApiLoaded = new ManualResetEventSlim();

            EventHandler <EventReceivedArgs> dbUpdatedHandler = (_, e) =>
            {
                bool?dbUpdated = e.Data["data"]?["dbUpdated"]?.ToObject <bool>();
                if (dbUpdated.GetValueOrDefault(false))
                {
                    provisioningApiLoaded.Set();
                }
            };

            bayeuxClient.EventReceived += dbUpdatedHandler;

            #region Trigger cache load
            Debug.WriteLine("Calling /args...");
            IRestResponse argsResponse = (IRestResponse)provisioningApiConfig.ApiClient.CallApi(
                method: Method.GET,
                path: "/args",
                queryParams: new List <KeyValuePair <String, String> >(),
                postBody: null,
                headerParams: new Dictionary <String, String>(provisioningApiConfig.DefaultHeader)
            {
                { "Accept", "application/json" },
            },
                formParams: new Dictionary <String, String>(),
                fileParams: new Dictionary <String, FileParameter>(),
                pathParams: new Dictionary <String, String>(),
                contentType: provisioningApiConfig.ApiClient.SelectHeaderContentType(new String[] { "application/json" }));

            Debug.WriteLine("/args called: " + argsResponse);

            int localVarStatusCode = (int)argsResponse.StatusCode;

            var exception = Genesys.Internal.Provisioning.Client.Configuration.DefaultExceptionFactory?.Invoke("GetArgs", argsResponse);
            if (exception != null)
            {
                throw exception;
            }
            #endregion

            Debug.WriteLine("Waiting for dbUpdated...");
            provisioningApiLoaded.Wait(timeout: TimeSpan.FromSeconds(5));
            bayeuxClient.EventReceived -= dbUpdatedHandler;
            Debug.WriteLine("dbUpdated received.");

            //Debug.WriteLine("Sleeping...");
            //Thread.Sleep(TimeSpan.FromSeconds(0));
            //Debug.WriteLine("Finished sleep.");

            #region Call GET users
            var usersApi = new UsersApi(provisioningApiConfig);

            Debug.WriteLine("GETting users...");

            var usersResponse = usersApi.GetUsers(
                //limit: 1,
                //offset: 0,
                filterName: "FirstNameOrLastNameMatches",
                filterParameters: "*****@*****.**"
                //filterParameters: "*****@*****.**",
                //filterParameters: "*****@*****.**",
                //userEnabled: false
                );

            var firstUser = (Newtonsoft.Json.Linq.JObject)usersResponse.Data.Users.FirstOrDefault();

            Debug.WriteLine("User found: {0}", firstUser.ToString() ?? "none");
            #endregion
        }