| // 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) | |
| } | |
| } | |
| } |