Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: NixOS/nixpkgs
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 426c513c14c1
Choose a base ref
...
head repository: NixOS/nixpkgs
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 814b38541f66
Choose a head ref
  • 2 commits
  • 1 file changed
  • 2 contributors

Commits on Jan 2, 2018

  1. test-driver: support testing user units

    It is quite complicated to test services using the test-driver when
    declaring user services with `systemd.user.services` such as many
    X11-based services like `xautolock.service`.
    
    This change adds an optional `$user` parameter to each systemd-related
    function in the test-driver and runs `systemctl --user` commands using
    `su -l $user -c ...` and sets the `XDG_RUNTIME_DIR` variable
    accordingly and a new function named `systemctl` which is able to run a
    systemd command with or without a specified user.
    
    The change can be confirmed with a simple VM declaration like this:
    
    ```
    import ./nixos/tests/make-test.nix ({ pkgs, lib }:
    
    with lib;
    
    {
      name = "systemd-user-test";
    
      nodes.machine = {
        imports = [ ./nixos/tests/common/user-account.nix ];
    
        services.xserver.enable = true;
        services.xserver.displayManager.auto.enable = true;
        services.xserver.displayManager.auto.user = "bob";
        services.xserver.xautolock.enable = true;
      };
    
      testScript = ''
        $machine->start;
        $machine->waitForX;
    
        $machine->waitForUnit("xautolock.service", "bob");
        $machine->stopJob("xautolock.service", "bob");
        $machine->startJob("xautolock.service", "bob");
        $machine->systemctl("list-jobs --no-pager", "bob");
        $machine->systemctl("show 'xautolock.service' --no-pager", "bob");
      '';
    })
    ```
    Ma27 committed Jan 2, 2018

    Verified

    This commit was signed with the committer’s verified signature. The key has expired.
    Ma27 Maximilian Bosch
    Copy the full SHA
    e538e00 View commit details

Commits on Jan 4, 2018

  1. Merge pull request #32845 from Ma27/test-driver/allow-user-units

    test-driver: support testing user units
    Mic92 authored Jan 4, 2018

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    814b385 View commit details
Showing with 19 additions and 9 deletions.
  1. +19 −9 nixos/lib/test-driver/Machine.pm
28 changes: 19 additions & 9 deletions nixos/lib/test-driver/Machine.pm
Original file line number Diff line number Diff line change
@@ -362,8 +362,8 @@ sub mustFail {


sub getUnitInfo {
my ($self, $unit) = @_;
my ($status, $lines) = $self->execute("systemctl --no-pager show '$unit'");
my ($self, $unit, $user) = @_;
my ($status, $lines) = $self->systemctl("--no-pager show \"$unit\"", $user);
return undef if $status != 0;
my $info = {};
foreach my $line (split '\n', $lines) {
@@ -373,6 +373,16 @@ sub getUnitInfo {
return $info;
}

sub systemctl {
my ($self, $q, $user) = @_;
if ($user) {
$q =~ s/'/\\'/g;
return $self->execute("su -l $user -c \$'XDG_RUNTIME_DIR=/run/user/`id -u` systemctl --user $q'");
}

return $self->execute("systemctl $q");
}

# Fail if the given systemd unit is not in the "active" state.
sub requireActiveUnit {
my ($self, $unit) = @_;
@@ -387,16 +397,16 @@ sub requireActiveUnit {

# Wait for a systemd unit to reach the "active" state.
sub waitForUnit {
my ($self, $unit) = @_;
my ($self, $unit, $user) = @_;
$self->nest("waiting for unit ‘$unit", sub {
retry sub {
my $info = $self->getUnitInfo($unit);
my $info = $self->getUnitInfo($unit, $user);
my $state = $info->{ActiveState};
die "unit ‘$unit’ reached state ‘$state\n" if $state eq "failed";
if ($state eq "inactive") {
# If there are no pending jobs, then assume this unit
# will never reach active state.
my ($status, $jobs) = $self->execute("systemctl list-jobs --full 2>&1");
my ($status, $jobs) = $self->systemctl("list-jobs --full 2>&1", $user);
if ($jobs =~ /No jobs/) { # FIXME: fragile
# Handle the case where the unit may have started
# between the previous getUnitInfo() and
@@ -430,14 +440,14 @@ sub waitForFile {
}

sub startJob {
my ($self, $jobName) = @_;
$self->execute("systemctl start $jobName");
my ($self, $jobName, $user) = @_;
$self->systemctl("start $jobName", $user);
# FIXME: check result
}

sub stopJob {
my ($self, $jobName) = @_;
$self->execute("systemctl stop $jobName");
my ($self, $jobName, $user) = @_;
$self->systemctl("stop $jobName", $user);
}