Exemplo n.º 1
0
        public void Operate(string testId, SessionStopInfo sessionStopInfo, TaskListener <TestResults> listener)
        {
            if (sessionStopInfo == null)
            {
                TestResults testResults = new TestResults();
                testResults.Status = TestResultsStatus.NotOpened;
                listener.OnComplete(testResults);
                return;
            }

            TaskListener <TestResults> taskListener = new TaskListener <TestResults>(
                (testResults) =>
            {
                Logger.Log(TraceLevel.Notice, testId, Stage.Close, new { testResults.Status });
                testResults.IsNew = sessionStopInfo.RunningSession.IsNewSession;
                testResults.Url   = sessionStopInfo.RunningSession.Url;
                Logger.Verbose(testResults.ToString());
                testResults.ServerConnector = ServerConnector;
                listener.OnComplete(testResults);
            },
                (ex) =>
            {
                listener.OnFail(new EyesException("Failed closing test", ex));
            });

            try
            {
                Logger.Log(TraceLevel.Notice, testId, Stage.Close, new { sessionStopInfo });
                ServerConnector.EndSession(taskListener, sessionStopInfo);
            }
            catch (Exception e)
            {
                listener.OnFail(e);
            }
        }
Exemplo n.º 2
0
        private void UploadData_(TaskListener <string> listener, byte[] bytes, string contentType, string mediaType,
                                 string[] testIds)
        {
            RenderingInfo renderingInfo = GetRenderingInfo();
            string        targetUrl     = renderingInfo?.ResultsUrl?.AbsoluteUri;

            if (targetUrl == null)
            {
                listener.OnComplete(null);
                return;
            }

            Guid guid = Guid.NewGuid();

            targetUrl = targetUrl.Replace("__random__", guid.ToString());
            Logger.Log(TraceLevel.Info, testIds, Stage.General, StageType.UploadStart, new { mediaType, targetUrl });

            HttpRequestMessage request = CreateHttpRequestMessageForUpload_(targetUrl, bytes, contentType, mediaType);

            httpClient_.SendAsyncRequest(new TaskListener <HttpResponseMessage>(
                                             response =>
            {
                if (response == null)
                {
                    throw new NullReferenceException("response is null");
                }
                listener.OnComplete(targetUrl);
            },
                                             ex => listener.OnFail(ex)),
                                         request, Logger, new BackoffProvider(2), TimeSpan.FromMinutes(2));
        }
Exemplo n.º 3
0
        public void TryUploadImage(string testId, MatchWindowData data, TaskListener taskListener)
        {
            AppOutput appOutput = data.AppOutput;

            if (appOutput.ScreenshotUrl != null)
            {
                taskListener.OnComplete();
                return;
            }

            // Getting the screenshot bytes
            TaskListener <string> uploadListener = new TaskListener <string>(
                (url) =>
            {
                if (url == null)
                {
                    Logger.Verbose("Got null url from upload. Test id: {0}", testId);
                    appOutput.ScreenshotUrl = null;
                    taskListener.OnFail(new EyesException("Failed uploading image"));
                    return;
                }
                Logger.Log(TraceLevel.Info, testId, Stage.Check, StageType.UploadComplete, new { url });
                appOutput.ScreenshotUrl = url;
                appOutput.ClearScreenshotBytes();
                taskListener.OnComplete();
            },
                (ex) =>
            {
                appOutput.ScreenshotUrl = null;
                taskListener.OnFail(new EyesException("Failed uploading image", ex));
            }
                );

            try
            {
                Logger.Log(TraceLevel.Info, testId, Stage.Check, StageType.UploadStart,
                           new { dataLength = appOutput.ScreenshotBytes.Length });
                ServerConnector.UploadImage(uploadListener, appOutput.ScreenshotBytes, testId);
            }
            catch (Exception ex)
            {
                taskListener.OnFail(ex);
            }
        }
Exemplo n.º 4
0
 protected virtual void SendUFGAsyncRequest_ <T>(TaskListener <T> taskListener, HttpRequestMessage request) where T : class
 {
     httpClient_.SendAsyncRequest(new TaskListener <HttpResponseMessage>(
                                      response =>
     {
         if (response == null)
         {
             throw new NullReferenceException("response is null");
         }
         taskListener.OnComplete(response.DeserializeBody <T>(true));
     },
                                      ex => taskListener.OnFail(ex)), request, Logger, new BackoffProvider());
 }
Exemplo n.º 5
0
        protected virtual void StartSessionInternal(TaskListener <RunningSession> taskListener, SessionStartInfo startInfo)
        {
            ArgumentGuard.NotNull(startInfo, nameof(startInfo));

            var body = new
            {
                StartInfo = startInfo
            };

            try
            {
                EnsureHttpClient_();
                httpClient_.PostJson(
                    new TaskListener <HttpResponseMessage>(
                        response =>
                {
                    if (response == null)
                    {
                        throw new NullReferenceException("response is null");
                    }
                    // response.DeserializeBody disposes the response object's stream,
                    // rendering all of its properties unusable, including StatusCode.
                    HttpStatusCode responseStatusCode = response.StatusCode;
                    RunningSession runningSession;
                    if (responseStatusCode == HttpStatusCode.ServiceUnavailable)
                    {
                        runningSession = new RunningSession();
                        runningSession.ConcurrencyFull = true;
                    }
                    else
                    {
                        runningSession = response.DeserializeBody <RunningSession>(
                            true, serializer_, HttpStatusCode.OK, HttpStatusCode.Created);
                        if (runningSession.isNewSession_ == null)
                        {
                            runningSession.isNewSession_ = responseStatusCode == HttpStatusCode.Created;
                        }
                        runningSession.ConcurrencyFull = false;
                    }
                    taskListener.OnComplete(runningSession);
                }, ex => taskListener.OnFail(ex))
                    , "api/sessions/running", body);
            }
            catch (Exception ex)
            {
                throw new EyesException($"StartSession failed: {ex.Message}", ex);
            }
        }
Exemplo n.º 6
0
        protected virtual void EndSessionInternal(TaskListener <TestResults> taskListener, SessionStopInfo sessionStopInfo)
        {
            ArgumentGuard.NotNull(sessionStopInfo, nameof(sessionStopInfo));
            ArgumentGuard.NotNull(sessionStopInfo.RunningSession, nameof(sessionStopInfo.RunningSession));

            httpClient_.DeleteJson(new TaskListener <HttpResponseMessage>(
                                       response =>
            {
                if (response == null)
                {
                    throw new NullReferenceException("response is null");
                }
                taskListener.OnComplete(response.DeserializeBody <TestResults>(true));
            },
                                       ex => taskListener.OnFail(ex)
                                       ), $"api/sessions/running/{sessionStopInfo.RunningSession.Id}", sessionStopInfo);
        }
Exemplo n.º 7
0
        private void OnComplete_(SessionStartInfo sessionStartInfo, TaskListener <RunningSession> listener,
                                 RunningSession runningSession, Stopwatch stopwatch, string testId)
        {
            if (runningSession.ConcurrencyFull)
            {
                isServerConcurrencyLimitReached_ = true;
                Logger.Log(TraceLevel.Warn, testId, Stage.Open, StageType.Retry,
                           new { message = "Failed starting test, concurrency is fully used. Trying again." });
                OnFail_(stopwatch, sessionStartInfo, listener, testId);
                return;
            }

            isServerConcurrencyLimitReached_ = false;
            Logger.Log(TraceLevel.Notice, testId, Stage.Open, StageType.Complete,
                       new { message = $"Server session ID is {runningSession.Id}" });
            //Logger.SessionId(runningSession.SessionId);
            listener.OnComplete(runningSession);
        }
Exemplo n.º 8
0
        protected virtual void MatchWindowImpl_(TaskListener <MatchResult> listener, MatchWindowData data, string[] testIds)
        {
            string url = string.Format("api/sessions/running/{0}", data.RunningSession.Id);

            Logger.Log(TraceLevel.Notice, testIds, Stage.Check, StageType.MatchStart);
            httpClient_.PostJson(new TaskListener <HttpResponseMessage>(
                                     response =>
            {
                Logger.Log(TraceLevel.Notice, testIds, Stage.Check, StageType.MatchComplete,
                           new { response?.StatusCode });
                if (response == null)
                {
                    throw new NullReferenceException("response is null");
                }
                MatchResult matchResult = response.DeserializeBody <MatchResult>(true);
                Logger.Log(TraceLevel.Info, testIds, Stage.Check, StageType.MatchComplete, new { matchResult });
                listener.OnComplete(matchResult);
            },
                                     e => listener.OnFail(e)
                                     ), url, data);
        }
Exemplo n.º 9
0
        public virtual void GetJobInfo(TaskListener <IList <JobInfo> > listener, IList <IRenderRequest> renderRequests)
        {
            ArgumentGuard.NotNull(renderRequests, nameof(renderRequests));
            string[] testIds = renderRequests.Select(bi => bi.TestId).ToArray();
            Logger.Log(TraceLevel.Notice, testIds, Stage.Open, StageType.JobInfo, new { renderRequests });
            try
            {
                HttpRequestMessage request = CreateUfgHttpWebRequest_("job-info", content: renderRequests);
                Logger.Log(TraceLevel.Info, testIds, Stage.Open, StageType.RequestSent, new { request.RequestUri });

                httpClient_.SendAsyncRequest(new TaskListener <HttpResponseMessage>(
                                                 response =>
                {
                    JObject[] jobInfosUnparsed = response.DeserializeBody <JObject[]>(true);
                    List <JobInfo> jobInfos    = new List <JobInfo>();
                    foreach (JObject jobInfoUnparsed in jobInfosUnparsed)
                    {
                        JobInfo jobInfo = new JobInfo
                        {
                            Renderer        = jobInfoUnparsed.Value <string>("renderer"),
                            EyesEnvironment = jobInfoUnparsed.Value <object>("eyesEnvironment")
                        };
                        jobInfos.Add(jobInfo);
                    }
                    Logger.Log(TraceLevel.Info, testIds, Stage.Open, StageType.RequestCompleted, new { request.RequestUri });
                    listener.OnComplete(jobInfos);
                },
                                                 ex => listener.OnFail(ex)
                                                 ), request, Logger, new BackoffProvider());
            }
            catch (Exception e)
            {
                CommonUtils.LogExceptionStackTrace(Logger, Stage.Open, StageType.JobInfo, e, testIds);
                listener.OnFail(e);
            }
        }