blob: b333e743f673e42093294ade6077401d47f14601 [file] [log] [blame]
// Copyright 2021 Google LLC
//
// 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.
package systemd
import (
"errors"
"fmt"
"testing"
)
const systemctlCmd = "testdata/systemctl.sh"
func TestIsUnitActiveRunning(t *testing.T) {
tests := []struct {
name string
unitName string
cmdStdout []byte
isActive bool
cmdErr error
expectActiveRunning bool
expectError bool
}{
{
name: "UnitIsActiveRunning",
unitName: "stackdriver-logging.service",
cmdStdout: []byte("ActiveState=active\nSubState=running\n"),
isActive: true,
cmdErr: nil,
expectActiveRunning: true,
expectError: false,
},
{
name: "UnitIsActiveNotRunning",
unitName: "node-problem-detector.service",
cmdStdout: []byte("ActiveState=active\nSubState=starting\n"),
isActive: true,
cmdErr: nil,
expectActiveRunning: true,
expectError: false,
},
{
name: "UnitIsInactiveNotRunning",
unitName: "node-problem-detector.service",
cmdStdout: []byte("ActiveState=inactive\nSubState=dead\n"),
isActive: false,
cmdErr: nil,
expectActiveRunning: false,
expectError: false,
},
{
name: "UnitIsFailed",
unitName: "node-problem-detector.service",
cmdStdout: []byte("ActiveState=failed\nSubState=failed\n"),
isActive: false,
cmdErr: nil,
expectActiveRunning: false,
expectError: false,
},
{
name: "UnitIsActivating",
unitName: "node-problem-detector.service",
cmdStdout: []byte("ActiveState=activating\nSubState=starting\n"),
isActive: false,
cmdErr: nil,
expectActiveRunning: false,
expectError: false,
},
{
name: "NotExistUnit",
unitName: "thisisnotaunit.nonunit",
cmdStdout: []byte("ActiveState=inactive\nSubState=dead\n"),
isActive: false,
cmdErr: nil,
expectActiveRunning: false,
expectError: false,
},
{
name: "IgnoreOutputWhenCommandFailed",
unitName: "node-problem-detector.service",
cmdStdout: []byte("ActiveState=active\nSubState=running\n"),
isActive: true,
cmdErr: errors.New("Some error."),
expectActiveRunning: false,
expectError: true,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
systemdClient := NewSystemdClient(systemctlCmd)
unitName := fmt.Sprintf("%s,%t,%v", test.unitName, test.isActive, test.cmdErr)
activeRunning, err := systemdClient.IsUnitActiveRunning(unitName)
if activeRunning != test.expectActiveRunning {
t.Errorf("got ActiveState %v, expect to have ActiveState %v",
activeRunning, test.expectActiveRunning)
}
if err != nil && !test.expectError {
t.Errorf("got unexpected error: %v", err)
} else if err == nil && test.expectError {
t.Error("didn't get expected error")
}
})
}
}
func TestStartUnit(t *testing.T) {
tests := []struct {
name string
unitName string
cmdErr error
expectError bool
}{
{
name: "StartSuccess",
unitName: "stackdriver-logging.service",
cmdErr: nil,
expectError: false,
},
{
name: "WontReportFailureWhenServiceFailedToStart",
unitName: "failed-to-start.service",
cmdErr: nil,
expectError: false,
},
{
name: "UnitIsAlreadyStarted",
unitName: "already-started.service",
cmdErr: nil,
expectError: false,
},
{
name: "WrongUnitName",
unitName: "thisisnotaunit.nonunit",
cmdErr: errors.New("exit status 5"),
expectError: true,
},
{
name: "SystemctlError",
unitName: "node-problem-detector.service",
cmdErr: errors.New("Some error."),
expectError: true,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
systemdClient := NewSystemdClient(systemctlCmd)
unitName := fmt.Sprintf("%v,%v", test.unitName, test.cmdErr)
err := systemdClient.StartUnit(unitName)
if err != nil && !test.expectError {
t.Errorf("got unexpected error: %v", err)
} else if err == nil && test.expectError {
t.Error("didn't get expected error")
}
})
}
}
func TestStopUnit(t *testing.T) {
tests := []struct {
name string
unitName string
cmdErr error
expectError bool
}{
{
name: "StopSuccess",
unitName: "stackdriver-logging.service",
cmdErr: nil,
expectError: false,
},
{
name: "ReportFailureWhenServiceFailedToStop",
unitName: "stackdriver-logging.service",
cmdErr: errors.New("exit status 137"),
expectError: true,
},
{
name: "UnitIsAlreadyStopped",
unitName: "already-stopped.service",
cmdErr: nil,
expectError: false,
},
{
name: "WrongUnitName",
unitName: "thisisnotaunit.nonunit",
cmdErr: errors.New("exit status 5"),
expectError: true,
},
{
name: "SystemctlError",
unitName: "node-problem-detector.service",
cmdErr: errors.New("Some error."),
expectError: true,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
systemdClient := NewSystemdClient(systemctlCmd)
unitName := fmt.Sprintf("%v,%v", test.unitName, test.cmdErr)
err := systemdClient.StopUnit(unitName)
if err != nil && !test.expectError {
t.Errorf("got unexpected error: %v", err)
} else if err == nil && test.expectError {
t.Error("didn't get expected error")
}
})
}
}