public async Task ModifyContent_And_Delete_File_Succeeds_And_Callsback_Registered_Triggers() { var fileName = Guid.NewGuid().ToString(); var fileLocation = Path.Combine(Path.GetTempPath(), fileName); File.WriteAllText(fileLocation, "OldContent"); var provider = new PhysicalFileProvider(Path.GetTempPath()); var fileInfo = provider.GetFileInfo(fileName); Assert.Equal(new FileInfo(fileInfo.PhysicalPath).Length, fileInfo.Length); Assert.True(fileInfo.Exists); IExpirationTrigger trigger3 = null, trigger4 = null; var trigger1 = provider.Watch(fileName); var trigger2 = provider.Watch(fileName); // Valid trigger1 created. Assert.NotNull(trigger1); Assert.False(trigger1.IsExpired); Assert.True(trigger1.ActiveExpirationCallbacks); // Valid trigger2 created. Assert.NotNull(trigger2); Assert.False(trigger2.IsExpired); Assert.True(trigger2.ActiveExpirationCallbacks); // Trigger is the same for a specific file. Assert.Equal(trigger2, trigger1); trigger1.RegisterExpirationCallback(state => { var infoFromState = state as IFileInfo; trigger3 = provider.Watch(infoFromState.Name); Assert.NotNull(trigger3); trigger3.RegisterExpirationCallback(_ => { }, null); Assert.False(trigger3.IsExpired); }, state: fileInfo); trigger2.RegisterExpirationCallback(state => { var infoFromState = state as IFileInfo; trigger4 = provider.Watch(infoFromState.Name); Assert.NotNull(trigger4); trigger4.RegisterExpirationCallback(_ => { }, null); Assert.False(trigger4.IsExpired); }, state: fileInfo); // Write new content. File.WriteAllText(fileLocation, "OldContent + NewContent"); Assert.True(fileInfo.Exists); // Wait for callbacks to be fired. await Task.Delay(WAIT_TIME_FOR_TRIGGER_TO_FIRE); Assert.True(trigger1.IsExpired); Assert.True(trigger2.IsExpired); // Trigger is the same for a specific file. Assert.Equal(trigger4, trigger3); // A new trigger is created. Assert.NotEqual(trigger1, trigger3); // Delete the file and verify file info is updated. File.Delete(fileLocation); fileInfo = provider.GetFileInfo(fileName); Assert.False(fileInfo.Exists); Assert.False(new FileInfo(fileLocation).Exists); // Wait for callbacks to be fired. await Task.Delay(WAIT_TIME_FOR_TRIGGER_TO_FIRE); Assert.True(trigger3.IsExpired); Assert.True(trigger4.IsExpired); }