|
1 | 1 | using System; |
2 | | -using System.Collections.Generic; |
3 | 2 | using System.Linq; |
4 | 3 | using Microsoft.Azure.Functions.Worker; |
5 | 4 | using Microsoft.Extensions.Logging; |
6 | 5 | using Microsoft.OneFuzz.Service; |
7 | 6 | using Microsoft.OneFuzz.Service.Functions; |
8 | | -using Moq; |
| 7 | +using NSubstitute; |
9 | 8 | using Xunit; |
10 | 9 | namespace Tests; |
11 | 10 |
|
12 | 11 | public class TimerReproTests { |
13 | 12 | private readonly ILogger<TimerRepro> _log; |
14 | | - private readonly Mock<IOnefuzzContext> _mockCtx; |
15 | | - private readonly Mock<IReproOperations> _mockReproOperations; |
| 13 | + private readonly IOnefuzzContext _mockCtx; |
| 14 | + private readonly IReproOperations _mockReproOperations; |
16 | 15 |
|
17 | 16 | public TimerReproTests() { |
18 | | - _mockCtx = new Mock<IOnefuzzContext>(); |
19 | 17 |
|
20 | | - _mockReproOperations = new Mock<IReproOperations>(); |
| 18 | + _mockReproOperations = Substitute.For<IReproOperations>(); |
| 19 | + _mockReproOperations.SearchExpired().Returns(AsyncEnumerable.Empty<Repro>()); |
| 20 | + _mockReproOperations.SearchStates(VmStateHelper.NeedsWork).Returns(AsyncEnumerable.Empty<Repro>()); |
21 | 21 |
|
22 | | - _mockReproOperations.Setup(x => x.SearchExpired()) |
23 | | - .Returns(AsyncEnumerable.Empty<Repro>()); |
24 | | - _mockReproOperations.Setup(x => x.SearchStates(VmStateHelper.NeedsWork)) |
25 | | - .Returns(AsyncEnumerable.Empty<Repro>()); |
| 22 | + _mockCtx = Substitute.For<IOnefuzzContext>(); |
| 23 | + _mockCtx.ReproOperations.Returns(_mockReproOperations); |
26 | 24 |
|
27 | | - _log = new Mock<ILogger<TimerRepro>>().Object; |
| 25 | + _log = Substitute.For<ILogger<TimerRepro>>(); |
28 | 26 | } |
29 | 27 |
|
30 | 28 | [Fact] |
31 | 29 | public async System.Threading.Tasks.Task NoExpiredRepros() { |
32 | | - _mockReproOperations.Setup(x => x.SearchExpired()) |
33 | | - .Returns(AsyncEnumerable.Empty<Repro>()); |
34 | | - |
35 | | - _mockCtx.Setup(x => x.ReproOperations) |
36 | | - .Returns(_mockReproOperations.Object); |
37 | 30 |
|
38 | | - var timerRepro = new TimerRepro(_log, _mockCtx.Object); |
| 31 | + var timerRepro = new TimerRepro(_log, _mockCtx); |
39 | 32 | await timerRepro.Run(new TimerInfo()); |
40 | 33 |
|
41 | | - _mockReproOperations.Verify(x => x.Stopping(It.IsAny<Repro>()), Times.Never()); |
| 34 | + _ = await _mockReproOperations.DidNotReceive().Stopping(Arg.Any<Repro>()); |
42 | 35 | } |
43 | 36 |
|
44 | 37 | [Fact] |
45 | 38 | public async System.Threading.Tasks.Task ExpiredRepro() { |
46 | | - _mockReproOperations.Setup(x => x.SearchExpired()) |
47 | | - .Returns(new List<Repro> { |
48 | | - GenerateRepro() |
49 | | - }.ToAsyncEnumerable()); |
| 39 | + _mockReproOperations.SearchExpired() |
| 40 | + .Returns(new[] { GenerateRepro() }.ToAsyncEnumerable()); |
50 | 41 |
|
51 | | - _mockCtx.Setup(x => x.ReproOperations) |
52 | | - .Returns(_mockReproOperations.Object); |
53 | | - |
54 | | - var timerRepro = new TimerRepro(_log, _mockCtx.Object); |
| 42 | + var timerRepro = new TimerRepro(_log, _mockCtx); |
55 | 43 | await timerRepro.Run(new TimerInfo()); |
56 | 44 |
|
57 | | - _mockReproOperations.Verify(x => x.Stopping(It.IsAny<Repro>()), Times.Once()); |
| 45 | + _ = await _mockReproOperations.Received().Stopping(Arg.Any<Repro>()); |
58 | 46 | } |
59 | 47 |
|
60 | 48 | [Fact] |
61 | 49 | public async System.Threading.Tasks.Task NoNeedsWorkRepros() { |
62 | | - _mockReproOperations.Setup(x => x.SearchStates(VmStateHelper.NeedsWork)) |
| 50 | + _mockReproOperations.SearchStates(VmStateHelper.NeedsWork) |
63 | 51 | .Returns(AsyncEnumerable.Empty<Repro>()); |
64 | 52 |
|
65 | | - _mockCtx.Setup(x => x.ReproOperations) |
66 | | - .Returns(_mockReproOperations.Object); |
67 | | - |
68 | | - var timerRepro = new TimerRepro(_log, _mockCtx.Object); |
| 53 | + var timerRepro = new TimerRepro(_log, _mockCtx); |
69 | 54 | await timerRepro.Run(new TimerInfo()); |
70 | 55 |
|
71 | | - _mockReproOperations.Verify(x => x.ProcessStateUpdates(It.IsAny<Repro>(), It.IsAny<int>()), Times.Never()); |
| 56 | + _ = await _mockReproOperations.DidNotReceive().ProcessStateUpdates(Arg.Any<Repro>(), Arg.Any<int>()); |
72 | 57 | } |
73 | 58 |
|
74 | 59 | [Fact] |
75 | 60 | public async System.Threading.Tasks.Task DontProcessExpiredVms() { |
76 | 61 | var expiredVm = GenerateRepro(); |
77 | 62 | var notExpiredVm = GenerateRepro(); |
78 | 63 |
|
79 | | - _mockReproOperations.Setup(x => x.SearchExpired()) |
80 | | - .Returns(new List<Repro> { |
81 | | - expiredVm |
82 | | - }.ToAsyncEnumerable()); |
83 | | - |
84 | | - _mockReproOperations.Setup(x => x.SearchStates(VmStateHelper.NeedsWork)) |
85 | | - .Returns(new List<Repro> { |
86 | | - expiredVm, |
87 | | - notExpiredVm |
88 | | - }.ToAsyncEnumerable()); |
| 64 | + _mockReproOperations.SearchExpired() |
| 65 | + .Returns(new[] { expiredVm }.ToAsyncEnumerable()); |
89 | 66 |
|
90 | | - _mockCtx.Setup(x => x.ReproOperations) |
91 | | - .Returns(_mockReproOperations.Object); |
| 67 | + _mockReproOperations.SearchStates(VmStateHelper.NeedsWork) |
| 68 | + .Returns(new[] { expiredVm, notExpiredVm }.ToAsyncEnumerable()); |
92 | 69 |
|
93 | | - var timerRepro = new TimerRepro(_log, _mockCtx.Object); |
| 70 | + var timerRepro = new TimerRepro(_log, _mockCtx); |
94 | 71 | await timerRepro.Run(new TimerInfo()); |
95 | 72 |
|
96 | | - _mockReproOperations.Verify(x => x.ProcessStateUpdates(It.IsAny<Repro>(), It.IsAny<int>()), Times.Once()); |
| 73 | + _ = await _mockReproOperations.Received().ProcessStateUpdates(Arg.Any<Repro>(), Arg.Any<int>()); |
97 | 74 | } |
98 | 75 |
|
99 | 76 | private static Repro GenerateRepro() { |
|
0 commit comments