// Copyright 2016 CoreOS, Inc. // // 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 daemon import ( "os" "strconv" "testing" "time" ) func must(err error) { if err != nil { panic(err) } } func TestSdWatchdogEnabled(t *testing.T) { mypid := strconv.Itoa(os.Getpid()) tests := []struct { usec string // empty => unset pid string // empty => unset unsetEnv bool // arbitrarily set across testcases werr bool wdelay time.Duration }{ // Success cases {"100", mypid, true, false, 100 * time.Microsecond}, {"50", mypid, true, false, 50 * time.Microsecond}, {"1", mypid, false, false, 1 * time.Microsecond}, {"1", "", true, false, 1 * time.Microsecond}, // No-op cases {"", mypid, true, false, 0}, // WATCHDOG_USEC not set {"1", "0", false, false, 0}, // WATCHDOG_PID doesn't match {"", "", true, false, 0}, // Both not set // Failure cases {"-1", mypid, true, true, 0}, // Negative USEC {"string", "1", false, true, 0}, // Non-integer USEC value {"1", "string", true, true, 0}, // Non-integer PID value {"stringa", "stringb", false, true, 0}, // E v e r y t h i n g {"-10239", "-eleventythree", true, true, 0}, // i s w r o n g } for i, tt := range tests { if tt.usec != "" { must(os.Setenv("WATCHDOG_USEC", tt.usec)) } else { must(os.Unsetenv("WATCHDOG_USEC")) } if tt.pid != "" { must(os.Setenv("WATCHDOG_PID", tt.pid)) } else { must(os.Unsetenv("WATCHDOG_PID")) } delay, err := SdWatchdogEnabled(tt.unsetEnv) if tt.werr && err == nil { t.Errorf("#%d: want non-nil err, got nil", i) } else if !tt.werr && err != nil { t.Errorf("#%d: want nil err, got %v", i, err) } if tt.wdelay != delay { t.Errorf("#%d: want delay=%d, got %d", i, tt.wdelay, delay) } if tt.unsetEnv && (os.Getenv("WATCHDOG_PID") != "" || os.Getenv("WATCHDOG_USEC") != "") { t.Errorf("#%d: environment variables not cleaned up", i) } } }