Damien Neil | 220c202 | 2018-08-15 11:24:18 -0700 | [diff] [blame] | 1 | // Copyright 2018 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Joe Tsai | 42fa50d | 2018-10-15 17:34:43 -0700 | [diff] [blame] | 5 | // +build golden |
Damien Neil | 2dc6718 | 2018-09-21 15:03:34 -0700 | [diff] [blame] | 6 | |
Damien Neil | 220c202 | 2018-08-15 11:24:18 -0700 | [diff] [blame] | 7 | package main |
| 8 | |
| 9 | import ( |
Damien Neil | 162c127 | 2018-10-04 12:42:37 -0700 | [diff] [blame] | 10 | "bytes" |
Damien Neil | 220c202 | 2018-08-15 11:24:18 -0700 | [diff] [blame] | 11 | "flag" |
Damien Neil | 162c127 | 2018-10-04 12:42:37 -0700 | [diff] [blame] | 12 | "io/ioutil" |
| 13 | "os" |
| 14 | "path/filepath" |
Damien Neil | 220c202 | 2018-08-15 11:24:18 -0700 | [diff] [blame] | 15 | "testing" |
Damien Neil | 2dc6718 | 2018-09-21 15:03:34 -0700 | [diff] [blame] | 16 | |
Damien Neil | 162c127 | 2018-10-04 12:42:37 -0700 | [diff] [blame] | 17 | "github.com/golang/protobuf/proto" |
Damien Neil | 2dc6718 | 2018-09-21 15:03:34 -0700 | [diff] [blame] | 18 | "github.com/golang/protobuf/v2/internal/protogen/goldentest" |
Joe Tsai | 009e067 | 2018-11-27 18:45:07 -0800 | [diff] [blame] | 19 | "github.com/golang/protobuf/v2/internal/scalar" |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame^] | 20 | |
| 21 | descriptorpb "github.com/golang/protobuf/v2/types/descriptor" |
Damien Neil | 220c202 | 2018-08-15 11:24:18 -0700 | [diff] [blame] | 22 | ) |
| 23 | |
| 24 | // Set --regenerate to regenerate the golden files. |
| 25 | var regenerate = flag.Bool("regenerate", false, "regenerate golden files") |
| 26 | |
Damien Neil | 220c202 | 2018-08-15 11:24:18 -0700 | [diff] [blame] | 27 | func init() { |
Damien Neil | 2dc6718 | 2018-09-21 15:03:34 -0700 | [diff] [blame] | 28 | goldentest.Plugin(main) |
Damien Neil | 220c202 | 2018-08-15 11:24:18 -0700 | [diff] [blame] | 29 | } |
| 30 | |
| 31 | func TestGolden(t *testing.T) { |
Damien Neil | 2dc6718 | 2018-09-21 15:03:34 -0700 | [diff] [blame] | 32 | goldentest.Run(t, *regenerate) |
Damien Neil | 220c202 | 2018-08-15 11:24:18 -0700 | [diff] [blame] | 33 | } |
Damien Neil | 162c127 | 2018-10-04 12:42:37 -0700 | [diff] [blame] | 34 | |
| 35 | func TestAnnotations(t *testing.T) { |
| 36 | workdir, err := ioutil.TempDir("", "proto-test") |
| 37 | if err != nil { |
| 38 | t.Fatal(err) |
| 39 | } |
| 40 | defer os.RemoveAll(workdir) |
| 41 | |
| 42 | goldentest.Protoc(t, []string{"--go_out=paths=source_relative,annotate_code:" + workdir, "-Itestdata/annotations", "testdata/annotations/annotations.proto"}) |
| 43 | sourceFile, err := ioutil.ReadFile(filepath.Join(workdir, "annotations.pb.go")) |
| 44 | if err != nil { |
| 45 | t.Fatal(err) |
| 46 | } |
| 47 | metaFile, err := ioutil.ReadFile(filepath.Join(workdir, "annotations.pb.go.meta")) |
| 48 | if err != nil { |
| 49 | t.Fatal(err) |
| 50 | } |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame^] | 51 | gotInfo := &descriptorpb.GeneratedCodeInfo{} |
Damien Neil | 162c127 | 2018-10-04 12:42:37 -0700 | [diff] [blame] | 52 | if err := proto.UnmarshalText(string(metaFile), gotInfo); err != nil { |
| 53 | t.Fatalf("can't parse meta file: %v", err) |
| 54 | } |
| 55 | |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame^] | 56 | wantInfo := &descriptorpb.GeneratedCodeInfo{} |
Damien Neil | 162c127 | 2018-10-04 12:42:37 -0700 | [diff] [blame] | 57 | for _, want := range []struct { |
| 58 | prefix, text, suffix string |
| 59 | path []int32 |
| 60 | }{{ |
| 61 | "type ", "AnnotationsTestEnum", " int32", |
| 62 | []int32{5 /* enum_type */, 0}, |
| 63 | }, { |
| 64 | "\t", "AnnotationsTestEnum_ANNOTATIONS_TEST_ENUM_VALUE", " AnnotationsTestEnum = 0", |
| 65 | []int32{5 /* enum_type */, 0, 2 /* value */, 0}, |
| 66 | }, { |
| 67 | "type ", "AnnotationsTestMessage", " struct {", |
| 68 | []int32{4 /* message_type */, 0}, |
| 69 | }, { |
| 70 | "\t", "AnnotationsTestField", " ", |
| 71 | []int32{4 /* message_type */, 0, 2 /* field */, 0}, |
| 72 | }, { |
| 73 | "func (m *AnnotationsTestMessage) ", "GetAnnotationsTestField", "() string {", |
| 74 | []int32{4 /* message_type */, 0, 2 /* field */, 0}, |
| 75 | }} { |
| 76 | s := want.prefix + want.text + want.suffix |
| 77 | pos := bytes.Index(sourceFile, []byte(s)) |
| 78 | if pos < 0 { |
| 79 | t.Errorf("source file does not contain: %v", s) |
| 80 | continue |
| 81 | } |
| 82 | begin := pos + len(want.prefix) |
| 83 | end := begin + len(want.text) |
Joe Tsai | e1f8d50 | 2018-11-26 18:55:29 -0800 | [diff] [blame^] | 84 | wantInfo.Annotation = append(wantInfo.Annotation, &descriptorpb.GeneratedCodeInfo_Annotation{ |
Damien Neil | 162c127 | 2018-10-04 12:42:37 -0700 | [diff] [blame] | 85 | Path: want.path, |
Joe Tsai | 009e067 | 2018-11-27 18:45:07 -0800 | [diff] [blame] | 86 | Begin: scalar.Int32(int32(begin)), |
| 87 | End: scalar.Int32(int32(end)), |
| 88 | SourceFile: scalar.String("annotations.proto"), |
Damien Neil | 162c127 | 2018-10-04 12:42:37 -0700 | [diff] [blame] | 89 | }) |
| 90 | } |
| 91 | if !proto.Equal(gotInfo, wantInfo) { |
| 92 | t.Errorf("unexpected annotations for annotations.proto; got:\n%v\nwant:\n%v", |
| 93 | proto.MarshalTextString(gotInfo), proto.MarshalTextString(wantInfo)) |
| 94 | } |
| 95 | } |