forked from dotnet/runtime
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFileSystemWatcher.Unix.cs
More file actions
66 lines (60 loc) · 2.71 KB
/
FileSystemWatcher.Unix.cs
File metadata and controls
66 lines (60 loc) · 2.71 KB
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
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.DotNet.XUnitExtensions;
using Microsoft.DotNet.RemoteExecutor;
using Xunit;
using Xunit.Abstractions;
namespace System.IO.Tests
{
public partial class DangerousFileSystemWatcherTests
{
[ConditionalFact]
[OuterLoop("Slow test with significant resource usage.")]
public void FileSystemWatcher_Unix_DoesNotLeak()
{
Interop.Sys.GetRLimit(Interop.Sys.RlimitResources.RLIMIT_NOFILE, out Interop.Sys.RLimit limits);
_output.WriteLine("File descriptor limit is {0}", limits.CurrentLimit);
_output.WriteLine($"Starting 100/200 test on {TestDirectory}");
RemoteInvokeOptions options = new RemoteInvokeOptions { TimeOut = 600_000 };
RemoteExecutor.Invoke(testDirectory =>
{
ulong maxFd = 200;
int count = 100;
Interop.Sys.RLimit limits = new Interop.Sys.RLimit { CurrentLimit = maxFd, MaximumLimit = maxFd};
// Set open file limit to given value.
Assert.Equal(0, Interop.Sys.SetRLimit(Interop.Sys.RlimitResources.RLIMIT_NOFILE, ref limits));
Assert.Equal(0, Interop.Sys.GetRLimit(Interop.Sys.RlimitResources.RLIMIT_NOFILE, out limits));
Assert.Equal(maxFd, limits.CurrentLimit);
try
{
for (int i = 0; i < count; i++)
{
using (var watcher = new FileSystemWatcher(testDirectory))
{
watcher.Created += (s, e) => { } ;
watcher.EnableRaisingEvents = true;
}
}
}
catch (Exception e)
{
// If we use all handles we may not have luck writing out errors.
// Try our best here. _output is not available within RemoteExec().
// When we run out of fd, exception may be weird from OutOfMem to "unable load type".
Console.WriteLine($"Test failed for count={count}, limit={maxFd} and path='{testDirectory}'.");
Console.WriteLine(e.Message);
return 1;
}
return RemoteExecutor.SuccessExitCode;
}, TestDirectory, options).Dispose();
}
}
}