2020-01-04 13:23:10 -08:00
package main
2020-01-04 17:15:16 -08:00
import (
"io/ioutil"
2020-01-04 18:40:47 -08:00
"log"
2020-01-04 17:43:18 -08:00
"math"
2020-01-04 17:15:16 -08:00
"os"
2020-01-04 18:09:41 -08:00
"path/filepath"
2020-01-04 17:15:16 -08:00
"strconv"
"testing"
"github.com/stretchr/testify/assert"
)
2020-01-04 13:23:10 -08:00
2020-01-04 18:40:47 -08:00
var raplDir string
2020-01-04 13:23:10 -08:00
2020-01-04 18:40:47 -08:00
const maxWattage uint64 = 1500000
func TestMain ( m * testing . M ) {
var err error
raplDir , err = ioutil . TempDir ( "" , raplPrefixCPU )
if err != nil {
log . Fatal ( err )
}
2020-01-04 13:23:10 -08:00
2020-01-04 18:40:47 -08:00
defer os . RemoveAll ( raplDir )
// Create temporary directory that mocks powercap subsytem
zonePath := filepath . Join ( raplDir , raplPrefixCPU + ":0" )
2020-01-04 18:09:41 -08:00
err = os . Mkdir ( zonePath , 755 )
2020-01-04 18:40:47 -08:00
if err != nil {
log . Fatal ( err )
}
2020-01-04 18:09:41 -08:00
2020-01-04 18:40:47 -08:00
initialWatts := strconv . FormatUint ( maxWattage , 10 )
2020-01-04 17:15:16 -08:00
2020-01-17 09:43:34 -08:00
err = ioutil . WriteFile ( filepath . Join ( zonePath , maxPowerFileLongWindow ) , [ ] byte ( initialWatts ) , 0444 )
2020-01-04 18:40:47 -08:00
if err != nil {
log . Fatal ( err )
}
2020-01-04 17:15:16 -08:00
2020-01-17 09:43:34 -08:00
err = ioutil . WriteFile ( filepath . Join ( zonePath , powerLimitFileLongWindow ) , [ ] byte ( initialWatts ) , 0644 )
2020-01-04 18:40:47 -08:00
if err != nil {
log . Fatal ( err )
}
2020-01-04 17:15:16 -08:00
2020-01-04 18:40:47 -08:00
os . Exit ( m . Run ( ) )
}
2020-01-04 17:15:16 -08:00
2020-01-18 20:11:44 -08:00
// TODO(rdelvalle): Add tests where capping fails
2020-01-04 18:40:47 -08:00
func TestCapNode ( t * testing . T ) {
2020-01-18 20:11:44 -08:00
capped , failed , err := capNode ( raplDir , 95 )
2020-01-04 17:15:16 -08:00
assert . NoError ( t , err )
2020-01-18 20:11:44 -08:00
assert . Len ( t , capped , 1 )
assert . Nil ( t , failed )
2020-01-04 18:51:41 -08:00
2020-01-17 09:43:34 -08:00
t . Run ( "bad-percentage" , func ( t * testing . T ) {
2020-01-18 20:11:44 -08:00
capped , failed , err := capNode ( raplDir , 1000 )
2020-01-04 18:51:41 -08:00
assert . Error ( t , err )
2020-01-18 20:11:44 -08:00
assert . Nil ( t , capped )
assert . Nil ( t , failed )
2020-01-04 18:51:41 -08:00
} )
2020-01-17 09:43:34 -08:00
t . Run ( "zero-percent" , func ( t * testing . T ) {
2020-01-18 20:11:44 -08:00
capped , failed , err := capNode ( raplDir , 0 )
2020-01-04 18:51:41 -08:00
assert . Error ( t , err )
2020-01-18 20:11:44 -08:00
assert . Nil ( t , capped )
assert . Nil ( t , failed )
2020-01-04 18:51:41 -08:00
} )
2020-01-04 18:40:47 -08:00
}
2020-01-04 17:15:16 -08:00
2020-01-04 18:40:47 -08:00
func TestMaxPower ( t * testing . T ) {
2020-01-17 09:43:34 -08:00
maxFile := filepath . Join ( raplDir , raplPrefixCPU + ":0" , maxPowerFileLongWindow )
2020-01-04 17:15:16 -08:00
2020-01-04 18:40:47 -08:00
maxWatts , err := maxPower ( maxFile )
2020-01-04 17:15:16 -08:00
assert . NoError ( t , err )
2020-01-04 18:40:47 -08:00
assert . Equal ( t , maxWattage , maxWatts )
2020-01-04 18:51:41 -08:00
2020-01-17 09:43:34 -08:00
t . Run ( "name-does-not-exist" , func ( t * testing . T ) {
2020-01-04 18:51:41 -08:00
_ , err := maxPower ( "madeupname" )
assert . Error ( t , err )
} )
2020-01-04 17:15:16 -08:00
}
2020-01-04 17:43:18 -08:00
func TestCapZone ( t * testing . T ) {
const percentage float64 = .50
2020-01-04 18:40:47 -08:00
powercap := uint64 ( math . Ceil ( float64 ( maxWattage ) * percentage ) )
2020-01-17 09:43:34 -08:00
limitFile := filepath . Join ( raplDir , raplPrefixCPU + ":0" , powerLimitFileLongWindow )
2020-01-04 18:40:47 -08:00
err := capZone ( limitFile , powercap )
2020-01-04 17:43:18 -08:00
assert . NoError ( t , err )
2020-01-18 20:11:44 -08:00
newCap , err := currentCap ( limitFile )
2020-01-04 17:43:18 -08:00
assert . NoError ( t , err )
assert . Equal ( t , powercap , newCap )
2020-01-04 18:51:41 -08:00
2020-01-17 09:43:34 -08:00
t . Run ( "name-does-not-exist" , func ( t * testing . T ) {
2020-01-04 18:51:41 -08:00
err := capZone ( "madeupname" , powercap )
assert . Error ( t , err )
} )
2020-01-04 17:43:18 -08:00
}