|
|
|
// Copyright 2015 The Prometheus Authors
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
//go:build !nosystemd
|
|
|
|
// +build !nosystemd
|
|
|
|
|
|
|
|
package collector
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
"log/slog"
|
|
|
|
"regexp"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/coreos/go-systemd/v22/dbus"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Creates mock UnitLists
|
|
|
|
func getUnitListFixtures() [][]unit {
|
|
|
|
fixture1 := []unit{
|
|
|
|
{
|
|
|
|
UnitStatus: dbus.UnitStatus{
|
|
|
|
Name: "foo",
|
|
|
|
Description: "foo desc",
|
|
|
|
LoadState: "loaded",
|
|
|
|
ActiveState: "active",
|
|
|
|
SubState: "running",
|
|
|
|
Followed: "",
|
|
|
|
Path: "/org/freedesktop/systemd1/unit/foo",
|
|
|
|
JobId: 0,
|
|
|
|
JobType: "",
|
|
|
|
JobPath: "/",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
UnitStatus: dbus.UnitStatus{
|
|
|
|
Name: "bar",
|
|
|
|
Description: "bar desc",
|
|
|
|
LoadState: "not-found",
|
|
|
|
ActiveState: "inactive",
|
|
|
|
SubState: "dead",
|
|
|
|
Followed: "",
|
|
|
|
Path: "/org/freedesktop/systemd1/unit/bar",
|
|
|
|
JobId: 0,
|
|
|
|
JobType: "",
|
|
|
|
JobPath: "/",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
UnitStatus: dbus.UnitStatus{
|
|
|
|
Name: "foobar",
|
|
|
|
Description: "bar desc",
|
|
|
|
LoadState: "not-found",
|
|
|
|
ActiveState: "inactive",
|
|
|
|
SubState: "dead",
|
|
|
|
Followed: "",
|
|
|
|
Path: "/org/freedesktop/systemd1/unit/bar",
|
|
|
|
JobId: 0,
|
|
|
|
JobType: "",
|
|
|
|
JobPath: "/",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
UnitStatus: dbus.UnitStatus{
|
|
|
|
Name: "baz",
|
|
|
|
Description: "bar desc",
|
|
|
|
LoadState: "not-found",
|
|
|
|
ActiveState: "inactive",
|
|
|
|
SubState: "dead",
|
|
|
|
Followed: "",
|
|
|
|
Path: "/org/freedesktop/systemd1/unit/bar",
|
|
|
|
JobId: 0,
|
|
|
|
JobType: "",
|
|
|
|
JobPath: "/",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
fixture2 := []unit{}
|
|
|
|
|
|
|
|
return [][]unit{fixture1, fixture2}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSystemdIgnoreFilter(t *testing.T) {
|
|
|
|
fixtures := getUnitListFixtures()
|
|
|
|
includePattern := regexp.MustCompile("^foo$")
|
|
|
|
excludePattern := regexp.MustCompile("^bar$")
|
|
|
|
filtered := filterUnits(fixtures[0], includePattern, excludePattern, slog.New(slog.NewTextHandler(io.Discard, nil)))
|
|
|
|
for _, unit := range filtered {
|
|
|
|
if excludePattern.MatchString(unit.Name) || !includePattern.MatchString(unit.Name) {
|
|
|
|
t.Error(unit.Name, "should not be in the filtered list")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func TestSystemdIgnoreFilterDefaultKeepsAll(t *testing.T) {
|
|
|
|
logger := slog.New(slog.NewTextHandler(io.Discard, nil))
|
|
|
|
c, err := NewSystemdCollector(logger)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
fixtures := getUnitListFixtures()
|
|
|
|
collector := c.(*systemdCollector)
|
|
|
|
filtered := filterUnits(fixtures[0], collector.systemdUnitIncludePattern, collector.systemdUnitExcludePattern, logger)
|
|
|
|
// Adjust fixtures by 3 "not-found" units.
|
|
|
|
if len(filtered) != len(fixtures[0])-3 {
|
|
|
|
t.Error("Default filters removed units")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSystemdSummary(t *testing.T) {
|
|
|
|
fixtures := getUnitListFixtures()
|
|
|
|
summary := summarizeUnits(fixtures[0])
|
|
|
|
|
|
|
|
for _, state := range unitStatesName {
|
|
|
|
if state == "inactive" {
|
|
|
|
testSummaryHelper(t, state, summary[state], 3.0)
|
|
|
|
} else if state == "active" {
|
|
|
|
testSummaryHelper(t, state, summary[state], 1.0)
|
|
|
|
} else {
|
|
|
|
testSummaryHelper(t, state, summary[state], 0.0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func testSummaryHelper(t *testing.T, state string, actual float64, expected float64) {
|
|
|
|
if actual != expected {
|
|
|
|
t.Errorf("Summary mode didn't count %s jobs correctly. Actual: %f, expected: %f", state, actual, expected)
|
|
|
|
}
|
|
|
|
}
|