public async Task VerifyFileWatcherRegistrationOnTreeChange(string inputTree, string changedTree, int numRegisterCalls, int numUnregisterCalls) { var spMock = new IAsyncServiceProviderMoq(); uint adviseCookie = 100; var fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(adviseCookie); spMock.AddService(typeof(SVsFileChangeEx), fileChangeService); var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t()); var watcher = new ProjectAssetFileWatcher(spMock, IProjectTreeProviderFactory.Create(), IUnconfiguredProjectCommonServicesFactory.Create(threadingService: new IProjectThreadingServiceMock()), tasksService, IActiveConfiguredProjectSubscriptionServiceFactory.Create()); watcher.Load(); var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(ProjectCurrentStateJson); var firstTree = ProjectTreeParser.Parse(inputTree); await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory <Tuple <IProjectTreeSnapshot, IProjectSubscriptionUpdate> > .Create((Tuple.Create(IProjectTreeSnapshotFactory.Create(firstTree), projectUpdate)))); var secondTree = ProjectTreeParser.Parse(changedTree); await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory <Tuple <IProjectTreeSnapshot, IProjectSubscriptionUpdate> > .Create((Tuple.Create(IProjectTreeSnapshotFactory.Create(secondTree), projectUpdate)))); // If fileToWatch is null then we expect to not register any filewatcher. var fileChangeServiceMock = Mock.Get(fileChangeService); fileChangeServiceMock.Verify(s => s.AdviseFileChange(It.IsAny <string>(), It.IsAny <uint>(), watcher, out adviseCookie), Times.Exactly(numRegisterCalls)); fileChangeServiceMock.Verify(s => s.UnadviseFileChange(adviseCookie), Times.Exactly(numUnregisterCalls)); }
public async Task WhenBaseIntermediateOutputPathNotSet_DoesNotAttemptToAdviseFileChange() { var spMock = new IAsyncServiceProviderMoq(); var fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(100); spMock.AddService(typeof(SVsFileChangeEx), fileChangeService); var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t()); var watcher = new ProjectAssetFileWatcher(spMock, IProjectTreeProviderFactory.Create(), IUnconfiguredProjectCommonServicesFactory.Create(threadingService: new IProjectThreadingServiceMock()), tasksService, IActiveConfiguredProjectSubscriptionServiceFactory.Create()); var tree = ProjectTreeParser.Parse(@"Root (flags: {ProjectRoot}), FilePath: ""C:\Foo\foo.proj"""); var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(@"{ ""CurrentState"": { ""ConfigurationGeneral"": { ""Properties"": { ""MSBuildProjectFullPath"": ""C:\\Foo\\foo.proj"" } } } }"); watcher.Load(); await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory <Tuple <IProjectTreeSnapshot, IProjectSubscriptionUpdate> > .Create((Tuple.Create(IProjectTreeSnapshotFactory.Create(tree), projectUpdate)))); var fileChangeServiceMock = Mock.Get(fileChangeService); uint cookie; fileChangeServiceMock.Verify(s => s.AdviseFileChange(It.IsAny <string>(), It.IsAny <uint>(), watcher, out cookie), Times.Never()); }
public async Task VerifyFileWatcherRegistrationOnTreeChange(string inputTree, string changedTree, int numRegisterCalls, int numUnregisterCalls) { uint adviseCookie = 100; var fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(adviseCookie); var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t()); using var watcher = new ProjectAssetFileWatcherInstance( IVsServiceFactory.Create <SVsFileChangeEx, IVsAsyncFileChangeEx>(fileChangeService), IProjectTreeProviderFactory.Create(), IUnconfiguredProjectCommonServicesFactory.Create(threadingService: IProjectThreadingServiceFactory.Create()), tasksService, IActiveConfiguredProjectSubscriptionServiceFactory.Create()); await watcher.InitializeAsync(); var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(ProjectCurrentStateJson); var firstTree = ProjectTreeParser.Parse(inputTree); await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory.Create(Tuple.Create(IProjectTreeSnapshotFactory.Create(firstTree), projectUpdate))); var secondTree = ProjectTreeParser.Parse(changedTree); await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory.Create(Tuple.Create(IProjectTreeSnapshotFactory.Create(secondTree), projectUpdate))); // If fileToWatch is null then we expect to not register any filewatcher. var fileChangeServiceMock = Mock.Get(fileChangeService); fileChangeServiceMock.Verify(s => s.AdviseFileChangeAsync(It.IsAny <string>(), It.IsAny <_VSFILECHANGEFLAGS>(), watcher, CancellationToken.None), Times.Exactly(numRegisterCalls)); fileChangeServiceMock.Verify(s => s.UnadviseFileChangeAsync(adviseCookie, CancellationToken.None), Times.Exactly(numUnregisterCalls)); }
public async Task WhenBaseIntermediateOutputPathNotSet_DoesNotAttemptToAdviseFileChange() { var fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(100); var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t()); using var watcher = new ProjectAssetFileWatcherInstance( IVsServiceFactory.Create <SVsFileChangeEx, IVsAsyncFileChangeEx>(fileChangeService), IProjectTreeProviderFactory.Create(), IUnconfiguredProjectCommonServicesFactory.Create(threadingService: IProjectThreadingServiceFactory.Create()), tasksService, IActiveConfiguredProjectSubscriptionServiceFactory.Create()); var tree = ProjectTreeParser.Parse(@"Root (flags: {ProjectRoot}), FilePath: ""C:\Foo\foo.proj"""); var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(@"{ ""CurrentState"": { ""ConfigurationGeneral"": { ""Properties"": { ""MSBuildProjectFullPath"": ""C:\\Foo\\foo.proj"" } } } }"); await watcher.InitializeAsync(); await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory.Create(Tuple.Create(IProjectTreeSnapshotFactory.Create(tree), projectUpdate))); var fileChangeServiceMock = Mock.Get(fileChangeService); fileChangeServiceMock.Verify(s => s.AdviseFileChangeAsync(It.IsAny <string>(), It.IsAny <_VSFILECHANGEFLAGS>(), watcher, CancellationToken.None), Times.Never()); }
private static SDKVersionTelemetryServiceComponent CreateComponent(Guid guid, Action <TelemetryParameters> onTelemetryLogged, string?version) { var projectVsServices = CreateProjectServices(version); var projectGuidService = CreateISafeProjectGuidService(guid); var telemetryService = CreateITelemetryService(onTelemetryLogged); var unconfiguredProjectTasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync(async t => await t()); return(new SDKVersionTelemetryServiceComponent( projectVsServices, projectGuidService, telemetryService, unconfiguredProjectTasksService)); }
public async Task VerifyFileWatcherRegistration(string inputTree, string fileToWatch) { uint adviseCookie = 100; var fileChangeService = IVsFileChangeExFactory.CreateWithAdviseUnadviseFileChange(adviseCookie); var tasksService = IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t()); using (var watcher = new ProjectAssetFileWatcher(IVsServiceFactory.Create <SVsFileChangeEx, Shell.IVsAsyncFileChangeEx>(fileChangeService), IProjectTreeProviderFactory.Create(), IUnconfiguredProjectCommonServicesFactory.Create(threadingService: IProjectThreadingServiceFactory.Create()), tasksService, IActiveConfiguredProjectSubscriptionServiceFactory.Create())) { var tree = ProjectTreeParser.Parse(inputTree); var projectUpdate = IProjectSubscriptionUpdateFactory.FromJson(ProjectCurrentStateJson); watcher.Load(); await watcher.DataFlow_ChangedAsync(IProjectVersionedValueFactory.Create(Tuple.Create(IProjectTreeSnapshotFactory.Create(tree), projectUpdate))); // If fileToWatch is null then we expect to not register any filewatcher. var times = fileToWatch == null?Times.Never() : Times.Once(); Mock.Get(fileChangeService).Verify(s => s.AdviseFileChangeAsync(fileToWatch ?? It.IsAny <string>(), It.IsAny <_VSFILECHANGEFLAGS>(), watcher, CancellationToken.None), times); } }
private static ActiveConfiguredProjectsLoader CreateInstance(UnconfiguredProject project, IActiveConfigurationGroupService activeConfigurationGroupService, IUnconfiguredProjectTasksService?tasksService) { tasksService ??= IUnconfiguredProjectTasksServiceFactory.ImplementLoadedProjectAsync <ConfiguredProject>(t => t()); return(new ActiveConfiguredProjectsLoader(project, activeConfigurationGroupService, tasksService)); }