| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package cpu_test |
| |
| import ( |
| "errors" |
| . "internal/cpu" |
| "io/ioutil" |
| "regexp" |
| "testing" |
| ) |
| |
| func getFeatureList() ([]string, error) { |
| cpuinfo, err := ioutil.ReadFile("/proc/cpuinfo") |
| if err != nil { |
| return nil, err |
| } |
| r := regexp.MustCompile("features\\s*:\\s*(.*)") |
| b := r.FindSubmatch(cpuinfo) |
| if len(b) < 2 { |
| return nil, errors.New("no feature list in /proc/cpuinfo") |
| } |
| return regexp.MustCompile("\\s+").Split(string(b[1]), -1), nil |
| } |
| |
| func TestS390XAgainstCPUInfo(t *testing.T) { |
| // mapping of linux feature strings to S390X fields |
| mapping := make(map[string]*bool) |
| for _, option := range Options { |
| mapping[option.Name] = option.Feature |
| } |
| |
| // these must be true on the machines Go supports |
| mandatory := make(map[string]bool) |
| mandatory["zarch"] = false |
| mandatory["eimm"] = false |
| mandatory["ldisp"] = false |
| mandatory["stfle"] = false |
| |
| features, err := getFeatureList() |
| if err != nil { |
| t.Error(err) |
| } |
| for _, feature := range features { |
| if _, ok := mandatory[feature]; ok { |
| mandatory[feature] = true |
| } |
| if flag, ok := mapping[feature]; ok { |
| if !*flag { |
| t.Errorf("feature '%v' not detected", feature) |
| } |
| } else { |
| t.Logf("no entry for '%v'", feature) |
| } |
| } |
| for k, v := range mandatory { |
| if !v { |
| t.Errorf("mandatory feature '%v' not detected", k) |
| } |
| } |
| } |