scheduler_test.dart 3.92 KB
Newer Older
1 2 3
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
4
import 'dart:async';
5

6
import 'package:flutter/foundation.dart';
7
import 'package:flutter/scheduler.dart';
8
import 'package:flutter/services.dart';
9 10
import 'package:test/test.dart';

11
class TestSchedulerBinding extends BindingBase with ServicesBinding, SchedulerBinding { }
Ian Hickson's avatar
Ian Hickson committed
12

Ian Hickson's avatar
Ian Hickson committed
13
class TestStrategy {
14 15
  int allowedPriority = 10000;

16
  bool shouldRunTaskWithPriority({ int priority, SchedulerBinding scheduler }) {
17 18 19 20 21
    return priority >= allowedPriority;
  }
}

void main() {
22 23 24 25 26
  SchedulerBinding scheduler;
  setUpAll(() {
    scheduler = new TestSchedulerBinding();
  });

Ian Hickson's avatar
Ian Hickson committed
27
  test('Tasks are executed in the right order', () {
28
    final TestStrategy strategy = new TestStrategy();
Ian Hickson's avatar
Ian Hickson committed
29
    scheduler.schedulingStrategy = strategy.shouldRunTaskWithPriority;
30 31
    final List<int> input = <int>[2, 23, 23, 11, 0, 80, 3];
    final List<int> executedTasks = <int>[];
32 33

    void scheduleAddingTask(int x) {
34
      scheduler.scheduleTask(() { executedTasks.add(x); }, Priority.idle + x);
35 36
    }

37
    input.forEach(scheduleAddingTask);
Ian Hickson's avatar
Ian Hickson committed
38

39
    strategy.allowedPriority = 100;
Ian Hickson's avatar
Ian Hickson committed
40
    for (int i = 0; i < 3; i += 1)
41
      expect(scheduler.handleEventLoopCallback(), isFalse);
42 43 44
    expect(executedTasks.isEmpty, isTrue);

    strategy.allowedPriority = 50;
Ian Hickson's avatar
Ian Hickson committed
45
    for (int i = 0; i < 3; i += 1)
46 47
      expect(scheduler.handleEventLoopCallback(), i == 0 ? isTrue : isFalse);
    expect(executedTasks, hasLength(1));
48 49 50 51
    expect(executedTasks.single, equals(80));
    executedTasks.clear();

    strategy.allowedPriority = 20;
Ian Hickson's avatar
Ian Hickson committed
52
    for (int i = 0; i < 3; i += 1)
53 54
      expect(scheduler.handleEventLoopCallback(), i < 2 ? isTrue : isFalse);
    expect(executedTasks, hasLength(2));
55 56 57 58 59 60 61 62
    expect(executedTasks[0], equals(23));
    expect(executedTasks[1], equals(23));
    executedTasks.clear();

    scheduleAddingTask(99);
    scheduleAddingTask(19);
    scheduleAddingTask(5);
    scheduleAddingTask(97);
Ian Hickson's avatar
Ian Hickson committed
63
    for (int i = 0; i < 3; i += 1)
64 65
      expect(scheduler.handleEventLoopCallback(), i < 2 ? isTrue : isFalse);
    expect(executedTasks, hasLength(2));
66 67 68 69 70
    expect(executedTasks[0], equals(99));
    expect(executedTasks[1], equals(97));
    executedTasks.clear();

    strategy.allowedPriority = 10;
Ian Hickson's avatar
Ian Hickson committed
71
    for (int i = 0; i < 3; i += 1)
72 73
      expect(scheduler.handleEventLoopCallback(), i < 2 ? isTrue : isFalse);
    expect(executedTasks, hasLength(2));
74 75 76 77 78
    expect(executedTasks[0], equals(19));
    expect(executedTasks[1], equals(11));
    executedTasks.clear();

    strategy.allowedPriority = 1;
Ian Hickson's avatar
Ian Hickson committed
79
    for (int i = 0; i < 4; i += 1)
80 81
      expect(scheduler.handleEventLoopCallback(), i < 3 ? isTrue : isFalse);
    expect(executedTasks, hasLength(3));
82 83 84 85 86 87
    expect(executedTasks[0], equals(5));
    expect(executedTasks[1], equals(3));
    expect(executedTasks[2], equals(2));
    executedTasks.clear();

    strategy.allowedPriority = 0;
88 89
    expect(scheduler.handleEventLoopCallback(), isFalse);
    expect(executedTasks, hasLength(1));
90 91
    expect(executedTasks[0], equals(0));
  });
92 93 94

  test('2 calls to scheduleWarmUpFrame just schedules it once', () {
    final List<VoidCallback> timerQueueTasks = <VoidCallback>[];
95
    bool taskExecuted = false;
96 97 98 99 100
    runZoned(
      () {
        // Run it twice without processing the queued tasks.
        scheduler.scheduleWarmUpFrame();
        scheduler.scheduleWarmUpFrame();
101
        scheduler.scheduleTask(() { taskExecuted = true; }, Priority.touch);
102 103 104 105 106 107 108 109 110 111
      },
      zoneSpecification: new ZoneSpecification(
        createTimer: (Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f()) {
          // Don't actually run the tasks, just record that it was scheduled.
          timerQueueTasks.add(f);
          return null;
        },
      ),
    );

112 113
    // scheduleWarmUpFrame scheduled 2 Timers, scheduleTask scheduled 0 because
    // events are locked.
114
    expect(timerQueueTasks.length, 2);
115
    expect(taskExecuted, false);
116
  });
117
}