Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit a445e84

Browse files
authored
Merge pull request #274 from github/fixes/integration-test-speed
Improve integration test performance
2 parents a038764 + ab49bb3 commit a445e84

File tree

5 files changed

+350
-88
lines changed

5 files changed

+350
-88
lines changed

src/GitHub.Api/Events/RepositoryWatcher.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,11 @@ private void HandleEventInDotGit(Event fileEvent, NPath fileA, NPath fileB = nul
213213

214214
if (fileEvent.Type == EventType.DELETED)
215215
{
216+
if (fileA.ExtensionWithDot == ".lock")
217+
{
218+
return;
219+
}
220+
216221
var branch = string.Join(@"/", relativePathElements.Skip(1).ToArray());
217222

218223
Logger.Trace("RemoteBranchDeleted: {0}/{1}", origin, branch);

src/IntegrationTests/Events/RepositoryManagerTests.cs

Lines changed: 60 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Threading;
34
using FluentAssertions;
45
using GitHub.Unity;
@@ -16,8 +17,10 @@ public void ShouldDetectFileChanges()
1617
{
1718
InitializeEnvironment(TestRepoMasterCleanSynchronized);
1819

20+
var managerAutoResetEvent = new RepositoryManagerAutoResetEvent();
21+
1922
var repositoryManagerListener = Substitute.For<IRepositoryManagerListener>();
20-
repositoryManagerListener.AttachListener(RepositoryManager);
23+
repositoryManagerListener.AttachListener(RepositoryManager, managerAutoResetEvent);
2124

2225
var expected = new GitStatus {
2326
Behind = 1,
@@ -38,7 +41,7 @@ public void ShouldDetectFileChanges()
3841
var foobarTxt = TestRepoMasterCleanSynchronized.Combine("foobar.txt");
3942
foobarTxt.WriteAllText("foobar");
4043

41-
Thread.Sleep(4000);
44+
managerAutoResetEvent.OnRepositoryChanged.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue();
4245

4346
Logger.Trace("Continue test");
4447

@@ -53,17 +56,17 @@ public void ShouldDetectFileChanges()
5356
repositoryManagerListener.DidNotReceive().OnRemoteBranchListChanged();
5457
repositoryManagerListener.DidNotReceive().OnRemoteOrTrackingChanged();
5558
repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock);
56-
57-
//Assert.AreEqual(3, repositoryManagerListener.ReceivedCalls().Count());
5859
}
5960

6061
[Test]
6162
public void ShouldAddAndCommitFiles()
6263
{
6364
InitializeEnvironment(TestRepoMasterCleanSynchronized);
6465

66+
var managerAutoResetEvent = new RepositoryManagerAutoResetEvent();
67+
6568
var repositoryManagerListener = Substitute.For<IRepositoryManagerListener>();
66-
repositoryManagerListener.AttachListener(RepositoryManager);
69+
repositoryManagerListener.AttachListener(RepositoryManager, managerAutoResetEvent);
6770

6871
var expectedAfterChanges = new GitStatus {
6972
Behind = 1,
@@ -87,11 +90,9 @@ public void ShouldAddAndCommitFiles()
8790
Entries = new List<GitStatusEntry>()
8891
};
8992

90-
ManualResetEvent evt = new ManualResetEvent(false);
9193
var result = new GitStatus();
9294
RepositoryManager.OnRepositoryChanged += status => {
9395
result = status;
94-
evt.Set();
9596
};
9697

9798
Logger.Trace("Issuing Changes");
@@ -102,8 +103,7 @@ public void ShouldAddAndCommitFiles()
102103
var testDocumentTxt = TestRepoMasterCleanSynchronized.Combine("Assets", "TestDocument.txt");
103104
testDocumentTxt.WriteAllText("foobar");
104105

105-
Assert.True(evt.WaitOne(5000));
106-
evt.Reset();
106+
managerAutoResetEvent.OnRepositoryChanged.WaitOne(TimeSpan.FromSeconds(5)).Should().BeTrue();
107107

108108
Logger.Trace("Continue test");
109109

@@ -126,13 +126,10 @@ public void ShouldAddAndCommitFiles()
126126
RepositoryManager.CommitFiles(new TaskResultDispatcher<string>(s => { }),
127127
new List<string>() { "Assets\\TestDocument.txt", "foobar.txt" }, "IntegrationTest Commit", string.Empty);
128128

129-
Assert.True(evt.WaitOne(5000));
130-
evt.Reset();
129+
managerAutoResetEvent.OnActiveBranchChanged.WaitOne(TimeSpan.FromSeconds(5)).Should().BeTrue();
131130

132131
Logger.Trace("Continue test");
133132

134-
result.AssertEqual(expectedAfterCommit);
135-
136133
repositoryManagerListener.Received(1).OnActiveBranchChanged();
137134
repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged();
138135
repositoryManagerListener.DidNotReceive().OnHeadChanged();
@@ -147,8 +144,10 @@ public void ShouldDetectBranchChange()
147144
{
148145
InitializeEnvironment(TestRepoMasterCleanSynchronized);
149146

147+
var managerAutoResetEvent = new RepositoryManagerAutoResetEvent();
148+
150149
var repositoryManagerListener = Substitute.For<IRepositoryManagerListener>();
151-
repositoryManagerListener.AttachListener(RepositoryManager);
150+
repositoryManagerListener.AttachListener(RepositoryManager, managerAutoResetEvent);
152151

153152
var expected = new GitStatus {
154153
LocalBranch = "feature/document",
@@ -163,7 +162,9 @@ public void ShouldDetectBranchChange()
163162

164163
RepositoryManager.SwitchBranch(new TaskResultDispatcher<string>(s => { }), "feature/document");
165164

166-
Thread.Sleep(3000);
165+
managerAutoResetEvent.OnRepositoryChanged.WaitOne(TimeSpan.FromSeconds(3)).Should().BeTrue();
166+
managerAutoResetEvent.OnActiveBranchChanged.WaitOne(TimeSpan.FromSeconds(3)).Should().BeTrue();
167+
managerAutoResetEvent.OnHeadChanged.WaitOne(TimeSpan.FromSeconds(3)).Should().BeTrue();
167168

168169
Logger.Trace("Continue test");
169170

@@ -184,14 +185,17 @@ public void ShouldDetectBranchDelete()
184185
{
185186
InitializeEnvironment(TestRepoMasterCleanSynchronized);
186187

188+
var managerAutoResetEvent = new RepositoryManagerAutoResetEvent();
189+
187190
var repositoryManagerListener = Substitute.For<IRepositoryManagerListener>();
188-
repositoryManagerListener.AttachListener(RepositoryManager);
191+
repositoryManagerListener.AttachListener(RepositoryManager, managerAutoResetEvent);
189192

190193
Logger.Trace("Issuing Command");
191194

192195
RepositoryManager.DeleteBranch(new TaskResultDispatcher<string>(s => { }), "feature/document", true);
193196

194-
Thread.Sleep(2000);
197+
managerAutoResetEvent.OnLocalBranchListChanged.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue();
198+
managerAutoResetEvent.OnRemoteOrTrackingChanged.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue();
195199

196200
Logger.Trace("Continue test");
197201

@@ -211,15 +215,17 @@ public void ShouldDetectBranchCreate()
211215
{
212216
InitializeEnvironment(TestRepoMasterCleanSynchronized);
213217

218+
var managerAutoResetEvent = new RepositoryManagerAutoResetEvent();
219+
214220
var repositoryManagerListener = Substitute.For<IRepositoryManagerListener>();
215-
repositoryManagerListener.AttachListener(RepositoryManager);
221+
repositoryManagerListener.AttachListener(RepositoryManager, managerAutoResetEvent);
216222

217223
Logger.Trace("Issuing Command");
218224

219225
RepositoryManager.CreateBranch(new TaskResultDispatcher<string>(s => { }), "feature/document2",
220226
"feature/document");
221227

222-
Thread.Sleep(2000);
228+
managerAutoResetEvent.OnLocalBranchListChanged.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue();
223229

224230
Logger.Trace("Continue test");
225231

@@ -240,7 +246,7 @@ public void ShouldDetectBranchCreate()
240246
RepositoryManager.CreateBranch(new TaskResultDispatcher<string>(s => { }), "feature2/document2",
241247
"feature/document");
242248

243-
Thread.Sleep(1000);
249+
managerAutoResetEvent.OnLocalBranchListChanged.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue();
244250

245251
Logger.Trace("Continue test");
246252

@@ -261,14 +267,18 @@ public void ShouldDetectChangesToRemotes()
261267
{
262268
InitializeEnvironment(TestRepoMasterCleanSynchronized);
263269

270+
var managerAutoResetEvent = new RepositoryManagerAutoResetEvent();
271+
264272
var repositoryManagerListener = Substitute.For<IRepositoryManagerListener>();
265-
repositoryManagerListener.AttachListener(RepositoryManager);
273+
repositoryManagerListener.AttachListener(RepositoryManager, managerAutoResetEvent);
266274

267275
Logger.Trace("Issuing Command");
268276

269277
RepositoryManager.RemoteRemove(new TaskResultDispatcher<string>(s => { }), "origin");
270278

271-
Thread.Sleep(2000);
279+
managerAutoResetEvent.OnActiveBranchChanged.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue();
280+
managerAutoResetEvent.OnActiveRemoteChanged.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue();
281+
managerAutoResetEvent.OnRemoteOrTrackingChanged.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue();
272282

273283
Logger.Trace("Continue test");
274284

@@ -289,7 +299,8 @@ public void ShouldDetectChangesToRemotes()
289299
RepositoryManager.RemoteAdd(new TaskResultDispatcher<string>(s => { }), "origin",
290300
"https://github.com/EvilStanleyGoldman/IOTestsRepo.git");
291301

292-
Thread.Sleep(2000);
302+
managerAutoResetEvent.OnActiveRemoteChanged.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue();
303+
managerAutoResetEvent.OnRemoteOrTrackingChanged.WaitOne(TimeSpan.FromSeconds(2)).Should().BeTrue();
293304

294305
Logger.Trace("Continue test");
295306

@@ -309,8 +320,10 @@ public void ShouldDetectGitPull()
309320
{
310321
InitializeEnvironment(TestRepoMasterCleanSynchronized);
311322

323+
var managerAutoResetEvent = new RepositoryManagerAutoResetEvent();
324+
312325
var repositoryManagerListener = Substitute.For<IRepositoryManagerListener>();
313-
repositoryManagerListener.AttachListener(RepositoryManager);
326+
repositoryManagerListener.AttachListener(RepositoryManager, managerAutoResetEvent);
314327

315328
var expected = new GitStatus {
316329
LocalBranch = "master",
@@ -325,16 +338,20 @@ public void ShouldDetectGitPull()
325338

326339
RepositoryManager.Pull(new TaskResultDispatcher<string>(s => { }), "origin", "master");
327340

328-
Thread.Sleep(7000);
341+
managerAutoResetEvent.OnRepositoryChanged.WaitOne(TimeSpan.FromSeconds(7)).Should().BeTrue();
342+
managerAutoResetEvent.OnActiveBranchChanged.WaitOne(TimeSpan.FromSeconds(7)).Should().BeTrue();
329343

330-
Logger.Trace("Continue test");
344+
WaitForNotBusy(managerAutoResetEvent, 3);
345+
WaitForNotBusy(managerAutoResetEvent, 3);
331346

332-
repositoryManagerListener.Received().OnRepositoryChanged(Args.GitStatus);
333-
result.AssertEqual(expected);
347+
Logger.Trace("Continue test");
334348

335349
repositoryManagerListener.ReceivedWithAnyArgs().OnIsBusyChanged(Args.Bool);
336350
RepositoryManager.IsBusy.Should().BeFalse();
337351

352+
repositoryManagerListener.Received().OnRepositoryChanged(Args.GitStatus);
353+
result.AssertEqual(expected);
354+
338355
repositoryManagerListener.Received(1).OnActiveBranchChanged();
339356
repositoryManagerListener.DidNotReceive().OnActiveRemoteChanged();
340357
repositoryManagerListener.DidNotReceive().OnHeadChanged();
@@ -349,14 +366,17 @@ public void ShouldDetectGitFetch()
349366
{
350367
InitializeEnvironment(TestRepoMasterCleanUnsynchronized);
351368

369+
var managerAutoResetEvent = new RepositoryManagerAutoResetEvent();
370+
352371
var repositoryManagerListener = Substitute.For<IRepositoryManagerListener>();
353-
repositoryManagerListener.AttachListener(RepositoryManager);
372+
repositoryManagerListener.AttachListener(RepositoryManager, managerAutoResetEvent);
354373

355374
Logger.Trace("Issuing Command");
356375

357376
RepositoryManager.Fetch(new TaskResultDispatcher<string>(s => { }), "origin");
358377

359-
Thread.Sleep(3000);
378+
managerAutoResetEvent.OnRemoteBranchListChanged.WaitOne(TimeSpan.FromSeconds(3)).Should().BeTrue();
379+
managerAutoResetEvent.OnRemoteBranchListChanged.WaitOne(TimeSpan.FromSeconds(3)).Should().BeTrue();
360380

361381
Logger.Trace("Continue test");
362382

@@ -370,5 +390,14 @@ public void ShouldDetectGitFetch()
370390
repositoryManagerListener.DidNotReceive().OnRemoteOrTrackingChanged();
371391
repositoryManagerListener.DidNotReceive().OnLocksUpdated(Args.EnumerableGitLock);
372392
}
393+
394+
private void WaitForNotBusy(RepositoryManagerAutoResetEvent managerAutoResetEvent, int seconds = 1)
395+
{
396+
if (RepositoryManager.IsBusy)
397+
{
398+
Logger.Trace("Waiting for activity", seconds);
399+
managerAutoResetEvent.OnIsBusyChanged.WaitOne(TimeSpan.FromSeconds(seconds));
400+
}
401+
}
373402
}
374403
}

0 commit comments

Comments
 (0)