| // META: script=/resources/test-only-api.js |
| // META: script=resources/pressure-helpers.js |
| // META: global=window,dedicatedworker,sharedworker |
| |
| 'use strict'; |
| |
| pressure_test(async (t, mockPressureService) => { |
| const [change, timeOrigin] = await new Promise(resolve => { |
| const observer = new PressureObserver(change => { |
| resolve([change, performance.timeOrigin]); |
| }); |
| t.add_cleanup(() => observer.disconnect()); |
| observer.observe('cpu'); |
| mockPressureService.setPressureUpdate('cpu', 'critical'); |
| mockPressureService.startPlatformCollector(/*sampleInterval=*/ 200); |
| }); |
| assert_greater_than(change[0].time, timeOrigin); |
| }, 'Timestamp from update should be greater than timeOrigin'); |
| |
| pressure_test(async (t, mockPressureService) => { |
| const readings = ['nominal', 'fair', 'serious', 'critical']; |
| |
| const sampleInterval = 250; |
| const pressureChanges = []; |
| const observer = new PressureObserver(changes => { |
| pressureChanges.push(changes); |
| }); |
| observer.observe('cpu', {sampleInterval}); |
| |
| mockPressureService.startPlatformCollector(sampleInterval / 2); |
| let i = 0; |
| // mockPressureService.updatesDelivered() does not necessarily match |
| // pressureChanges.length, as system load and browser optimizations can |
| // cause the actual timer used by mockPressureService to deliver readings |
| // to be a bit slower or faster than requested. |
| while (pressureChanges.length < 4) { |
| mockPressureService.setPressureUpdate( |
| 'cpu', readings[i++ % readings.length]); |
| await t.step_wait( |
| () => mockPressureService.updatesDelivered() >= i, |
| `At least ${i} readings have been delivered`); |
| } |
| observer.disconnect(); |
| |
| assert_equals(pressureChanges.length, 4); |
| assert_greater_than(pressureChanges[1][0].time, pressureChanges[0][0].time); |
| assert_greater_than(pressureChanges[2][0].time, pressureChanges[1][0].time); |
| assert_greater_than(pressureChanges[3][0].time, pressureChanges[2][0].time); |
| }, 'Timestamp difference between two changes should be continuously increasing'); |
| |
| pressure_test(async (t, mockPressureService) => { |
| const readings = ['nominal', 'fair', 'serious', 'critical']; |
| |
| const sampleInterval = 250; |
| const pressureChanges = []; |
| const observer = new PressureObserver(change => { |
| pressureChanges.push(change); |
| }); |
| observer.observe('cpu', {sampleInterval}); |
| |
| mockPressureService.startPlatformCollector(sampleInterval / 2); |
| let i = 0; |
| // mockPressureService.updatesDelivered() does not necessarily match |
| // pressureChanges.length, as system load and browser optimizations can |
| // cause the actual timer used by mockPressureService to deliver readings |
| // to be a bit slower or faster than requested. |
| while (pressureChanges.length < 4) { |
| mockPressureService.setPressureUpdate( |
| 'cpu', readings[i++ % readings.length]); |
| await t.step_wait( |
| () => mockPressureService.updatesDelivered() >= i, |
| `At least ${i} readings have been delivered`); |
| } |
| observer.disconnect(); |
| |
| assert_equals(pressureChanges.length, 4); |
| assert_greater_than_equal( |
| pressureChanges[1][0].time - pressureChanges[0][0].time, sampleInterval); |
| assert_greater_than_equal( |
| pressureChanges[2][0].time - pressureChanges[1][0].time, sampleInterval); |
| assert_greater_than_equal( |
| pressureChanges[3][0].time - pressureChanges[2][0].time, sampleInterval); |
| }, 'Faster collector: Timestamp difference between two changes should be higher or equal to the observer sample rate'); |
| |
| pressure_test(async (t, mockPressureService) => { |
| const pressureChanges = []; |
| const sampleInterval = 1000; |
| const observer = new PressureObserver(changes => { |
| pressureChanges.push(changes); |
| }); |
| |
| await new Promise(async resolve => { |
| observer.observe('cpu', {sampleInterval}); |
| mockPressureService.setPressureUpdate('cpu', 'critical'); |
| mockPressureService.startPlatformCollector(sampleInterval); |
| await t.step_wait(() => pressureChanges.length == 1); |
| observer.disconnect(); |
| resolve(); |
| }); |
| |
| await new Promise(async resolve => { |
| observer.observe('cpu'); |
| mockPressureService.setPressureUpdate('cpu', 'serious'); |
| mockPressureService.startPlatformCollector(sampleInterval / 4); |
| await t.step_wait(() => pressureChanges.length == 2); |
| observer.disconnect(); |
| resolve(); |
| }); |
| |
| assert_equals(pressureChanges.length, 2); |
| // When disconnect() is called, PressureRecord in [[LastRecordMap]] for cpu |
| // should be deleted. So the second PressureRecord is not discarded even |
| // though the time interval does not meet the requirement. |
| assert_less_than( |
| (pressureChanges[1][0].time - pressureChanges[0][0].time), |
| sampleInterval); |
| }, 'disconnect() should update [[LastRecordMap]]'); |