Skip to content

Commit e9db94e

Browse files
fix Scheduler tests
1 parent e78ec9c commit e9db94e

File tree

10 files changed

+32
-53
lines changed

10 files changed

+32
-53
lines changed

Alchemy/Queue/Queue.swift

+4
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ public final class Queue: IdentifiedService {
99
/// The default channel to dispatch jobs on for all queues.
1010
public static var defaultChannel = "default"
1111

12+
/// The number of workers on this queue.
13+
public var workers: Int
14+
1215
/// The provider backing this queue.
1316
private let provider: QueueProvider
1417

1518
/// Initialize a queue backed by the given provider.
1619
public init(provider: QueueProvider) {
1720
self.provider = provider
21+
self.workers = 0
1822
}
1923

2024
/// Enqueues a generic `Job` to this queue on the given channel.

Alchemy/Queue/QueueWorker.swift

+1
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ extension Queue {
9191
public func startWorker(for channels: [String] = [Queue.defaultChannel],
9292
pollRate: Duration = .seconds(1),
9393
untilEmpty: Bool = true) {
94+
workers += 1
9495
Life.addService(
9596
QueueWorker(
9697
queue: self,

Alchemy/Scheduler/Commands/ScheduleCommand.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ struct ScheduleCommand: Command {
66

77
func run() async throws {
88
Schedule.start()
9-
try await gracefulShutdown()
9+
try await Life.runServices()
1010
}
1111
}

Alchemy/Scheduler/Frequency.swift

+1-4
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,7 @@ public final class Frequency: AsyncSequence {
183183
let frequency: Frequency
184184

185185
public mutating func next() async throws -> Foundation.Date? {
186-
guard let delay = frequency.timeUntilNext() else {
187-
return nil
188-
}
189-
186+
guard let delay = frequency.timeUntilNext() else { return nil }
190187
try await Task.sleep(for: delay)
191188
return Date()
192189
}

Alchemy/Scheduler/Scheduler.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import ServiceLifecycle
77
/// A service for scheduling recurring work, in lieu of a separate cron task
88
/// running apart from your server.
99
public final class Scheduler {
10-
private struct Task: Service, @unchecked Sendable {
10+
struct Task: Service, @unchecked Sendable {
1111
let name: String
1212
let frequency: Frequency
1313
let task: () async throws -> Void
@@ -29,10 +29,12 @@ public final class Scheduler {
2929
}
3030
}
3131

32-
private var tasks: [Task] = []
32+
var isStarted = false
33+
var tasks: [Task] = []
3334

3435
/// Start scheduling.
3536
public func start() {
37+
isStarted = true
3638
Log.info("Scheduling \(tasks.count) tasks.")
3739
for task in tasks {
3840
Life.addService(task)

Tests/HTTP/Commands/ServeCommandTests.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ final class ServeCommandTests: TestCase<TestApp> {
1010
}
1111

1212
func testServe() async throws {
13+
let exp = expectation(description: "")
14+
Schedule.task { exp.fulfill() }.everySecond()
1315
app.get("/foo", use: { _ in "hello" })
1416
app.background("--port", "3000")
1517
try await Http.get("http://127.0.0.1:3000/foo")
1618
.assertBody("hello")
1719

18-
XCTAssertEqual(Q.workers.count, 0)
20+
XCTAssertEqual(Q.workers, 0)
1921
XCTAssertFalse(Schedule.isStarted)
2022
}
2123

@@ -25,7 +27,7 @@ final class ServeCommandTests: TestCase<TestApp> {
2527
try await Http.get("http://127.0.0.1:3000/foo")
2628
.assertBody("hello")
2729

28-
XCTAssertEqual(Q.workers.count, 2)
30+
XCTAssertEqual(Q.workers, 2)
2931
XCTAssertTrue(Schedule.isStarted)
3032
}
3133
}

Tests/Queues/Commands/WorkCommandTests.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ final class WorkCommandTests: TestCase<TestApp> {
1414
// wait for services to boot up
1515
try await Task.sleep(for: .milliseconds(10))
1616

17-
XCTAssertEqual(Q.workers.count, 5)
17+
XCTAssertEqual(Q.workers, 5)
1818
XCTAssertFalse(Schedule.isStarted)
1919
}
2020

@@ -25,8 +25,8 @@ final class WorkCommandTests: TestCase<TestApp> {
2525
// wait for services to boot up
2626
try await Task.sleep(for: .milliseconds(10))
2727

28-
XCTAssertEqual(Q.workers.count, 0)
29-
XCTAssertEqual(Q("a").workers.count, 5)
28+
XCTAssertEqual(Q.workers, 0)
29+
XCTAssertEqual(Q("a").workers, 5)
3030
XCTAssertFalse(Schedule.isStarted)
3131
}
3232

@@ -36,7 +36,7 @@ final class WorkCommandTests: TestCase<TestApp> {
3636
// wait for services to boot up
3737
try await Task.sleep(for: .milliseconds(10))
3838

39-
XCTAssertEqual(Q.workers.count, 3)
39+
XCTAssertEqual(Q.workers, 3)
4040
XCTAssertTrue(Schedule.isStarted)
4141
}
4242
}

Tests/Queues/QueueTests.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ final class QueueTests: TestCase<TestApp> {
8484
try await ConfirmableJob().dispatch()
8585

8686
let loop = EmbeddedEventLoop()
87-
Q.startWorker(on: loop)
87+
Q.startWorker()
8888
loop.advanceTime(by: .seconds(5))
8989

9090
await fulfillment(of: [exp], timeout: kMinTimeout)
@@ -96,7 +96,7 @@ final class QueueTests: TestCase<TestApp> {
9696
try await FailureJob().dispatch()
9797

9898
let loop = EmbeddedEventLoop()
99-
Q.startWorker(on: loop)
99+
Q.startWorker()
100100
loop.advanceTime(by: .seconds(5))
101101

102102
await fulfillment(of: [exp], timeout: kMinTimeout)
@@ -109,7 +109,7 @@ final class QueueTests: TestCase<TestApp> {
109109
try await RetryJob(foo: "bar").dispatch()
110110

111111
let loop = EmbeddedEventLoop()
112-
Q.startWorker(untilEmpty: false, on: loop)
112+
Q.startWorker(untilEmpty: false)
113113
loop.advanceTime(by: .seconds(5))
114114
await fulfillment(of: [exp], timeout: kMinTimeout)
115115

Tests/Scheduler/FrequencyTests.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ final class FrequencyTests: XCTestCase {
7373
return
7474
}
7575

76-
XCTAssertGreaterThan(next, .hours(24 * 365 * 10))
76+
XCTAssertGreaterThan(next, .seconds(60 * 60 * 24 * 365 * 10))
7777
}
7878

7979
func testNoNext() {

Tests/Scheduler/SchedulerTests.swift

+9-36
Original file line numberDiff line numberDiff line change
@@ -4,64 +4,37 @@ import AlchemyTest
44
import NIOEmbedded
55

66
final class SchedulerTests: TestCase<TestApp> {
7-
private var scheduler = Scheduler()
8-
private var loop = EmbeddedEventLoop()
97
private var queue = Queue.fake()
108

119
override func setUp() {
1210
super.setUp()
13-
self.scheduler = Scheduler()
14-
self.loop = EmbeddedEventLoop()
1511
self.queue = Queue.fake()
1612
}
1713

1814
func testScheduleTask() {
19-
makeSchedule().everyDay()
20-
scheduler.start(on: loop)
21-
loop.advanceTime(by: .hours(24))
22-
waitForExpectations(timeout: 0.1)
15+
makeSchedule().everySecond()
16+
app.background("schedule")
17+
waitForExpectations(timeout: 2)
2318
}
2419

2520
func testScheduleJob() async throws {
26-
scheduler.job(TestJob()).everyDay()
27-
scheduler.start(on: loop)
28-
loop.advanceTime(by: .hours(24))
29-
try await Task.sleep(nanoseconds: 1 * 1_000_000)
21+
Schedule.job(TestJob()).everySecond()
22+
app.background("schedule")
23+
try await Task.sleep(for: .seconds(1))
3024
await queue.assertPushed(TestJob.self)
3125
}
3226

33-
func testNoRunWithoutStart() {
34-
makeSchedule(invertExpect: true).everyDay()
35-
waitForExpectations(timeout: kMinTimeout)
36-
}
37-
38-
func testStart() {
39-
makeSchedule().everyDay()
40-
scheduler.start(on: loop)
41-
loop.advanceTime(by: .hours(24))
42-
waitForExpectations(timeout: kMinTimeout)
43-
}
44-
45-
func testStartTwiceRunsOnce() {
46-
makeSchedule().everyDay()
47-
scheduler.start(on: loop)
48-
scheduler.start(on: loop)
49-
loop.advanceTime(by: .hours(24))
50-
waitForExpectations(timeout: kMinTimeout)
51-
}
52-
5327
func testDoesntRunNoNext() {
5428
makeSchedule(invertExpect: true).cron("0 0 0 11 9 * 1993")
55-
scheduler.start(on: loop)
56-
loop.advanceTime(by: .hours(24))
57-
waitForExpectations(timeout: kMinTimeout)
29+
app.background("schedule")
30+
waitForExpectations(timeout: 2)
5831
}
5932

6033
private func makeSchedule(invertExpect: Bool = false) -> Frequency {
6134
let exp = expectation(description: "")
6235
exp.isInverted = invertExpect
6336
var didRun = false
64-
return scheduler.task {
37+
return Schedule.task {
6538
// Don't let the schedule fullfill this expectation twice.
6639
guard !didRun else { return }
6740
didRun = true

0 commit comments

Comments
 (0)