diff --git a/pcp/utils.go b/pcp/utils.go index 3ae300c..7da7813 100644 --- a/pcp/utils.go +++ b/pcp/utils.go @@ -41,6 +41,7 @@ func AverageNodePowerHistory(history *ring.Ring) float64 { return 0.0 } + // TODO (pkaushik) handle cases when DRAM power is not being monitored. count /= 4 // Two PKGs, two DRAM for all nodes currently. return (total / count) diff --git a/pcp/utils_test.go b/pcp/utils_test.go new file mode 100644 index 0000000..6b9e645 --- /dev/null +++ b/pcp/utils_test.go @@ -0,0 +1,49 @@ +// Copyright (C) 2018 spdf +// +// This file is part of Elektron. +// +// Elektron is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Elektron is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Elektron. If not, see . +// + +package pcp + +import ( + "container/ring" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestAverageNodePowerHistory(t *testing.T) { + // Creating a ring to hold 5 seconds of node power readings. + // Note that as we're considering both CPU and DRAM packages, this amounts to 20 entries + // in the ring. + nodePowerRecordings := ring.New(20) + for i := 1; i <= 20; i++ { + nodePowerRecordings.Value = float64(i) + nodePowerRecordings = nodePowerRecordings.Next() + } + + assert.Equal(t, 42.0, AverageNodePowerHistory(nodePowerRecordings)) +} + +func TestAverageClusterPowerHistory(t *testing.T) { + // Creating a ring to hold 5 seconds of cluster power consumption. + clusterPowerRecordings := ring.New(5) + for i := 1; i <= 5; i++ { + clusterPowerRecordings.Value = float64(i) + clusterPowerRecordings = clusterPowerRecordings.Next() + } + + assert.Equal(t, 3.0, AverageClusterPowerHistory(clusterPowerRecordings)) +} diff --git a/pcp/victim_test.go b/pcp/victim_test.go new file mode 100644 index 0000000..93deed7 --- /dev/null +++ b/pcp/victim_test.go @@ -0,0 +1,50 @@ +// Copyright (C) 2018 spdf +// +// This file is part of Elektron. +// +// Elektron is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Elektron is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Elektron. If not, see . +// + +package pcp + +import ( + "github.com/stretchr/testify/assert" + "sort" + "testing" +) + +// TestVictimSorter tests whether victim nodes are sorted in the non-increasing +// order of Watts consumption. +func TestVictimSorter(t *testing.T) { + victims := []Victim{ + {Watts: 10.0, Host: "host1"}, + {Watts: 20.0, Host: "host2"}, + {Watts: 30.0, Host: "host3"}, + {Watts: 40.0, Host: "host4"}, + } + + sort.Sort(VictimSorter(victims)) + + expectedVictimsOrder := []Victim{ + {Watts: 40.0, Host: "host4"}, + {Watts: 30.0, Host: "host3"}, + {Watts: 20.0, Host: "host2"}, + {Watts: 10.0, Host: "host1"}, + } + + for i, v := range expectedVictimsOrder { + assert.Equal(t, v.Watts, victims[i].Watts, "failed to sorted victims") + assert.Equal(t, v.Host, victims[i].Host, "failed to sorted victims") + } +}