2024-05-10 17:28:41 +00:00
|
|
|
import ./make-test-python.nix ({ lib, pkgs, firefoxPackage, ... }:
|
2022-07-09 00:40:24 +00:00
|
|
|
{
|
2023-10-22 14:13:50 +00:00
|
|
|
name = firefoxPackage.pname;
|
|
|
|
|
2021-01-10 19:08:30 +00:00
|
|
|
meta = with pkgs.lib.maintainers; {
|
2024-04-21 07:15:22 +00:00
|
|
|
maintainers = [ shlevy ];
|
2015-07-12 10:09:40 +00:00
|
|
|
};
|
2010-01-05 14:12:51 +00:00
|
|
|
|
2022-03-20 23:15:30 +00:00
|
|
|
nodes.machine =
|
2018-07-20 20:56:59 +00:00
|
|
|
{ pkgs, ... }:
|
2010-01-05 14:12:51 +00:00
|
|
|
|
2013-09-04 11:05:09 +00:00
|
|
|
{ imports = [ ./common/x11.nix ];
|
2023-10-22 14:13:50 +00:00
|
|
|
environment.systemPackages = [ pkgs.xdotool ];
|
|
|
|
|
|
|
|
programs.firefox = {
|
|
|
|
enable = true;
|
|
|
|
preferences."media.autoplay.default" = 0;
|
|
|
|
package = firefoxPackage;
|
|
|
|
};
|
2020-10-31 17:24:11 +00:00
|
|
|
|
|
|
|
# Create a virtual sound device, with mixing
|
|
|
|
# and all, for recording audio.
|
|
|
|
boot.kernelModules = [ "snd-aloop" ];
|
|
|
|
sound.enable = true;
|
|
|
|
sound.extraConfig = ''
|
|
|
|
pcm.!default {
|
|
|
|
type plug
|
|
|
|
slave.pcm pcm.dmixer
|
|
|
|
}
|
|
|
|
pcm.dmixer {
|
|
|
|
type dmix
|
|
|
|
ipc_key 1
|
|
|
|
slave {
|
|
|
|
pcm "hw:Loopback,0,0"
|
|
|
|
rate 48000
|
|
|
|
periods 128
|
|
|
|
period_time 0
|
|
|
|
period_size 1024
|
|
|
|
buffer_size 8192
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pcm.recorder {
|
|
|
|
type hw
|
|
|
|
card "Loopback"
|
|
|
|
device 1
|
|
|
|
subdevice 0
|
|
|
|
}
|
|
|
|
'';
|
|
|
|
|
|
|
|
systemd.services.audio-recorder = {
|
|
|
|
description = "Record NixOS test audio to /tmp/record.wav";
|
2021-06-10 07:27:31 +00:00
|
|
|
script = "${pkgs.alsa-utils}/bin/arecord -D recorder -f S16_LE -r48000 /tmp/record.wav";
|
2020-10-31 17:24:11 +00:00
|
|
|
};
|
|
|
|
|
2010-01-05 14:12:51 +00:00
|
|
|
};
|
|
|
|
|
2023-10-22 14:13:50 +00:00
|
|
|
testScript = let
|
2024-05-10 17:28:41 +00:00
|
|
|
exe = lib.getExe firefoxPackage;
|
2023-10-22 14:13:50 +00:00
|
|
|
in ''
|
2020-10-31 17:24:11 +00:00
|
|
|
from contextlib import contextmanager
|
|
|
|
|
|
|
|
|
|
|
|
@contextmanager
|
2022-06-06 11:29:09 +00:00
|
|
|
def record_audio(machine: Machine):
|
2020-10-31 17:24:11 +00:00
|
|
|
"""
|
|
|
|
Perform actions while recording the
|
|
|
|
machine audio output.
|
|
|
|
"""
|
|
|
|
machine.systemctl("start audio-recorder")
|
|
|
|
yield
|
|
|
|
machine.systemctl("stop audio-recorder")
|
|
|
|
|
|
|
|
|
2022-06-06 11:29:09 +00:00
|
|
|
def wait_for_sound(machine: Machine):
|
2020-10-31 17:24:11 +00:00
|
|
|
"""
|
|
|
|
Wait until any sound has been emitted.
|
|
|
|
"""
|
|
|
|
machine.wait_for_file("/tmp/record.wav")
|
|
|
|
while True:
|
|
|
|
# Get at most 2M of the recording
|
|
|
|
machine.execute("tail -c 2M /tmp/record.wav > /tmp/last")
|
|
|
|
# Get the exact size
|
|
|
|
size = int(machine.succeed("stat -c '%s' /tmp/last").strip())
|
|
|
|
# Compare it against /dev/zero using `cmp` (skipping 50B of WAVE header).
|
|
|
|
# If some non-NULL bytes are found it returns 1.
|
|
|
|
status, output = machine.execute(
|
|
|
|
f"cmp -i 50 -n {size - 50} /tmp/last /dev/zero 2>&1"
|
|
|
|
)
|
|
|
|
if status == 1:
|
|
|
|
break
|
|
|
|
machine.sleep(2)
|
|
|
|
|
|
|
|
|
2019-11-05 15:27:07 +00:00
|
|
|
machine.wait_for_x()
|
|
|
|
|
2020-10-31 17:24:11 +00:00
|
|
|
with subtest("Wait until Firefox has finished loading the Valgrind docs page"):
|
2019-11-05 15:27:07 +00:00
|
|
|
machine.execute(
|
2023-10-22 14:13:50 +00:00
|
|
|
"xterm -e '${exe} file://${pkgs.valgrind.doc}/share/doc/valgrind/html/index.html' >&2 &"
|
2019-11-05 15:27:07 +00:00
|
|
|
)
|
|
|
|
machine.wait_for_window("Valgrind")
|
|
|
|
machine.sleep(40)
|
|
|
|
|
2020-10-31 17:24:11 +00:00
|
|
|
with subtest("Check whether Firefox can play sound"):
|
2022-06-06 11:29:09 +00:00
|
|
|
with record_audio(machine):
|
2020-10-31 17:24:11 +00:00
|
|
|
machine.succeed(
|
2023-10-22 14:13:50 +00:00
|
|
|
"${exe} file://${pkgs.sound-theme-freedesktop}/share/sounds/freedesktop/stereo/phone-incoming-call.oga >&2 &"
|
2020-10-31 17:24:11 +00:00
|
|
|
)
|
|
|
|
wait_for_sound(machine)
|
|
|
|
machine.copy_from_vm("/tmp/record.wav")
|
|
|
|
|
|
|
|
with subtest("Close sound test tab"):
|
|
|
|
machine.execute("xdotool key ctrl+w")
|
|
|
|
|
2019-11-05 15:27:07 +00:00
|
|
|
with subtest("Close default browser prompt"):
|
|
|
|
machine.execute("xdotool key space")
|
|
|
|
|
2020-10-31 17:24:11 +00:00
|
|
|
with subtest("Wait until Firefox draws the developer tool panel"):
|
2019-11-05 15:27:07 +00:00
|
|
|
machine.sleep(10)
|
|
|
|
machine.succeed("xwininfo -root -tree | grep Valgrind")
|
|
|
|
machine.screenshot("screen")
|
2010-01-05 14:12:51 +00:00
|
|
|
'';
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2014-04-14 12:02:44 +00:00
|
|
|
})
|