/// <summary> /// Verify that a start profiling request starts a profiling session /// </summary> //[Fact] public async Task TestHandleStartAndStopProfilingRequests() { using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile()) { var connectionResult = await LiveConnectionHelper.InitLiveConnectionInfoAsync("master", queryTempFile.FilePath); ProfilerService profilerService = new ProfilerService(); // start a new session var startParams = new StartProfilingParams(); startParams.OwnerUri = connectionResult.ConnectionInfo.OwnerUri; startParams.TemplateName = "Standard"; string sessionId = null; var startContext = new Mock <RequestContext <StartProfilingResult> >(); startContext.Setup(rc => rc.SendResult(It.IsAny <StartProfilingResult>())) .Returns <StartProfilingResult>((result) => { // capture the session id for sending the stop message sessionId = result.SessionId; return(Task.FromResult(0)); }); await profilerService.HandleStartProfilingRequest(startParams, startContext.Object); startContext.VerifyAll(); // wait a bit for the session monitoring to initialize Thread.Sleep(TimeSpan.FromHours(1)); // stop the session var stopParams = new StopProfilingParams() { OwnerUri = sessionId }; var stopContext = new Mock <RequestContext <StopProfilingResult> >(); stopContext.Setup(rc => rc.SendResult(It.IsAny <StopProfilingResult>())) .Returns(Task.FromResult(0)); await profilerService.HandleStopProfilingRequest(stopParams, stopContext.Object); stopContext.VerifyAll(); } }
/// <summary> /// Test starting a profiling session and receiving event callback /// </summary> /// <returns></returns> // TODO: Fix flaky test. See https://github.com/Microsoft/sqltoolsservice/issues/459 //[Fact] public async Task TestStartProfilingRequest() { string sessionId = null; string testUri = "profiler_uri"; var requestContext = new Mock <RequestContext <StartProfilingResult> >(); requestContext.Setup(rc => rc.SendResult(It.IsAny <StartProfilingResult>())) .Returns <StartProfilingResult>((result) => { // capture the session id for sending the stop message sessionId = result.SessionId; return(Task.FromResult(0)); }); var sessionListener = new TestSessionListener(); var profilerService = new ProfilerService(); profilerService.SessionMonitor.AddSessionListener(sessionListener); profilerService.ConnectionServiceInstance = TestObjects.GetTestConnectionService(); ConnectionInfo connectionInfo = TestObjects.GetTestConnectionInfo(); profilerService.ConnectionServiceInstance.OwnerToConnectionMap.Add(testUri, connectionInfo); profilerService.XEventSessionFactory = new TestXEventSessionFactory(); var requestParams = new StartProfilingParams(); requestParams.OwnerUri = testUri; requestParams.TemplateName = "Standard"; await profilerService.HandleStartProfilingRequest(requestParams, requestContext.Object); // wait a bit for profile sessions to be polled Thread.Sleep(500); requestContext.VerifyAll(); Assert.Equal(sessionListener.PreviousSessionId, sessionId); Assert.Equal(sessionListener.PreviousEvents.Count, 1); }
/// <summary> /// Test starting a profiling session and receiving event callback /// </summary> /// <returns></returns> // TODO: Fix flaky test. See https://github.com/Microsoft/sqltoolsservice/issues/459 //[Fact] public async Task TestStartProfilingRequest() { string sessionId = null; bool recievedEvents = false; string testUri = "profiler_uri"; var requestContext = new Mock <RequestContext <StartProfilingResult> >(); requestContext.Setup(rc => rc.SendResult(It.IsAny <StartProfilingResult>())) .Returns <StartProfilingResult>((result) => { // capture the session id for sending the stop message sessionId = result.SessionId; return(Task.FromResult(0)); }); // capture listener event notifications var mockListener = new Mock <IProfilerSessionListener>(); mockListener.Setup(p => p.EventsAvailable(It.IsAny <string>(), It.IsAny <List <ProfilerEvent> >(), It.IsAny <bool>())).Callback(() => { recievedEvents = true; }); var profilerService = new ProfilerService(); profilerService.SessionMonitor.AddSessionListener(mockListener.Object); profilerService.ConnectionServiceInstance = TestObjects.GetTestConnectionService(); ConnectionInfo connectionInfo = TestObjects.GetTestConnectionInfo(); profilerService.ConnectionServiceInstance.OwnerToConnectionMap.Add(testUri, connectionInfo); profilerService.XEventSessionFactory = new TestXEventSessionFactory(); var requestParams = new StartProfilingParams(); requestParams.OwnerUri = testUri; requestParams.TemplateName = "Standard"; // start profiling session await profilerService.HandleStartProfilingRequest(requestParams, requestContext.Object); profilerService.SessionMonitor.PollSession(1); // simulate a short polling delay Thread.Sleep(200); profilerService.SessionMonitor.PollSession(1); // wait for polling to finish, or for timeout System.Timers.Timer pollingTimer = new System.Timers.Timer(); pollingTimer.Interval = 10000; pollingTimer.Start(); bool timeout = false; pollingTimer.Elapsed += new System.Timers.ElapsedEventHandler((s_, e_) => { timeout = true; }); while (sessionId == null && !timeout) { Thread.Sleep(250); } pollingTimer.Stop(); requestContext.VerifyAll(); // Check that the correct XEvent session was started Assert.Equal(sessionId, "1"); // check that the proper owner Uri was used Assert.True(recievedEvents); }