|
15 | 15 | package dbus |
16 | 16 |
|
17 | 17 | import ( |
| 18 | + "context" |
18 | 19 | "fmt" |
19 | 20 | "os" |
20 | 21 | "os/exec" |
@@ -1600,3 +1601,59 @@ func TestUnitName(t *testing.T) { |
1600 | 1601 | } |
1601 | 1602 | } |
1602 | 1603 | } |
| 1604 | + |
| 1605 | +func TestFreezer(t *testing.T) { |
| 1606 | + target := "freeze.service" |
| 1607 | + conn := setupConn(t) |
| 1608 | + defer conn.Close() |
| 1609 | + |
| 1610 | + setupUnit(target, conn, t) |
| 1611 | + linkUnit(target, conn, t) |
| 1612 | + |
| 1613 | + reschan := make(chan string) |
| 1614 | + _, err := conn.StartUnit(target, "replace", reschan) |
| 1615 | + if err != nil { |
| 1616 | + t.Fatal(err) |
| 1617 | + } |
| 1618 | + |
| 1619 | + job := <-reschan |
| 1620 | + if job != "done" { |
| 1621 | + t.Fatal("Job is not done:", job) |
| 1622 | + } |
| 1623 | + |
| 1624 | + if err := conn.FreezeUnit(context.Background(), target); err != nil { |
| 1625 | + // Don't fail the test if freezing units is not implemented at all (on older systemd versions) or |
| 1626 | + // not supported (on systems running with cgroup v1). |
| 1627 | + e, ok := err.(dbus.Error) |
| 1628 | + if ok && (e.Name == "org.freedesktop.DBus.Error.UnknownMethod" || e.Name == "org.freedesktop.DBus.Error.NotSupported") { |
| 1629 | + t.SkipNow() |
| 1630 | + } |
| 1631 | + t.Fatalf("failed to freeze unit %s: %s", target, err) |
| 1632 | + } |
| 1633 | + |
| 1634 | + p, err := conn.GetUnitProperty(target, "FreezerState") |
| 1635 | + if err != nil { |
| 1636 | + t.Fatal(err) |
| 1637 | + } |
| 1638 | + |
| 1639 | + v := p.Value.Value().(string) |
| 1640 | + if v != "frozen" { |
| 1641 | + t.Fatalf("unit is not frozen after calling FreezeUnit(), FreezerState=%s", v) |
| 1642 | + } |
| 1643 | + |
| 1644 | + if err := conn.ThawUnit(context.Background(), target); err != nil { |
| 1645 | + t.Fatalf("failed to thaw unit %s: %s", target, err) |
| 1646 | + } |
| 1647 | + |
| 1648 | + p, err = conn.GetUnitProperty(target, "FreezerState") |
| 1649 | + if err != nil { |
| 1650 | + t.Fatal(err) |
| 1651 | + } |
| 1652 | + |
| 1653 | + v = p.Value.Value().(string) |
| 1654 | + if v != "running" { |
| 1655 | + t.Fatalf("unit is not frozen after calling ThawUnit(), FreezerState=%s", v) |
| 1656 | + } |
| 1657 | + |
| 1658 | + runStopUnit(t, conn, TrUnitProp{target, nil}) |
| 1659 | +} |
0 commit comments