Skip to content

Commit 15061ee

Browse files
committed
Refactor task tests: increment time but do not trigger timers.
1 parent 3ac305e commit 15061ee

File tree

3 files changed

+123
-95
lines changed

3 files changed

+123
-95
lines changed

app/lib/task/backend.dart

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'package:gcloud/storage.dart' show Bucket;
1717
import 'package:googleapis/storage/v1.dart' show DetailedApiRequestError;
1818
import 'package:indexed_blob/indexed_blob.dart' show BlobIndex, FileRange;
1919
import 'package:logging/logging.dart' show Logger;
20+
import 'package:meta/meta.dart';
2021
import 'package:pana/models.dart' show Summary;
2122
import 'package:pool/pool.dart' show Pool;
2223
import 'package:pub_dev/package/api_export/api_exporter.dart';
@@ -128,17 +129,17 @@ class TaskBackend {
128129
final scanLoop = _createLoop(
129130
name: 'scan-packages',
130131
aborted: aborted,
131-
fn: _runOneScanPackagesUpdate,
132+
fn: runOneScanPackagesUpdate,
132133
);
133134
final deleteLoop = _createLoop(
134135
name: 'delete-instances',
135136
aborted: aborted,
136-
fn: _runOneInstanceDeletion,
137+
fn: runOneInstanceDeletion,
137138
);
138139
final createLoop = _createLoop(
139140
name: 'create-instances',
140141
aborted: aborted,
141-
fn: _runOneInstanceCreation,
142+
fn: runOneInstanceCreation,
142143
);
143144

144145
scheduleMicrotask(() async {
@@ -296,9 +297,8 @@ class TaskBackend {
296297
}
297298
}
298299

299-
Future<Duration> _runOneScanPackagesUpdate(
300-
bool Function() isAbortedFn,
301-
) async {
300+
@visibleForTesting
301+
Future<Duration> runOneScanPackagesUpdate(bool Function() isAbortedFn) async {
302302
final next = await runOneScanPackagesUpdatedCycle(
303303
_scanPackagesUpdatedState,
304304
_db.packages.listUpdatedSince(_scanPackagesUpdatedState.since),
@@ -317,7 +317,8 @@ class TaskBackend {
317317
return Duration(minutes: 10); // TODO: consider if we scan more frequently.
318318
}
319319

320-
Future<Duration> _runOneInstanceDeletion(bool Function() isAbortedFn) async {
320+
@visibleForTesting
321+
Future<Duration> runOneInstanceDeletion(bool Function() isAbortedFn) async {
321322
_deleteInstancesState = await runOneDeleteInstancesCycle(
322323
_deleteInstancesState,
323324
taskWorkerCloudCompute,
@@ -327,7 +328,8 @@ class TaskBackend {
327328
return Duration(minutes: 10); // TODO: consider if this should be dynamic
328329
}
329330

330-
Future<Duration> _runOneInstanceCreation(bool Function() isAbortedFn) async {
331+
@visibleForTesting
332+
Future<Duration> runOneInstanceCreation(bool Function() isAbortedFn) async {
331333
final result = await runOneCreateInstancesCycle(
332334
taskWorkerCloudCompute,
333335
_db,
@@ -337,6 +339,14 @@ class TaskBackend {
337339
return result.$2;
338340
}
339341

342+
@visibleForTesting
343+
Future<void> runOneLoopCycle() async {
344+
bool isAbortedFn() => false;
345+
await runOneScanPackagesUpdate(isAbortedFn);
346+
await runOneInstanceDeletion(isAbortedFn);
347+
await runOneInstanceCreation(isAbortedFn);
348+
}
349+
340350
Future<void> trackPackage(
341351
String packageName, {
342352
bool updateDependents = false,

app/lib/task/clock_control.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,31 @@ final class ClockController {
469469
await Future.delayed(Duration(microseconds: 0));
470470
}
471471
}
472+
473+
void incrOffset({int hours = 0, int minutes = 0, int seconds = 0}) {
474+
_offset += Duration(hours: hours, minutes: minutes, seconds: seconds);
475+
}
476+
477+
Future<void> incrUntil(
478+
FutureOr<bool> Function() condition, {
479+
Duration? timeout,
480+
Duration? minimumStep,
481+
}) async {
482+
final deadline = timeout != null ? clock.fromNowBy(timeout) : null;
483+
484+
bool shouldLoop() => deadline == null || clock.now().isBefore(deadline);
485+
486+
while (shouldLoop()) {
487+
if (await condition()) {
488+
return;
489+
}
490+
_offset += minimumStep ?? Duration(minutes: 1);
491+
}
492+
throw TimeoutException(
493+
'Condition given to ClockController.incrUntil was not satisfied'
494+
' before timeout: $timeout',
495+
);
496+
}
472497
}
473498

474499
final class _TravelingTimer {

0 commit comments

Comments
 (0)