func TestUnpackProperties(t *testing.T) { for _, testCase := range validUnpackTestCases { r := bytes.NewBufferString(testCase.input) file, errs := parser.Parse("", r, nil) if len(errs) != 0 { t.Errorf("test case: %s", testCase.input) t.Errorf("unexpected parse errors:") for _, err := range errs { t.Errorf(" %s", err) } t.FailNow() } module := file.Defs[0].(*parser.Module) properties := proptools.CloneProperties(reflect.ValueOf(testCase.output)) proptools.ZeroProperties(properties.Elem()) _, errs = unpackProperties(module.Properties, properties.Interface()) if len(errs) != 0 && len(testCase.errs) == 0 { t.Errorf("test case: %s", testCase.input) t.Errorf("unexpected unpack errors:") for _, err := range errs { t.Errorf(" %s", err) } t.FailNow() } else if !reflect.DeepEqual(errs, testCase.errs) { t.Errorf("test case: %s", testCase.input) t.Errorf("incorrect errors:") t.Errorf(" expected: %+v", testCase.errs) t.Errorf(" got: %+v", errs) } output := properties.Elem().Interface() if !reflect.DeepEqual(output, testCase.output) { t.Errorf("test case: %s", testCase.input) t.Errorf("incorrect output:") t.Errorf(" expected: %+v", testCase.output) t.Errorf(" got: %+v", output) } } }
// If in == nil, the source is the contents of the file with the given filename. func processFile(filename string, in io.Reader, out io.Writer) error { if in == nil { f, err := os.Open(filename) if err != nil { return err } defer f.Close() in = f } src, err := ioutil.ReadAll(in) if err != nil { return err } r := bytes.NewBuffer(src) file, errs := parser.Parse(filename, r, parser.NewScope(nil)) if len(errs) > 0 { for _, err := range errs { fmt.Fprintln(os.Stderr, err) } return fmt.Errorf("%d parsing errors", len(errs)) } modified, errs := findModules(file) if len(errs) > 0 { for _, err := range errs { fmt.Fprintln(os.Stderr, err) } fmt.Fprintln(os.Stderr, "continuing...") } if modified { res, err := parser.Print(file) if err != nil { return err } if *list { fmt.Fprintln(out, filename) } if *write { err = ioutil.WriteFile(filename, res, 0644) if err != nil { return err } } if *doDiff { data, err := diff(src, res) if err != nil { return fmt.Errorf("computing diff: %s", err) } fmt.Printf("diff %s bpfmt/%s\n", filename, filename) out.Write(data) } if !*list && !*write && !*doDiff { _, err = out.Write(res) } } return err }