Skip to content

Commit f29f327

Browse files
authored
fix(gen): reject repeated object query params (#2383)
Updates #2379
1 parent 54c764a commit f29f327

File tree

4 files changed

+405
-9
lines changed

4 files changed

+405
-9
lines changed

google-api-go-generator/gen.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1967,6 +1967,9 @@ func (meth *Method) generateCode() {
19671967
if opt.p.Location != "query" {
19681968
panicf("optional parameter has unsupported location %q", opt.p.Location)
19691969
}
1970+
if opt.p.Repeated && opt.p.Type == "object" {
1971+
panic(fmt.Sprintf("field %q: repeated fields of type message are prohibited as query parameters", opt.p.Name))
1972+
}
19701973
setter := initialCap(opt.p.Name)
19711974
des := opt.p.Description
19721975
des = strings.Replace(des, "Optional.", "", 1)

google-api-go-generator/gen_test.go

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"strings"
1717
"testing"
1818

19+
"github.com/google/go-cmp/cmp"
1920
"google.golang.org/api/google-api-go-generator/internal/disco"
2021
"google.golang.org/api/internal"
2122
)
@@ -44,6 +45,7 @@ func TestAPIs(t *testing.T) {
4445
"param-rename",
4546
"quotednum",
4647
"repeated",
48+
"repeated_any_query_error",
4749
"required-query",
4850
"resource-named-service", // appengine/v1/appengine-api.json
4951
"unfortunatedefaults",
@@ -52,6 +54,36 @@ func TestAPIs(t *testing.T) {
5254
}
5355
for _, name := range names {
5456
t.Run(name, func(t *testing.T) {
57+
defer func() {
58+
r := recover()
59+
wantPanic := strings.HasSuffix(name, "_error")
60+
if r != nil && !wantPanic {
61+
t.Fatal("unexpected panic", r)
62+
}
63+
if r == nil && !wantPanic {
64+
return
65+
}
66+
if r == nil && wantPanic {
67+
t.Fatal("wanted test to panic, but it didn't")
68+
}
69+
70+
// compare panic message received vs. desired
71+
got, ok := r.(string)
72+
if !ok {
73+
gotE, okE := r.(error)
74+
if !okE {
75+
t.Fatalf("panic with non-string/error input: %v", r)
76+
}
77+
got = gotE.Error()
78+
}
79+
want, err := readOrUpdate(name, got)
80+
if err != nil {
81+
t.Fatal(err)
82+
}
83+
if diff := cmp.Diff(got, string(want)); diff != "" {
84+
t.Errorf("got(-),want(+):\n %s", diff)
85+
}
86+
}()
5587
api, err := apiFromFile(filepath.Join("testdata", name+".json"))
5688
if err != nil {
5789
t.Fatalf("Error loading API testdata/%s.json: %v", name, err)
@@ -60,17 +92,12 @@ func TestAPIs(t *testing.T) {
6092
if err != nil {
6193
t.Fatalf("Error generating code for %s: %v", name, err)
6294
}
63-
goldenFile := filepath.Join("testdata", name+".want")
64-
if *updateGolden {
65-
clean := strings.Replace(string(clean), fmt.Sprintf("gdcl/%s", internal.Version), "gdcl/00000000", -1)
66-
if err := os.WriteFile(goldenFile, []byte(clean), 0644); err != nil {
67-
t.Fatal(err)
68-
}
69-
}
70-
want, err := os.ReadFile(goldenFile)
95+
96+
want, err := readOrUpdate(name, string(clean))
7197
if err != nil {
7298
t.Fatal(err)
7399
}
100+
74101
wantStr := strings.Replace(string(want), "gdcl/00000000", fmt.Sprintf("gdcl/%s", internal.Version), -1)
75102
if !bytes.Equal([]byte(wantStr), clean) {
76103
tf, _ := os.CreateTemp("", "api-"+name+"-got-json.")
@@ -81,12 +108,27 @@ func TestAPIs(t *testing.T) {
81108
t.Fatal(err)
82109
}
83110
// NOTE: update golden files with `go test -update_golden`
84-
t.Errorf("Output for API %s differs: diff -u %s %s", name, goldenFile, tf.Name())
111+
t.Errorf("Output for API %s differs: diff -u %s %s", name, goldenFileName(name), tf.Name())
85112
}
86113
})
87114
}
88115
}
89116

117+
func readOrUpdate(name, clean string) ([]byte, error) {
118+
goldenFile := goldenFileName(name)
119+
if *updateGolden {
120+
clean := strings.Replace(string(clean), fmt.Sprintf("gdcl/%s", internal.Version), "gdcl/00000000", -1)
121+
if err := os.WriteFile(goldenFile, []byte(clean), 0644); err != nil {
122+
return nil, err
123+
}
124+
}
125+
return os.ReadFile(goldenFile)
126+
}
127+
128+
func goldenFileName(name string) string {
129+
return filepath.Join("testdata", name+".want")
130+
}
131+
90132
func TestScope(t *testing.T) {
91133
tests := [][]string{
92134
{

0 commit comments

Comments
 (0)