diff --git a/collector/helper.go b/collector/helper.go index 2bf461e7..df5cd26c 100644 --- a/collector/helper.go +++ b/collector/helper.go @@ -14,6 +14,7 @@ package collector import ( + "bytes" "io/ioutil" "strconv" "strings" @@ -30,3 +31,16 @@ func readUintFromFile(path string) (uint64, error) { } return value, nil } + +// Take a []byte{} and return a string based on null termination. +// This is useful for situations where the OS has returned a null terminated +// string to use. +// If this function happens to receive a byteArray that contains no nulls, we +// simply convert the array to a string with no bounding. +func bytesToString(byteArray []byte) string { + n := bytes.IndexByte(byteArray, 0) + if n < 0 { + return string(byteArray) + } + return string(byteArray[:n]) +} diff --git a/collector/helper_test.go b/collector/helper_test.go new file mode 100644 index 00000000..48a4f7c4 --- /dev/null +++ b/collector/helper_test.go @@ -0,0 +1,63 @@ +// 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. + +package collector + +import ( + "testing" +) + +func TestBytesToString(t *testing.T) { + tests := []struct { + name string + b []byte + expected string + }{ + { + "Single null byte", + []byte{0}, + "", + }, + { + "Empty byte array", + []byte{}, + "", + }, + { + "Not null terminated", + []byte{65, 66, 67}, + "ABC", + }, + { + "Null randomly in array", + []byte{65, 66, 67, 0, 65, 0, 65}, + "ABC", + }, + { + "Array starts with null and contains other valid bytes", + []byte{0, 65, 66, 67, 0}, + "", + }, + } + + for _, tt := range tests { + name := tt.name + b := tt.b + result := bytesToString(b) + expected := tt.expected + + if result != expected { + t.Errorf("bytesToString(%#v): Name: %s, expected %#v, got %#v)", b, name, expected, result) + } + } +}