/
SourceWatcher.cs
115 lines (93 loc) · 3.96 KB
/
SourceWatcher.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Timers;
using Giles.Core.AppDomains;
using Giles.Core.Configuration;
using Giles.Core.IO;
using Giles.Core.Runners;
using Giles.Core.Utility;
namespace Giles.Core.Watchers
{
public class SourceWatcher : IDisposable
{
readonly IBuildRunner buildRunner;
readonly Timer buildDelayTimer;
readonly IFileSystem fileSystem;
readonly IFileWatcherFactory fileWatcherFactory;
readonly GilesConfig config;
public List<FileSystemWatcher> FileWatchers { get; set; }
public bool Pause { get; set; }
public SourceWatcher(IBuildRunner buildRunner, IFileSystem fileSystem,
IFileWatcherFactory fileWatcherFactory, GilesConfig config)
{
FileWatchers = new List<FileSystemWatcher>();
this.fileSystem = fileSystem;
this.buildRunner = buildRunner;
this.fileWatcherFactory = fileWatcherFactory;
this.config = config;
buildDelayTimer = new Timer { AutoReset = false, Enabled = false, Interval = config.BuildDelay };
config.PropertyChanged += config_PropertyChanged;
buildDelayTimer.Elapsed += (sender, e) => RunNow();
}
void config_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName != "BuildDelay") return;
var buildDelay = ((GilesConfig) sender).BuildDelay;
buildDelayTimer.Interval = buildDelay;
}
public void Dispose()
{
FileWatchers.ToList().ForEach(x => x.Dispose());
}
public void Watch(string solutionPath, string filter)
{
var solutionFolder = fileSystem.GetDirectoryName(solutionPath);
var fileSystemWatcher = fileWatcherFactory.Build(solutionFolder, filter, ChangeAction, null,
ErrorAction);
fileSystemWatcher.EnableRaisingEvents = true;
fileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite;
fileSystemWatcher.IncludeSubdirectories = true;
FileWatchers.Add(fileSystemWatcher);
}
public void ErrorAction(object sender, ErrorEventArgs e)
{
throw new NotImplementedException();
}
public void ChangeAction(object sender, FileSystemEventArgs e)
{
if (buildDelayTimer.Enabled)
ResetBuildTimer();
else
buildDelayTimer.Enabled = true;
}
void ResetBuildTimer()
{
buildDelayTimer.Enabled = false;
buildDelayTimer.Enabled = true;
}
public Func<GilesConfig, GilesTestListener> GetListener = config => new GilesTestListener(config);
public void RunNow()
{
if (Pause || !buildRunner.Run())
return;
var listener = GetListener.Invoke(config);
var manager = new GilesAppDomainManager();
var runResults = new List<SessionResults>();
var watch = new Stopwatch();
watch.Start();
config.TestAssemblies.Each(assm => runResults.AddRange(manager.Run(assm, config.Filters)));
watch.Stop();
Console.WriteLine("Test run completed in {0} seconds", watch.Elapsed.TotalSeconds);
runResults.Each(result =>
{
result.Messages.Each(m => listener.WriteLine(m, "Output"));
result.TestResults.Each(listener.AddTestSummary);
});
listener.DisplayResults();
LastRunResults.GilesTestListener = listener;
}
}
}