diff --git a/src/GitHub.Api/Cache/CacheContainer.cs b/src/GitHub.Api/Cache/CacheContainer.cs index aa4266b5f..f8de8c283 100644 --- a/src/GitHub.Api/Cache/CacheContainer.cs +++ b/src/GitHub.Api/Cache/CacheContainer.cs @@ -60,13 +60,11 @@ public void CheckAndRaiseEventsIfCacheNewer(CacheType cacheType, CacheUpdateEven private void OnCacheUpdated(CacheType cacheType, DateTimeOffset datetime) { - Logger.Trace("OnCacheUpdated cacheType:{0} datetime:{1}", cacheType, datetime); CacheUpdated.SafeInvoke(cacheType, datetime); } private void OnCacheInvalidated(CacheType cacheType) { - Logger.Trace("OnCacheInvalidated cacheType:{0}", cacheType); CacheInvalidated.SafeInvoke(cacheType); } diff --git a/src/GitHub.Api/Git/GitConfig.cs b/src/GitHub.Api/Git/GitConfig.cs index dd0cc5f18..b2277295c 100644 --- a/src/GitHub.Api/Git/GitConfig.cs +++ b/src/GitHub.Api/Git/GitConfig.cs @@ -79,17 +79,20 @@ public struct ConfigBranch public string name; public ConfigRemote remote; + public string trackingBranch; public ConfigBranch(string name) { this.name = name; + this.trackingBranch = null; remote = ConfigRemote.Default; } - public ConfigBranch(string name, ConfigRemote? remote) + public ConfigBranch(string name, ConfigRemote? remote, string trackingBranch) { this.name = name; this.remote = remote ?? ConfigRemote.Default; + this.trackingBranch = trackingBranch != null && trackingBranch.StartsWith("refs/heads") ? trackingBranch.Substring("refs/heads".Length + 1) : null; } public override int GetHashCode() @@ -137,6 +140,7 @@ public bool Equals(ConfigBranch other) public bool IsTracking => Remote.HasValue; public string Name => name; + public string TrackingBranch => trackingBranch; public ConfigRemote? Remote => Equals(remote, ConfigRemote.Default) ? (ConfigRemote?) null : remote; @@ -189,7 +193,7 @@ public IEnumerable GetBranches() return groups .Where(x => x.Key == "branch") .SelectMany(x => x.Value) - .Select(x => new ConfigBranch(x.Key, GetRemote(x.Value.TryGetString("remote")))); + .Select(x => new ConfigBranch(x.Key, GetRemote(x.Value.TryGetString("remote")), x.Value.TryGetString("merge"))); } public IEnumerable GetRemotes() @@ -217,7 +221,7 @@ public IEnumerable GetRemotes() .Where(x => x.Key == "branch") .SelectMany(x => x.Value) .Where(x => x.Key == branch) - .Select(x => new ConfigBranch(x.Key,GetRemote(x.Value.TryGetString("remote"))) as ConfigBranch?) + .Select(x => new ConfigBranch(x.Key, GetRemote(x.Value.TryGetString("remote")), x.Value.TryGetString("merge")) as ConfigBranch?) .FirstOrDefault(); } diff --git a/src/GitHub.Api/Git/IRepository.cs b/src/GitHub.Api/Git/IRepository.cs index 981aa5059..56db158fd 100644 --- a/src/GitHub.Api/Git/IRepository.cs +++ b/src/GitHub.Api/Git/IRepository.cs @@ -8,7 +8,7 @@ namespace GitHub.Unity /// public interface IRepository : IEquatable, IDisposable { - void Initialize(IRepositoryManager repositoryManager, ITaskManager taskManager); + void Initialize(IRepositoryManager theRepositoryManager, ITaskManager theTaskManager); void Start(); ITask CommitAllFiles(string message, string body); diff --git a/src/GitHub.Api/Git/Repository.cs b/src/GitHub.Api/Git/Repository.cs index 6e87c0e9a..dfa8db0ab 100644 --- a/src/GitHub.Api/Git/Repository.cs +++ b/src/GitHub.Api/Git/Repository.cs @@ -70,14 +70,14 @@ public Repository(NPath localPath, ICacheContainer container) }; } - public void Initialize(IRepositoryManager repositoryManager, ITaskManager taskManager) + public void Initialize(IRepositoryManager theRepositoryManager, ITaskManager theTaskManager) { //Logger.Trace("Initialize"); - Guard.ArgumentNotNull(repositoryManager, nameof(repositoryManager)); - Guard.ArgumentNotNull(taskManager, nameof(taskManager)); + Guard.ArgumentNotNull(theRepositoryManager, nameof(theRepositoryManager)); + Guard.ArgumentNotNull(theTaskManager, nameof(theTaskManager)); - this.taskManager = taskManager; - this.repositoryManager = repositoryManager; + this.taskManager = theTaskManager; + this.repositoryManager = theRepositoryManager; this.repositoryManager.CurrentBranchUpdated += RepositoryManagerOnCurrentBranchUpdated; this.repositoryManager.GitStatusUpdated += RepositoryManagerOnGitStatusUpdated; this.repositoryManager.GitAheadBehindStatusUpdated += RepositoryManagerOnGitAheadBehindStatusUpdated; @@ -176,7 +176,6 @@ private void CacheHasBeenInvalidated(CacheType cacheType) return; } - Logger.Trace($"CacheInvalidated {cacheType.ToString()}"); switch (cacheType) { case CacheType.Branches: diff --git a/src/GitHub.Api/Git/RepositoryManager.cs b/src/GitHub.Api/Git/RepositoryManager.cs index f9f53a83d..7cfd80562 100644 --- a/src/GitHub.Api/Git/RepositoryManager.cs +++ b/src/GitHub.Api/Git/RepositoryManager.cs @@ -348,7 +348,7 @@ public void UpdateGitAheadBehindStatus() if (configBranch.HasValue && configBranch.Value.Remote.HasValue) { var name = configBranch.Value.Name; - var trackingName = configBranch.Value.IsTracking ? configBranch.Value.Remote.Value.Name + "/" + name : "[None]"; + var trackingName = configBranch.Value.IsTracking ? configBranch.Value.Remote.Value.Name + "/" + configBranch.Value.TrackingBranch : "[None]"; var task = GitClient.AheadBehindStatus(name, trackingName) .Then((success, status) => @@ -491,6 +491,10 @@ private void WatcherOnLocalBranchesChanged() { Logger.Trace("WatcherOnLocalBranchesChanged"); DataNeedsRefreshing?.Invoke(CacheType.Branches); + // the watcher should tell us what branch has changed so we can fire this only + // when the active branch has changed + DataNeedsRefreshing?.Invoke(CacheType.GitLog); + DataNeedsRefreshing?.Invoke(CacheType.GitAheadBehind); } private void WatcherOnRepositoryCommitted() @@ -520,6 +524,7 @@ private void WatcherOnHeadChanged() Logger.Trace("WatcherOnHeadChanged"); DataNeedsRefreshing?.Invoke(CacheType.RepositoryInfo); DataNeedsRefreshing?.Invoke(CacheType.GitLog); + DataNeedsRefreshing?.Invoke(CacheType.GitAheadBehind); } private void WatcherOnIndexChanged() @@ -577,7 +582,7 @@ private void UpdateRemoteBranches() .Select(x => x.RelativeTo(basedir)) .Select(x => x.ToString(SlashMode.Forward))) { - branchList.Add(branch, new ConfigBranch(branch, remotes[remote])); + branchList.Add(branch, new ConfigBranch(branch, remotes[remote], null)); } remoteBranches.Add(remote, branchList); diff --git a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs index 794f9ef8b..0bd338885 100644 --- a/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs +++ b/src/UnityExtension/Assets/Editor/GitHub.Unity/ApplicationCache.cs @@ -488,7 +488,7 @@ public GitBranch[] LocalBranches var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} localBranches:{1}", now, value); + Logger.Trace("{0} Updating LocalBranches: current:{1} new:{2}", now, localBranches, value); var localBranchesIsNull = localBranches == null; var valueIsNull = value == null; @@ -512,7 +512,7 @@ public GitBranch[] RemoteBranches var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} remoteBranches:{1}", now, value); + Logger.Trace("{0} Updating RemoteBranches: current:{1} new:{2}", now, remoteBranches, value); var remoteBranchesIsNull = remoteBranches == null; var valueIsNull = value == null; @@ -536,7 +536,7 @@ public GitRemote[] Remotes var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} remotes:{1}", now, value); + Logger.Trace("{0} Updating Remotes: current:{1} new:{2}", now, remotes, value); var remotesIsNull = remotes == null; var valueIsNull = value == null; @@ -590,7 +590,7 @@ public void AddRemoteBranch(string remote, string branch) if (!branchList.ContainsKey(branch)) { var now = DateTimeOffset.Now; - branchList.Add(branch, new ConfigBranch(branch, ConfigRemotes[remote])); + branchList.Add(branch, new ConfigBranch(branch, ConfigRemotes[remote], null)); Logger.Trace("AddRemoteBranch {0} remote:{1} branch:{2} ", now, remote, branch); SaveData(now, true); } @@ -671,7 +671,7 @@ public List Log var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} gitLog:{1}", now, value); + Logger.Trace("{0} Updating Log: current:{1} new:{2}", now, log.Count, value.Count); if (!log.SequenceEqual(value)) { @@ -707,8 +707,7 @@ public int Ahead var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} ahead:{1}", now, value); - + Logger.Trace("{0} Updating Ahead: current:{1} new:{2}", now, ahead, value); if (ahead != value) { ahead = value; @@ -731,7 +730,7 @@ public int Behind var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} behind:{1}", now, value); + Logger.Trace("{0} Updating Behind: current:{1} new:{2}", now, behind, value); if (behind != value) { @@ -766,7 +765,7 @@ public List Entries var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} entries:{1}", now, value.Count); + Logger.Trace("{0} Updating Entries: current:{1} new:{2}", now, entries.Count, value.Count); if (!entries.SequenceEqual(value)) { @@ -801,7 +800,7 @@ public List GitLocks var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} gitLocks:{1}", now, value); + Logger.Trace("{0} Updating GitLocks: current:{1} new:{2}", now, gitLocks.Count, value.Count); if (!gitLocks.SequenceEqual(value)) { @@ -837,7 +836,7 @@ public string Name var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} Name:{1}", now, value); + Logger.Trace("{0} Updating Name: current:{1} new:{2}", now, gitName, value); if (gitName != value) { @@ -861,7 +860,7 @@ public string Email var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} Email:{1}", now, value); + Logger.Trace("{0} Updating Email: current:{1} new:{2}", now, gitEmail, value); if (gitEmail != value) { diff --git a/src/tests/IntegrationTests/BaseIntegrationTest.cs b/src/tests/IntegrationTests/BaseIntegrationTest.cs index d6fad1bc0..de1de8260 100644 --- a/src/tests/IntegrationTests/BaseIntegrationTest.cs +++ b/src/tests/IntegrationTests/BaseIntegrationTest.cs @@ -216,6 +216,13 @@ public virtual void OnTearDown() { TaskManager.Dispose(); Environment?.CacheContainer.Dispose(); + BranchesCache.Instance = null; + GitAheadBehindCache.Instance = null; + GitLocksCache.Instance = null; + GitLogCache.Instance = null; + GitStatusCache.Instance = null; + GitUserCache.Instance = null; + RepositoryInfoCache.Instance = null; Logger.Debug("Deleting TestBasePath: {0}", TestBasePath.ToString()); for (var i = 0; i < 5; i++) diff --git a/src/tests/IntegrationTests/CachingClasses.cs b/src/tests/IntegrationTests/CachingClasses.cs index 685a21cd9..6b32cbaf4 100644 --- a/src/tests/IntegrationTests/CachingClasses.cs +++ b/src/tests/IntegrationTests/CachingClasses.cs @@ -19,6 +19,7 @@ public static T Instance CreateAndLoad(); return instance; } + set { instance = value; } } protected ScriptObjectSingleton() @@ -458,7 +459,7 @@ public GitBranch[] LocalBranches var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} localBranches:{1}", now, value); + Logger.Trace("{0} Updating LocalBranches: current:{1} new:{2}", now, localBranches, value); var localBranchesIsNull = localBranches == null; var valueIsNull = value == null; @@ -482,7 +483,7 @@ public GitBranch[] RemoteBranches var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} remoteBranches:{1}", now, value); + Logger.Trace("{0} Updating RemoteBranches: current:{1} new:{2}", now, remoteBranches, value); var remoteBranchesIsNull = remoteBranches == null; var valueIsNull = value == null; @@ -506,7 +507,7 @@ public GitRemote[] Remotes var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} remotes:{1}", now, value); + Logger.Trace("{0} Updating Remotes: current:{1} new:{2}", now, remotes, value); var remotesIsNull = remotes == null; var valueIsNull = value == null; @@ -560,7 +561,7 @@ public void AddRemoteBranch(string remote, string branch) if (!branchList.ContainsKey(branch)) { var now = DateTimeOffset.Now; - branchList.Add(branch, new ConfigBranch(branch, ConfigRemotes[remote])); + branchList.Add(branch, new ConfigBranch(branch, ConfigRemotes[remote], null)); Logger.Trace("AddRemoteBranch {0} remote:{1} branch:{2} ", now, remote, branch); SaveData(now, true); } @@ -640,7 +641,7 @@ public List Log var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} gitLog:{1}", now, value); + Logger.Trace("{0} Updating Log: current:{1} new:{2}", now, log.Count, value.Count); if (!log.SequenceEqual(value)) { @@ -675,7 +676,7 @@ public int Ahead var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} ahead:{1}", now, value); + Logger.Trace("{0} Updating Ahead: current:{1} new:{2}", now, ahead, value); if (ahead != value) { @@ -699,7 +700,7 @@ public int Behind var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} behind:{1}", now, value); + Logger.Trace("{0} Updating Behind: current:{1} new:{2}", now, behind, value); if (behind != value) { @@ -733,7 +734,7 @@ public List Entries var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} entries:{1}", now, value.Count); + Logger.Trace("{0} Updating Entries: current:{1} new:{2}", now, entries.Count, value.Count); if (!entries.SequenceEqual(value)) { @@ -767,7 +768,7 @@ public List GitLocks var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} gitLocks:{1}", now, value); + Logger.Trace("{0} Updating GitLocks: current:{1} new:{2}", now, gitLocks.Count, value.Count); if (!gitLocks.SequenceEqual(value)) { @@ -802,7 +803,7 @@ public string Name var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} Name:{1}", now, value); + Logger.Trace("{0} Updating Name: current:{1} new:{2}", now, gitName, value); if (gitName != value) { @@ -826,7 +827,7 @@ public string Email var now = DateTimeOffset.Now; var isUpdated = false; - Logger.Trace("Updating: {0} Email:{1}", now, value); + Logger.Trace("{0} Updating Email: current:{1} new:{2}", now, gitEmail, value); if (gitEmail != value) { diff --git a/src/tests/IntegrationTests/Events/RepositoryManagerTests.cs b/src/tests/IntegrationTests/Events/RepositoryManagerTests.cs index a7a4a0c22..d5452f621 100644 --- a/src/tests/IntegrationTests/Events/RepositoryManagerTests.cs +++ b/src/tests/IntegrationTests/Events/RepositoryManagerTests.cs @@ -18,7 +18,7 @@ namespace IntegrationTests class RepositoryManagerTests : BaseGitEnvironmentTest { private RepositoryManagerEvents repositoryManagerEvents; - private TimeSpan Timeout = TimeSpan.FromSeconds(5); + private TimeSpan Timeout = TimeSpan.FromMilliseconds(1200); public override void OnSetup() { @@ -80,8 +80,6 @@ public async Task ShouldDetectFileChanges() repositoryManagerListener.AttachListener(manager, repositoryManagerEvents); }); - //repositoryManagerListener.ClearReceivedCalls(); - //repositoryManagerEvents.Reset(); repositoryManagerListener.AssertDidNotReceiveAnyCalls(); var foobarTxt = TestRepoMasterCleanSynchronized.Combine("foobar.txt"); @@ -94,19 +92,19 @@ public async Task ShouldDetectFileChanges() StopTrackTimeAndLog(watch, logger); StartTrackTime(watch, logger, "repositoryManagerEvents.WaitForNotBusy()"); - repositoryManagerEvents.WaitForNotBusy(); + await repositoryManagerEvents.WaitForNotBusy(); StopTrackTimeAndLog(watch, logger); - repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue(); + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.GitStatusUpdated); - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.DidNotReceive().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLogUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.CurrentBranchUpdated); } finally { @@ -135,48 +133,50 @@ public async Task ShouldAddAndCommitFiles() var foobarTxt = TestRepoMasterCleanSynchronized.Combine("foobar.txt"); foobarTxt.WriteAllText("foobar"); - var testDocumentTxt = TestRepoMasterCleanSynchronized.Combine("Assets", "TestDocument.txt"); - testDocumentTxt.WriteAllText("foobar"); - - await TaskManager.Wait(); - + StartTrackTime(watch, logger, "RepositoryManager.WaitForEvents()"); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); + StopTrackTimeAndLog(watch, logger); - repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue(); + StartTrackTime(watch, logger, "repositoryManagerEvents.WaitForNotBusy()"); + await repositoryManagerEvents.WaitForNotBusy(); + StopTrackTimeAndLog(watch, logger); - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.DidNotReceive().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.GitStatusUpdated); + + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLogUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.CurrentBranchUpdated); repositoryManagerListener.ClearReceivedCalls(); repositoryManagerEvents.Reset(); - await RepositoryManager - .CommitFiles(new List { "Assets\\TestDocument.txt", "foobar.txt" }, "IntegrationTest Commit", string.Empty) - .StartAsAsync(); + var filesToCommit = new List { "foobar.txt" }; + var commitMessage = "IntegrationTest Commit"; + var commitBody = string.Empty; + + StartTrackTime(watch, logger, "CommitFiles"); + await RepositoryManager.CommitFiles(filesToCommit, commitMessage, commitBody).StartAsAsync(); + StopTrackTimeAndLog(watch, logger); await TaskManager.Wait(); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); - - repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue(); - - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + await repositoryManagerEvents.WaitForNotBusy(); + + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitLogUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); + + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); } finally { @@ -184,6 +184,16 @@ await RepositoryManager } } + private async Task AssertReceivedEvent(Task task) + { + (await TaskEx.WhenAny(task, TaskEx.Delay(Timeout))).Should().BeAssignableTo>("otherwise the event was not raised"); + } + + private async Task AssertDidNotReceiveEvent(Task task) + { + (await TaskEx.WhenAny(task, TaskEx.Delay(Timeout))).Should().BeAssignableTo>("otherwise the event was raised"); + } + [Test] public async Task ShouldAddAndCommitAllFiles() { @@ -202,12 +212,11 @@ public async Task ShouldAddAndCommitAllFiles() repositoryManagerListener.AssertDidNotReceiveAnyCalls(); + logger.Trace("Add files"); + var foobarTxt = TestRepoMasterCleanSynchronized.Combine("foobar.txt"); foobarTxt.WriteAllText("foobar"); - var testDocumentTxt = TestRepoMasterCleanSynchronized.Combine("Assets", "TestDocument.txt"); - testDocumentTxt.WriteAllText("foobar"); - await TaskManager.Wait(); StartTrackTime(watch, logger, "RepositoryManager.WaitForEvents()"); @@ -215,27 +224,25 @@ public async Task ShouldAddAndCommitAllFiles() StopTrackTimeAndLog(watch, logger); StartTrackTime(watch, logger, "repositoryManagerEvents.WaitForNotBusy()"); - repositoryManagerEvents.WaitForNotBusy(); + await repositoryManagerEvents.WaitForNotBusy(); StopTrackTimeAndLog(watch, logger); - repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue(); + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.GitStatusUpdated); - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.DidNotReceive().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLogUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.CurrentBranchUpdated); repositoryManagerListener.ClearReceivedCalls(); repositoryManagerEvents.Reset(); StartTrackTime(watch, logger, "CommitAllFiles"); - await RepositoryManager - .CommitAllFiles("IntegrationTest Commit", string.Empty) - .StartAsAsync(); + await RepositoryManager.CommitAllFiles("IntegrationTest Commit", string.Empty).StartAsAsync(); StopTrackTimeAndLog(watch, logger); await TaskManager.Wait(); @@ -245,21 +252,19 @@ await RepositoryManager StopTrackTimeAndLog(watch, logger); StartTrackTime(watch, logger, "repositoryManagerEvents.WaitForNotBusy()"); - repositoryManagerEvents.WaitForNotBusy(); + await repositoryManagerEvents.WaitForNotBusy(); StopTrackTimeAndLog(watch, logger); - repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue(); + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.GitStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitLogUpdated); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); } finally { @@ -289,20 +294,18 @@ public async Task ShouldDetectBranchChange() await TaskManager.Wait(); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); - - repositoryManagerEvents.CurrentBranchUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue(); - - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.DidNotReceive().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + await repositoryManagerEvents.WaitForNotBusy(); + + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.GitStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitLogUpdated); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); + + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); } finally { @@ -332,22 +335,20 @@ public async Task ShouldDetectBranchDelete() await TaskManager.Wait(); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); + await repositoryManagerEvents.WaitForNotBusy(); - repositoryManagerEvents.CurrentBranchUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.RemoteBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitAheadBehindStatusUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue(); + await TaskEx.Delay(Timeout); - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitLogUpdated); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); + + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitStatusUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); } finally { @@ -373,23 +374,34 @@ public async Task ShouldDetectBranchCreate() repositoryManagerListener.AssertDidNotReceiveAnyCalls(); + { + // prepopulate repository info cache + var b = Repository.CurrentBranch; + await TaskManager.Wait(); + RepositoryManager.WaitForEvents(); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); + repositoryManagerListener.ClearReceivedCalls(); + repositoryManagerEvents.Reset(); + } + var createdBranch1 = "feature/document2"; await RepositoryManager.CreateBranch(createdBranch1, "feature/document").StartAsAsync(); await TaskManager.Wait(); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); + await repositoryManagerEvents.WaitForNotBusy(); - repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.DidNotReceive().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + // we don't expect these events + // TODO: log should not be getting called, but it is because when branches get changed we're blindly calling log + //await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLogUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitStatusUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.CurrentBranchUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); repositoryManagerListener.ClearReceivedCalls(); repositoryManagerEvents.Reset(); @@ -401,18 +413,19 @@ public async Task ShouldDetectBranchCreate() RepositoryManager.WaitForEvents(); StopTrackTimeAndLog(watch, logger); - repositoryManagerEvents.WaitForNotBusy(); + await repositoryManagerEvents.WaitForNotBusy(); - repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.DidNotReceive().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitStatusUpdated); + // TODO: log should not be getting called, but it is because when branches get changed we're blindly calling log + //await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLogUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.CurrentBranchUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); } finally { @@ -442,22 +455,18 @@ public async Task ShouldDetectChangesToRemotes() await TaskManager.Wait(); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); + await repositoryManagerEvents.WaitForNotBusy(); - repositoryManagerEvents.CurrentBranchUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.RemoteBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitAheadBehindStatusUpdated.WaitOne(Timeout).Should().BeTrue(); + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitLogUpdated); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitStatusUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); repositoryManagerListener.ClearReceivedCalls(); repositoryManagerEvents.Reset(); @@ -466,22 +475,18 @@ public async Task ShouldDetectChangesToRemotes() await TaskManager.Wait(); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); - - repositoryManagerEvents.CurrentBranchUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.RemoteBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitAheadBehindStatusUpdated.WaitOne(Timeout).Should().BeTrue(); - - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + await repositoryManagerEvents.WaitForNotBusy(); + + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitLogUpdated); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); + + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitStatusUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); } finally { @@ -507,49 +512,42 @@ public async Task ShouldDetectChangesToRemotesWhenSwitchingBranches() repositoryManagerListener.AssertDidNotReceiveAnyCalls(); - await RepositoryManager.CreateBranch("branch2", "another/master") - .StartAsAsync(); + await RepositoryManager.CreateBranch("branch2", "another/master").StartAsAsync(); await TaskManager.Wait(); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); + await repositoryManagerEvents.WaitForNotBusy(); - repositoryManagerEvents.CurrentBranchUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.RemoteBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitAheadBehindStatusUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue(); + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitLogUpdated); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitStatusUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); repositoryManagerListener.ClearReceivedCalls(); repositoryManagerEvents.Reset(); - await RepositoryManager.SwitchBranch("branch2") - .StartAsAsync(); + await RepositoryManager.SwitchBranch("branch2").StartAsAsync(); await TaskManager.Wait(); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); - - repositoryManagerEvents.CurrentBranchUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitLogUpdated.WaitOne(Timeout).Should().BeTrue(); - - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.DidNotReceive().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + await repositoryManagerEvents.WaitForNotBusy(); + + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.GitStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitLogUpdated); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); + + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); } finally { @@ -579,19 +577,19 @@ public async Task ShouldDetectGitPull() await TaskManager.Wait(); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); - - repositoryManagerEvents.LocalBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitStatusUpdated.WaitOne(Timeout).Should().BeTrue(); - - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.Received().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.Received().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.DidNotReceive().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + await repositoryManagerEvents.WaitForNotBusy(); + + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.GitStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitLogUpdated); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); + + // we don't expect these events + // TODO: this should not happen but it's happening right now because when local branches get updated in the cache, remotes get updated too + //await AssertDidNotReceiveEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); } finally { @@ -621,19 +619,20 @@ public async Task ShouldDetectGitFetch() await TaskManager.Wait(); RepositoryManager.WaitForEvents(); - repositoryManagerEvents.WaitForNotBusy(); - - repositoryManagerEvents.RemoteBranchesUpdated.WaitOne(Timeout).Should().BeTrue(); - repositoryManagerEvents.GitAheadBehindStatusUpdated.WaitOne(Timeout).Should().BeTrue(); - - repositoryManagerListener.Received().OnIsBusyChanged(Args.Bool); - repositoryManagerListener.Received().CurrentBranchUpdated(Args.NullableConfigBranch, Args.NullableConfigRemote); - repositoryManagerListener.Received().GitAheadBehindStatusUpdated(Args.GitAheadBehindStatus); - repositoryManagerListener.DidNotReceive().GitStatusUpdated(Args.GitStatus); - repositoryManagerListener.DidNotReceive().GitLocksUpdated(Args.GitLocks); - repositoryManagerListener.DidNotReceive().GitLogUpdated(Args.GitLogs); - repositoryManagerListener.Received().LocalBranchesUpdated(Args.LocalBranchDictionary); - repositoryManagerListener.Received().RemoteBranchesUpdated(Args.RemoteDictionary, Args.RemoteBranchDictionary); + await repositoryManagerEvents.WaitForNotBusy(); + + // we expect these events + await AssertReceivedEvent(repositoryManagerEvents.LocalBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.RemoteBranchesUpdated); + await AssertReceivedEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertReceivedEvent(repositoryManagerEvents.CurrentBranchUpdated); + + // we don't expect these events + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitStatusUpdated); + // TODO: log should not be getting called, but it is because when branches get changed we're blindly calling log + //await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLogUpdated); + //await AssertDidNotReceiveEvent(repositoryManagerEvents.GitAheadBehindStatusUpdated); + await AssertDidNotReceiveEvent(repositoryManagerEvents.GitLocksUpdated); } finally { diff --git a/src/tests/TestUtils/Events/IRepositoryManagerListener.cs b/src/tests/TestUtils/Events/IRepositoryManagerListener.cs index ec0c4ddce..240996b82 100644 --- a/src/tests/TestUtils/Events/IRepositoryManagerListener.cs +++ b/src/tests/TestUtils/Events/IRepositoryManagerListener.cs @@ -6,6 +6,7 @@ using NSubstitute; using GitHub.Logging; using NUnit.Framework; +using System.Threading.Tasks; namespace TestUtils.Events { @@ -23,33 +24,48 @@ interface IRepositoryManagerListener class RepositoryManagerEvents { - public EventWaitHandle IsBusy { get; } = new AutoResetEvent(false); - public EventWaitHandle IsNotBusy { get; } = new AutoResetEvent(false); - public EventWaitHandle CurrentBranchUpdated { get; } = new AutoResetEvent(false); - public EventWaitHandle GitAheadBehindStatusUpdated { get; } = new AutoResetEvent(false); - public EventWaitHandle GitStatusUpdated { get; } = new AutoResetEvent(false); - public EventWaitHandle GitLocksUpdated { get; } = new AutoResetEvent(false); - public EventWaitHandle GitLogUpdated { get; } = new AutoResetEvent(false); - public EventWaitHandle LocalBranchesUpdated { get; } = new AutoResetEvent(false); - public EventWaitHandle RemoteBranchesUpdated { get; } = new AutoResetEvent(false); + internal TaskCompletionSource isBusy; + public Task IsBusy => isBusy.Task; + internal TaskCompletionSource isNotBusy; + public Task IsNotBusy => isNotBusy.Task; + internal TaskCompletionSource currentBranchUpdated; + public Task CurrentBranchUpdated => currentBranchUpdated.Task; + internal TaskCompletionSource gitAheadBehindStatusUpdated; + public Task GitAheadBehindStatusUpdated => gitAheadBehindStatusUpdated.Task; + internal TaskCompletionSource gitStatusUpdated; + public Task GitStatusUpdated => gitStatusUpdated.Task; + internal TaskCompletionSource gitLocksUpdated; + public Task GitLocksUpdated => gitLocksUpdated.Task; + internal TaskCompletionSource gitLogUpdated; + public Task GitLogUpdated => gitLogUpdated.Task; + internal TaskCompletionSource localBranchesUpdated; + public Task LocalBranchesUpdated => localBranchesUpdated.Task; + internal TaskCompletionSource remoteBranchesUpdated; + public Task RemoteBranchesUpdated => remoteBranchesUpdated.Task; + + + public RepositoryManagerEvents() + { + Reset(); + } public void Reset() { - IsBusy.Reset(); - IsNotBusy.Reset(); - CurrentBranchUpdated.Reset(); - GitAheadBehindStatusUpdated.Reset(); - GitStatusUpdated.Reset(); - GitLocksUpdated.Reset(); - GitLogUpdated.Reset(); - LocalBranchesUpdated.Reset(); - RemoteBranchesUpdated.Reset(); + isBusy = new TaskCompletionSource(); + isNotBusy = new TaskCompletionSource(); + currentBranchUpdated = new TaskCompletionSource(); + gitAheadBehindStatusUpdated = new TaskCompletionSource(); + gitStatusUpdated = new TaskCompletionSource(); + gitLocksUpdated = new TaskCompletionSource(); + gitLogUpdated = new TaskCompletionSource(); + localBranchesUpdated = new TaskCompletionSource(); + remoteBranchesUpdated = new TaskCompletionSource(); } - public void WaitForNotBusy(int seconds = 1) + public async Task WaitForNotBusy(int seconds = 1) { - IsBusy.WaitOne(TimeSpan.FromSeconds(seconds)); - IsNotBusy.WaitOne(TimeSpan.FromSeconds(seconds)); + await TaskEx.WhenAny(IsBusy, TaskEx.Delay(TimeSpan.FromSeconds(seconds))); + await TaskEx.WhenAny(IsNotBusy, TaskEx.Delay(TimeSpan.FromSeconds(seconds))); } } @@ -64,51 +80,51 @@ public static void AttachListener(this IRepositoryManagerListener listener, logger?.Trace("OnIsBusyChanged: {0}", isBusy); listener.OnIsBusyChanged(isBusy); if (isBusy) - managerEvents?.IsBusy.Set(); + managerEvents?.isBusy.TrySetResult(true); else - managerEvents?.IsNotBusy.Set(); + managerEvents?.isNotBusy.TrySetResult(true); }; repositoryManager.CurrentBranchUpdated += (configBranch, configRemote) => { logger?.Trace("CurrentBranchUpdated"); listener.CurrentBranchUpdated(configBranch, configRemote); - managerEvents?.CurrentBranchUpdated.Set(); + managerEvents?.currentBranchUpdated.TrySetResult(true); }; repositoryManager.GitLocksUpdated += gitLocks => { logger?.Trace("GitLocksUpdated"); listener.GitLocksUpdated(gitLocks); - managerEvents?.GitLocksUpdated.Set(); + managerEvents?.gitLocksUpdated.TrySetResult(true); }; repositoryManager.GitAheadBehindStatusUpdated += gitAheadBehindStatus => { logger?.Trace("GitAheadBehindStatusUpdated"); listener.GitAheadBehindStatusUpdated(gitAheadBehindStatus); - managerEvents?.GitAheadBehindStatusUpdated.Set(); + managerEvents?.gitAheadBehindStatusUpdated.TrySetResult(true); }; repositoryManager.GitStatusUpdated += gitStatus => { logger?.Trace("GitStatusUpdated"); listener.GitStatusUpdated(gitStatus); - managerEvents?.GitStatusUpdated.Set(); + managerEvents?.gitStatusUpdated.TrySetResult(true); }; repositoryManager.GitLogUpdated += gitLogEntries => { logger?.Trace("GitLogUpdated"); listener.GitLogUpdated(gitLogEntries); - managerEvents?.GitLogUpdated.Set(); + managerEvents?.gitLogUpdated.TrySetResult(true); }; repositoryManager.LocalBranchesUpdated += branchList => { logger?.Trace("LocalBranchesUpdated"); listener.LocalBranchesUpdated(branchList); - managerEvents?.LocalBranchesUpdated.Set(); + managerEvents?.localBranchesUpdated.TrySetResult(true); }; repositoryManager.RemoteBranchesUpdated += (remotesList, branchList) => { logger?.Trace("RemoteBranchesUpdated"); listener.RemoteBranchesUpdated(remotesList, branchList); - managerEvents?.RemoteBranchesUpdated.Set(); + managerEvents?.remoteBranchesUpdated.TrySetResult(true); }; } diff --git a/src/tests/TestUtils/TestUtils.csproj b/src/tests/TestUtils/TestUtils.csproj index 4dad1fe33..8ae36c41d 100644 --- a/src/tests/TestUtils/TestUtils.csproj +++ b/src/tests/TestUtils/TestUtils.csproj @@ -30,6 +30,10 @@ 4 + + ..\..\..\packages\AsyncBridge.Net35.0.2.3333.0\lib\net35-Client\AsyncBridge.Net35.dll + True + $(SolutionDir)packages\FluentAssertions.2.2.0.0\lib\net35\FluentAssertions.dll True diff --git a/src/tests/TestUtils/packages.config b/src/tests/TestUtils/packages.config index f785ed1a6..3c80d2337 100644 --- a/src/tests/TestUtils/packages.config +++ b/src/tests/TestUtils/packages.config @@ -1,5 +1,6 @@  +