diff --git a/prometheus/helper.go b/prometheus/helper.go new file mode 100644 index 000000000..43945f51a --- /dev/null +++ b/prometheus/helper.go @@ -0,0 +1,37 @@ +// Copyright 2020 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. + +package prometheus + +import ( + "fmt" + "io/ioutil" + "strconv" + "strings" +) + +// NewPidFileFn create a function which could get pid from specified file +func NewPidFileFn(pidFilePath string) func() (int, error) { + return func() (int, error) { + content, err := ioutil.ReadFile(pidFilePath) + if err != nil { + return 0, fmt.Errorf("can't read pid file %s with error: %+v", pidFilePath, err) + } + value, err := strconv.Atoi(strings.TrimSpace(string(content))) + if err != nil { + return 0, fmt.Errorf("can't parse pid file %s with error: %+v", pidFilePath, err) + } + + return value, nil + } +} diff --git a/prometheus/helper_test.go b/prometheus/helper_test.go new file mode 100644 index 000000000..858b84370 --- /dev/null +++ b/prometheus/helper_test.go @@ -0,0 +1,93 @@ +// Copyright 2020 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. + +package prometheus + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "testing" +) + +func fileExist(path string) bool { + _, err := os.Lstat(path) + return !os.IsNotExist(err) +} + +func cleanMockPidFile(pidFilePath string) { + if fileExist(pidFilePath) { + os.Remove(pidFilePath) + } +} + +// TestNewPidFileFn ... +func TestNewPidFileFn(t *testing.T) { + folderPath, err := os.Getwd() + if err != nil { + t.Error("failed to get current path") + } + mockPidFilePath := filepath.Join(folderPath, "mockPidFile") + defer cleanMockPidFile(mockPidFilePath) + + testCases := []struct { + mockPidFile func() + expectedErrPrefix string + expectedPid int + desc string + }{ + { + mockPidFile: func() { + cleanMockPidFile(mockPidFilePath) + }, + expectedErrPrefix: fmt.Sprintf("can't read pid file %s", mockPidFilePath), + expectedPid: 0, + desc: "no existed pid file", + }, + { + mockPidFile: func() { + cleanMockPidFile(mockPidFilePath) + f, _ := os.Create(mockPidFilePath) + f.Write([]byte("abc")) + f.Close() + }, + expectedErrPrefix: fmt.Sprintf("can't parse pid file %s", mockPidFilePath), + expectedPid: 0, + desc: "existed pid file, error pid number", + }, + { + mockPidFile: func() { + cleanMockPidFile(mockPidFilePath) + f, _ := os.Create(mockPidFilePath) + f.Write([]byte("123")) + f.Close() + }, + expectedErrPrefix: "", + expectedPid: 123, + desc: "existed pid file, correct pid number", + }, + } + + for _, tc := range testCases { + fn := NewPidFileFn(mockPidFilePath) + if fn == nil { + t.Error("Should not get nil PidFileFn") + } + tc.mockPidFile() + + if pid, err := fn(); pid != tc.expectedPid || (err != nil && !strings.HasPrefix(err.Error(), tc.expectedErrPrefix)) { + t.Error(tc.desc) + } + } +}