Skip to content

Commit adb4bb0

Browse files
committed
New: Verifiers return an error if multiple fields part of the same oneof are set, see #710
1 parent d7493ef commit adb4bb0

File tree

7 files changed

+275
-218
lines changed

7 files changed

+275
-218
lines changed

src/verifier.js

+13-4
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ function verifier(mtype) {
121121
var gen = util.codegen("m")
122122
("if(typeof m!==\"object\"||m===null)")
123123
("return%j", "object expected");
124+
var oneofs = mtype.oneofsArray,
125+
seenFirstField = {};
126+
if (oneofs.length) gen
127+
("var p={}");
124128

125129
for (var i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {
126130
var field = mtype._fieldsArray[i].resolve(),
@@ -150,11 +154,16 @@ function verifier(mtype) {
150154

151155
// required or present fields
152156
} else {
153-
if (!field.required) {
154-
if (field.resolvedType && !(field.resolvedType instanceof Enum)) gen
157+
if (!field.required) gen
155158
("if(%s!==undefined&&%s!==null){", ref, ref);
156-
else gen
157-
("if(%s!==undefined){", ref);
159+
if (field.partOf) {
160+
var oneofProp = util.safeProp(field.partOf.name);
161+
if (seenFirstField[field.partOf.name] === 1) gen
162+
("if(p%s===1)", oneofProp)
163+
("return%j", field.partOf.name + ": multiple values");
164+
seenFirstField[field.partOf.name] = 1;
165+
gen
166+
("p%s=1", oneofProp);
158167
}
159168
genVerifyValue(gen, field, i, ref);
160169
if (!field.required) gen

tests/data/comments.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,13 @@ $root.Test1 = (function() {
138138
Test1.verify = function verify(message) {
139139
if (typeof message !== "object" || message === null)
140140
return "object expected";
141-
if (message.field1 !== undefined)
141+
if (message.field1 !== undefined && message.field1 !== null)
142142
if (!$util.isString(message.field1))
143143
return "field1: string expected";
144-
if (message.field2 !== undefined)
144+
if (message.field2 !== undefined && message.field2 !== null)
145145
if (!$util.isInteger(message.field2))
146146
return "field2: integer expected";
147-
if (message.field3 !== undefined)
147+
if (message.field3 !== undefined && message.field3 !== null)
148148
if (typeof message.field3 !== "boolean")
149149
return "field3: boolean expected";
150150
return null;

tests/data/convert.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ $root.Message = (function() {
240240
Message.verify = function verify(message) {
241241
if (typeof message !== "object" || message === null)
242242
return "object expected";
243-
if (message.stringVal !== undefined)
243+
if (message.stringVal !== undefined && message.stringVal !== null)
244244
if (!$util.isString(message.stringVal))
245245
return "stringVal: string expected";
246246
if (message.stringRepeated !== undefined) {
@@ -250,7 +250,7 @@ $root.Message = (function() {
250250
if (!$util.isString(message.stringRepeated[i]))
251251
return "stringRepeated: string[] expected";
252252
}
253-
if (message.uint64Val !== undefined)
253+
if (message.uint64Val !== undefined && message.uint64Val !== null)
254254
if (!$util.isInteger(message.uint64Val) && !(message.uint64Val && $util.isInteger(message.uint64Val.low) && $util.isInteger(message.uint64Val.high)))
255255
return "uint64Val: integer|Long expected";
256256
if (message.uint64Repeated !== undefined) {
@@ -260,7 +260,7 @@ $root.Message = (function() {
260260
if (!$util.isInteger(message.uint64Repeated[i]) && !(message.uint64Repeated[i] && $util.isInteger(message.uint64Repeated[i].low) && $util.isInteger(message.uint64Repeated[i].high)))
261261
return "uint64Repeated: integer|Long[] expected";
262262
}
263-
if (message.bytesVal !== undefined)
263+
if (message.bytesVal !== undefined && message.bytesVal !== null)
264264
if (!(message.bytesVal && typeof message.bytesVal.length === "number" || $util.isString(message.bytesVal)))
265265
return "bytesVal: buffer expected";
266266
if (message.bytesRepeated !== undefined) {
@@ -270,7 +270,7 @@ $root.Message = (function() {
270270
if (!(message.bytesRepeated[i] && typeof message.bytesRepeated[i].length === "number" || $util.isString(message.bytesRepeated[i])))
271271
return "bytesRepeated: buffer[] expected";
272272
}
273-
if (message.enumVal !== undefined)
273+
if (message.enumVal !== undefined && message.enumVal !== null)
274274
switch (message.enumVal) {
275275
default:
276276
return "enumVal: enum value expected";

tests/data/mapbox/vector_tile.js

+15-15
Original file line numberDiff line numberDiff line change
@@ -394,25 +394,25 @@ $root.vector_tile = (function() {
394394
Value.verify = function verify(message) {
395395
if (typeof message !== "object" || message === null)
396396
return "object expected";
397-
if (message.stringValue !== undefined)
397+
if (message.stringValue !== undefined && message.stringValue !== null)
398398
if (!$util.isString(message.stringValue))
399399
return "stringValue: string expected";
400-
if (message.floatValue !== undefined)
400+
if (message.floatValue !== undefined && message.floatValue !== null)
401401
if (typeof message.floatValue !== "number")
402402
return "floatValue: number expected";
403-
if (message.doubleValue !== undefined)
403+
if (message.doubleValue !== undefined && message.doubleValue !== null)
404404
if (typeof message.doubleValue !== "number")
405405
return "doubleValue: number expected";
406-
if (message.intValue !== undefined)
406+
if (message.intValue !== undefined && message.intValue !== null)
407407
if (!$util.isInteger(message.intValue) && !(message.intValue && $util.isInteger(message.intValue.low) && $util.isInteger(message.intValue.high)))
408408
return "intValue: integer|Long expected";
409-
if (message.uintValue !== undefined)
409+
if (message.uintValue !== undefined && message.uintValue !== null)
410410
if (!$util.isInteger(message.uintValue) && !(message.uintValue && $util.isInteger(message.uintValue.low) && $util.isInteger(message.uintValue.high)))
411411
return "uintValue: integer|Long expected";
412-
if (message.sintValue !== undefined)
412+
if (message.sintValue !== undefined && message.sintValue !== null)
413413
if (!$util.isInteger(message.sintValue) && !(message.sintValue && $util.isInteger(message.sintValue.low) && $util.isInteger(message.sintValue.high)))
414414
return "sintValue: integer|Long expected";
415-
if (message.boolValue !== undefined)
415+
if (message.boolValue !== undefined && message.boolValue !== null)
416416
if (typeof message.boolValue !== "boolean")
417417
return "boolValue: boolean expected";
418418
return null;
@@ -711,7 +711,7 @@ $root.vector_tile = (function() {
711711
Feature.verify = function verify(message) {
712712
if (typeof message !== "object" || message === null)
713713
return "object expected";
714-
if (message.id !== undefined)
714+
if (message.id !== undefined && message.id !== null)
715715
if (!$util.isInteger(message.id) && !(message.id && $util.isInteger(message.id.low) && $util.isInteger(message.id.high)))
716716
return "id: integer|Long expected";
717717
if (message.tags !== undefined) {
@@ -721,7 +721,7 @@ $root.vector_tile = (function() {
721721
if (!$util.isInteger(message.tags[i]))
722722
return "tags: integer[] expected";
723723
}
724-
if (message.type !== undefined)
724+
if (message.type !== undefined && message.type !== null)
725725
switch (message.type) {
726726
default:
727727
return "type: enum value expected";
@@ -1066,7 +1066,7 @@ $root.vector_tile = (function() {
10661066
return "values." + error;
10671067
}
10681068
}
1069-
if (message.extent !== undefined)
1069+
if (message.extent !== undefined && message.extent !== null)
10701070
if (!$util.isInteger(message.extent))
10711071
return "extent: integer expected";
10721072
return null;
@@ -1142,18 +1142,16 @@ $root.vector_tile = (function() {
11421142
object.values = [];
11431143
}
11441144
if (options.defaults) {
1145-
object.version = 1;
11461145
object.name = "";
11471146
object.extent = 4096;
1147+
object.version = 1;
11481148
}
1149-
if (message.version !== undefined && message.version !== null && message.hasOwnProperty("version"))
1150-
object.version = message.version;
11511149
if (message.name !== undefined && message.name !== null && message.hasOwnProperty("name"))
11521150
object.name = message.name;
11531151
if (message.features !== undefined && message.features !== null && message.hasOwnProperty("features")) {
11541152
object.features = [];
11551153
for (var j = 0; j < message.features.length; ++j)
1156-
object.features[j] = $types[2].toObject(message.features[j], options);
1154+
object.features[j] = $types[1].toObject(message.features[j], options);
11571155
}
11581156
if (message.keys !== undefined && message.keys !== null && message.hasOwnProperty("keys")) {
11591157
object.keys = [];
@@ -1163,10 +1161,12 @@ $root.vector_tile = (function() {
11631161
if (message.values !== undefined && message.values !== null && message.hasOwnProperty("values")) {
11641162
object.values = [];
11651163
for (var j = 0; j < message.values.length; ++j)
1166-
object.values[j] = $types[4].toObject(message.values[j], options);
1164+
object.values[j] = $types[3].toObject(message.values[j], options);
11671165
}
11681166
if (message.extent !== undefined && message.extent !== null && message.hasOwnProperty("extent"))
11691167
object.extent = message.extent;
1168+
if (message.version !== undefined && message.version !== null && message.hasOwnProperty("version"))
1169+
object.version = message.version;
11701170
return object;
11711171
};
11721172

tests/data/package.js

+16-16
Original file line numberDiff line numberDiff line change
@@ -340,33 +340,33 @@ $root.Package = (function() {
340340
Package.verify = function verify(message) {
341341
if (typeof message !== "object" || message === null)
342342
return "object expected";
343-
if (message.name !== undefined)
343+
if (message.name !== undefined && message.name !== null)
344344
if (!$util.isString(message.name))
345345
return "name: string expected";
346-
if (message.version !== undefined)
346+
if (message.version !== undefined && message.version !== null)
347347
if (!$util.isString(message.version))
348348
return "version: string expected";
349-
if (message.versionScheme !== undefined)
349+
if (message.versionScheme !== undefined && message.versionScheme !== null)
350350
if (!$util.isString(message.versionScheme))
351351
return "versionScheme: string expected";
352-
if (message.description !== undefined)
352+
if (message.description !== undefined && message.description !== null)
353353
if (!$util.isString(message.description))
354354
return "description: string expected";
355-
if (message.author !== undefined)
355+
if (message.author !== undefined && message.author !== null)
356356
if (!$util.isString(message.author))
357357
return "author: string expected";
358-
if (message.license !== undefined)
358+
if (message.license !== undefined && message.license !== null)
359359
if (!$util.isString(message.license))
360360
return "license: string expected";
361361
if (message.repository !== undefined && message.repository !== null) {
362362
var error = $types[6].verify(message.repository);
363363
if (error)
364364
return "repository." + error;
365365
}
366-
if (message.bugs !== undefined)
366+
if (message.bugs !== undefined && message.bugs !== null)
367367
if (!$util.isString(message.bugs))
368368
return "bugs: string expected";
369-
if (message.homepage !== undefined)
369+
if (message.homepage !== undefined && message.homepage !== null)
370370
if (!$util.isString(message.homepage))
371371
return "homepage: string expected";
372372
if (message.keywords !== undefined) {
@@ -376,7 +376,7 @@ $root.Package = (function() {
376376
if (!$util.isString(message.keywords[i]))
377377
return "keywords: string[] expected";
378378
}
379-
if (message.main !== undefined)
379+
if (message.main !== undefined && message.main !== null)
380380
if (!$util.isString(message.main))
381381
return "main: string expected";
382382
if (message.bin !== undefined) {
@@ -419,7 +419,7 @@ $root.Package = (function() {
419419
if (!$util.isString(message.devDependencies[key[i]]))
420420
return "devDependencies: string{k:string} expected";
421421
}
422-
if (message.types !== undefined)
422+
if (message.types !== undefined && message.types !== null)
423423
if (!$util.isString(message.types))
424424
return "types: string expected";
425425
if (message.cliDependencies !== undefined) {
@@ -551,7 +551,6 @@ $root.Package = (function() {
551551
if (options.defaults) {
552552
object.name = "";
553553
object.version = "";
554-
object.versionScheme = "";
555554
object.description = "";
556555
object.author = "";
557556
object.license = "";
@@ -560,21 +559,20 @@ $root.Package = (function() {
560559
object.homepage = "";
561560
object.main = "";
562561
object.types = "";
562+
object.versionScheme = "";
563563
}
564564
if (message.name !== undefined && message.name !== null && message.hasOwnProperty("name"))
565565
object.name = message.name;
566566
if (message.version !== undefined && message.version !== null && message.hasOwnProperty("version"))
567567
object.version = message.version;
568-
if (message.versionScheme !== undefined && message.versionScheme !== null && message.hasOwnProperty("versionScheme"))
569-
object.versionScheme = message.versionScheme;
570568
if (message.description !== undefined && message.description !== null && message.hasOwnProperty("description"))
571569
object.description = message.description;
572570
if (message.author !== undefined && message.author !== null && message.hasOwnProperty("author"))
573571
object.author = message.author;
574572
if (message.license !== undefined && message.license !== null && message.hasOwnProperty("license"))
575573
object.license = message.license;
576574
if (message.repository !== undefined && message.repository !== null && message.hasOwnProperty("repository"))
577-
object.repository = $types[6].toObject(message.repository, options);
575+
object.repository = $types[5].toObject(message.repository, options);
578576
if (message.bugs !== undefined && message.bugs !== null && message.hasOwnProperty("bugs"))
579577
object.bugs = message.bugs;
580578
if (message.homepage !== undefined && message.homepage !== null && message.hasOwnProperty("homepage"))
@@ -618,6 +616,8 @@ $root.Package = (function() {
618616
for (var j = 0; j < message.cliDependencies.length; ++j)
619617
object.cliDependencies[j] = message.cliDependencies[j];
620618
}
619+
if (message.versionScheme !== undefined && message.versionScheme !== null && message.hasOwnProperty("versionScheme"))
620+
object.versionScheme = message.versionScheme;
621621
return object;
622622
};
623623

@@ -749,10 +749,10 @@ $root.Package = (function() {
749749
Repository.verify = function verify(message) {
750750
if (typeof message !== "object" || message === null)
751751
return "object expected";
752-
if (message.type !== undefined)
752+
if (message.type !== undefined && message.type !== null)
753753
if (!$util.isString(message.type))
754754
return "type: string expected";
755-
if (message.url !== undefined)
755+
if (message.url !== undefined && message.url !== null)
756756
if (!$util.isString(message.url))
757757
return "url: string expected";
758758
return null;

tests/data/rpc.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ $root.MyRequest = (function() {
170170
MyRequest.verify = function verify(message) {
171171
if (typeof message !== "object" || message === null)
172172
return "object expected";
173-
if (message.path !== undefined)
173+
if (message.path !== undefined && message.path !== null)
174174
if (!$util.isString(message.path))
175175
return "path: string expected";
176176
return null;
@@ -336,7 +336,7 @@ $root.MyResponse = (function() {
336336
MyResponse.verify = function verify(message) {
337337
if (typeof message !== "object" || message === null)
338338
return "object expected";
339-
if (message.status !== undefined)
339+
if (message.status !== undefined && message.status !== null)
340340
if (!$util.isInteger(message.status))
341341
return "status: integer expected";
342342
return null;

0 commit comments

Comments
 (0)