// Copyright 2018 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 procfs import ( "testing" "github.com/google/go-cmp/cmp" ) // Whether or not to run tests with inode fixtures. const ( checkInode = true noCheckInode = false ) func TestNetUnix(t *testing.T) { fs, err := NewFS(procTestFixtures) if err != nil { t.Fatalf("failed to open procfs: %v", err) } got, err := fs.NetUNIX() if err != nil { t.Fatalf("failed to get UNIX socket data: %v", err) } testNetUNIX(t, checkInode, got) } func TestNetUnixNoInode(t *testing.T) { fs, err := NewFS(procTestFixtures) if err != nil { t.Fatalf("failed to open procfs: %v", err) } got, err := readNetUNIX(fs.proc.Path("net/unix_without_inode")) if err != nil { t.Fatalf("failed to read UNIX socket data: %v", err) } testNetUNIX(t, noCheckInode, got) } func testNetUNIX(t *testing.T, testInode bool, got *NetUNIX) { t.Helper() // First verify that the input data matches a prepopulated structure. want := []*NetUNIXLine{ { KernelPtr: "0000000000000000", RefCount: 2, Flags: 1 << 16, Type: 1, State: 1, Inode: 3442596, Path: "/var/run/postgresql/.s.PGSQL.5432", }, { KernelPtr: "0000000000000000", RefCount: 10, Flags: 1 << 16, Type: 5, State: 1, Inode: 10061, Path: "/run/udev/control", }, { KernelPtr: "0000000000000000", RefCount: 7, Flags: 0, Type: 2, State: 1, Inode: 12392, Path: "/dev/log", }, { KernelPtr: "0000000000000000", RefCount: 3, Flags: 0, Type: 1, State: 3, Inode: 4787297, Path: "/var/run/postgresql/.s.PGSQL.5432", }, { KernelPtr: "0000000000000000", RefCount: 3, Flags: 0, Type: 1, State: 3, Inode: 5091797, }, } // Enable the fixtures to be used for multiple tests by clearing the inode // field when appropriate. if !testInode { for i := 0; i < len(want); i++ { want[i].Inode = 0 } } if diff := cmp.Diff(want, got.Rows); diff != "" { t.Fatalf("unexpected /proc/net/unix data (-want +got):\n%s", diff) } // Now test the field enumerations and ensure they match up correctly // with the constants used to generate readable strings. wantFlags := []NetUNIXFlags{ netUnixFlagListen, netUnixFlagListen, netUnixFlagDefault, netUnixFlagDefault, netUnixFlagDefault, } wantType := []NetUNIXType{ netUnixTypeStream, netUnixTypeSeqpacket, netUnixTypeDgram, netUnixTypeStream, netUnixTypeStream, } wantState := []NetUNIXState{ netUnixStateUnconnected, netUnixStateUnconnected, netUnixStateUnconnected, netUnixStateConnected, netUnixStateConnected, } var ( gotFlags []NetUNIXFlags gotType []NetUNIXType gotState []NetUNIXState ) for _, r := range got.Rows { gotFlags = append(gotFlags, r.Flags) gotType = append(gotType, r.Type) gotState = append(gotState, r.State) } if diff := cmp.Diff(wantFlags, gotFlags); diff != "" { t.Fatalf("unexpected /proc/net/unix flags (-want +got):\n%s", diff) } if diff := cmp.Diff(wantType, gotType); diff != "" { t.Fatalf("unexpected /proc/net/unix types (-want +got):\n%s", diff) } if diff := cmp.Diff(wantState, gotState); diff != "" { t.Fatalf("unexpected /proc/net/unix states (-want +got):\n%s", diff) } }