Compare commits
1090 commits
integrate_
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
bda4bb9068 | ||
|
bd5ab154da | ||
|
6bd51a59df | ||
|
e264b20e69 | ||
|
b30dee3ea6 | ||
|
cdd524a0bd | ||
|
62d7fe5697 | ||
|
ecca6ea95d | ||
|
5a52b3588d | ||
|
e55782fa95 | ||
|
176bac6dac | ||
|
12acbc2678 | ||
|
097bfb53d1 | ||
|
dd7265e1a2 | ||
|
e3c807d4e7 | ||
|
1a7e49d462 | ||
|
9c0b35cf62 | ||
|
f752d816b7 | ||
|
d07efbad91 | ||
|
eca0f4ee91 | ||
|
db45687a38 | ||
|
703cd8e11c | ||
|
1325588982 | ||
|
c2fdef05cf | ||
|
73b7cc0007 | ||
|
5fd71ce631 | ||
|
72e293a28f | ||
|
8f367c0b2d | ||
|
5729cf77f6 | ||
|
dd19b876d4 | ||
|
710543d915 | ||
|
491b32041d | ||
|
888e287e3b | ||
|
4b36d4006b | ||
|
36e63da632 | ||
|
d0e6f3b9ab | ||
|
91bf623aa1 | ||
|
8d97b3d8b5 | ||
|
b9b34e9b11 | ||
|
09d2994b1f | ||
|
6ecf38f427 | ||
|
c722c3d294 | ||
|
9094bf0f7e | ||
|
9ba7d1c038 | ||
|
96095f3a85 | ||
|
c202b06de9 | ||
|
0871e6a808 | ||
|
d4d41af19b | ||
|
6156af10e8 | ||
|
d555775836 | ||
|
2aeb4ab9c7 | ||
|
ddbe36003e | ||
|
1d0988b8ef | ||
|
516a81a424 | ||
|
ecc0f54127 | ||
|
656dedbf07 | ||
|
6f325805c0 | ||
|
df3f8cf6dd | ||
|
0336770801 | ||
|
e9c15d601e | ||
|
fbaad3617f | ||
|
63a97289dc | ||
|
46f36d79a2 | ||
|
ea43e0c5e8 | ||
|
0b059a3d8a | ||
|
a183a0df61 | ||
|
faa53989cb | ||
|
ae85cb8ef3 | ||
|
d6470abef1 | ||
|
e222997c5b | ||
|
1e86ef4e9f | ||
|
282fb9e68e | ||
|
4d5daf4ef9 | ||
|
4eb02fe31e | ||
|
4674cc7c07 | ||
|
95749d5af6 | ||
|
0b07d7eb9e | ||
|
f26e8c2ae0 | ||
|
40da1ed572 | ||
|
ba987a7e2d | ||
|
c5125f371d | ||
|
d2c1865374 | ||
|
2465ae7e23 | ||
|
677557009c | ||
|
979107ec7a | ||
|
3b227611d5 | ||
|
8546620610 | ||
|
49e4ba6098 | ||
|
b28617b813 | ||
|
78cb804063 | ||
|
ad203bcb2b | ||
|
82e50ba5c3 | ||
|
455b61c6b0 | ||
|
25abd7b7e7 | ||
|
cd0efc0024 | ||
|
483396068d | ||
|
f00e06c95b | ||
|
a64497c709 | ||
|
bcb3506641 | ||
|
2f4489a3e5 | ||
|
286f059842 | ||
|
9053033a50 | ||
|
067b1eec3b | ||
|
07c284f86c | ||
|
a6189acd18 | ||
|
cbd08cb7d1 | ||
|
54d1701f6c | ||
|
7c76ac1735 | ||
|
3c0855e94a | ||
|
b1c75bc742 | ||
|
4920e27a48 | ||
|
fba2acd72e | ||
|
e64b618b21 | ||
|
4777574a6c | ||
|
6fff091c49 | ||
|
f418b9e3eb | ||
|
4523c9c233 | ||
|
478119fe77 | ||
|
14afc3fd41 | ||
|
f85eecb585 | ||
|
4c57e8475f | ||
|
b97cd573e4 | ||
|
7be088202b | ||
|
190b5270c8 | ||
|
357afc39de | ||
|
0a93f67055 | ||
|
594f810081 | ||
|
3055a02125 | ||
|
a3873cafae | ||
|
f5a01d1bbd | ||
|
2240a785f9 | ||
|
8aa927f08f | ||
|
43234828da | ||
|
5777259273 | ||
|
cad0258d17 | ||
|
fc3ea97870 | ||
|
899460c9cb | ||
|
bfeeb98517 | ||
|
e91caa1f19 | ||
|
bf483dfb99 | ||
|
ee9c7f17e9 | ||
|
efec757104 | ||
|
18c13c93de | ||
|
21b0b3ca36 | ||
|
80f0c0ac40 | ||
|
69bfde22b6 | ||
|
09328db1ff | ||
|
139fd0a1c5 | ||
|
37c7b766b3 | ||
|
662f97841e | ||
|
cc3fa2ec80 | ||
|
10ea25133d | ||
|
7e5f980508 | ||
|
dd04ffb923 | ||
|
58373fa160 | ||
|
11c902ea2e | ||
|
bd74319107 | ||
|
32ad5a3e0d | ||
|
b7c813fb67 | ||
|
c2b3b3e04e | ||
|
624d44f042 | ||
|
d5827784cf | ||
|
fe97d79abf | ||
|
fab8812cc1 | ||
|
c52e54f62b | ||
|
057a2851e4 | ||
|
e47c068cfa | ||
|
84f6954ca9 | ||
|
c348d46a9b | ||
|
acde1651b5 | ||
|
32d7830e4b | ||
|
d36c0c538a | ||
|
4a0dd03e52 | ||
|
258406b88f | ||
|
130c166697 | ||
|
ba3fa41ba8 | ||
|
558ba98811 | ||
|
04c77c4e4b | ||
|
d43eaf2b8f | ||
|
585993201a | ||
|
f316375a95 | ||
|
8adf57e0fa | ||
|
b3f3e123aa | ||
|
ddb438855a | ||
|
d9e0119f2c | ||
|
c565e25c7d | ||
|
7610f101e8 | ||
|
689e4bf5f4 | ||
|
373809e5f5 | ||
|
6f21e29268 | ||
|
1387a6795c | ||
|
ffa932bf10 | ||
|
312e2dbcfb | ||
|
db3ef48ede | ||
|
20181f6a1a | ||
|
4d273f28dc | ||
|
15b60bccf8 | ||
|
ea5ef14aa0 | ||
|
c12cc3490b | ||
|
6b27c1f981 | ||
|
c0871aa49c | ||
|
e8e6aa2864 | ||
|
89eb4e51b2 | ||
|
aec0711075 | ||
|
1eee3202fc | ||
|
c415a1445b | ||
|
44dc55587e | ||
|
ddc00963c0 | ||
|
1b0db1cb83 | ||
|
0df20284d0 | ||
|
89c3c456d2 | ||
|
2957703a01 | ||
|
0fad0e138f | ||
|
acaa9407e3 | ||
|
7008a88e2b | ||
|
cb3e84b78e | ||
|
33cc25f36c | ||
|
496cd481fa | ||
|
e62e30c309 | ||
|
4842363ee6 | ||
|
e77a09e1e9 | ||
|
8c40b5149a | ||
|
97cbc42621 | ||
|
f23869c615 | ||
|
014a5507fb | ||
|
c57c77b4b7 | ||
|
324a299a55 | ||
|
ed0ef54045 | ||
|
d18df81488 | ||
|
5e4f14fae4 | ||
|
b4b855cde4 | ||
|
416f90939d | ||
|
9c6b8cb9bf | ||
|
95b4427d39 | ||
|
43f2db776c | ||
|
746ca59885 | ||
|
874e382fde | ||
|
8df69f0894 | ||
|
f0a5c1033a | ||
|
ddfc86b1f7 | ||
|
13d165de9e | ||
|
d59592af61 | ||
|
c94555f955 | ||
|
f4f31e73f2 | ||
|
a69bc9de75 | ||
|
f54fb9d729 | ||
|
e11cd3ee6e | ||
|
92064a40ce | ||
|
cd6eb91684 | ||
|
81f4fe5aab | ||
|
81fe52fbd4 | ||
|
616e68ecc1 | ||
|
ae220cda61 | ||
|
03c8c8be6d | ||
|
a1bb147e96 | ||
|
1ece7c09af | ||
|
009e491bd7 | ||
|
da003550e8 | ||
|
61e87f3d41 | ||
|
7c7534413a | ||
|
cad6a51a30 | ||
|
3e6245e5d7 | ||
|
075475f834 | ||
|
bbfb9d52da | ||
|
8e465dcf46 | ||
|
af2d5f5ad3 | ||
|
9afacb44a3 | ||
|
baceff7c9c | ||
|
008dc92c9d | ||
|
9fa40314fc | ||
|
c31154316b | ||
|
4ae8656b6d | ||
|
fa1788026c | ||
|
920af75d1c | ||
|
dd8d5f57d7 | ||
|
769b693564 | ||
|
2b7430d96a | ||
|
f6d8c83384 | ||
|
21b58b51fe | ||
|
651ba62ab5 | ||
|
06f9f609e1 | ||
|
f873d3213c | ||
|
27b1f2b477 | ||
|
0c0a8879c3 | ||
|
008ff033ef | ||
|
6837b2dcb7 | ||
|
af13bff3c7 | ||
|
8610d0a9dd | ||
|
352526c214 | ||
|
2d1c5e26cb | ||
|
938206d66c | ||
|
a7e3b0ab01 | ||
|
8b182cc455 | ||
|
6011d7ca4c | ||
|
25ecd559cc | ||
|
bcbaabe53a | ||
|
671e075c5e | ||
|
7339fc04c4 | ||
|
b7f25d42d3 | ||
|
aff9d9d39c | ||
|
5274d6ee31 | ||
|
83b0cc9ba6 | ||
|
606cb7ed2c | ||
|
902af0816e | ||
|
6395a1cbd9 | ||
|
ffde972ac7 | ||
|
9118ad659b | ||
|
d41c47fff9 | ||
|
8d61f9c3bf | ||
|
b4b0e304be | ||
|
8387b88cdc | ||
|
66c64e7045 | ||
|
8c8b8e61f2 | ||
|
72b82e6875 | ||
|
963473b1dd | ||
|
d07176654b | ||
|
2d430f8c72 | ||
|
17174b54dd | ||
|
f83d129555 | ||
|
c9b2c8f327 | ||
|
a434bfc232 | ||
|
1a8cbfd355 | ||
|
172e0a6423 | ||
|
86208c526b | ||
|
37bd5d525b | ||
|
01a05a53f4 | ||
|
8f9c0a44bd | ||
|
a9ab38c171 | ||
|
8af35f28f6 | ||
|
a6c30d9705 | ||
|
9db5b11c9c | ||
|
0026dff9f6 | ||
|
38b14408c5 | ||
|
15360e59cf | ||
|
38c238e35e | ||
|
d2dfe46b27 | ||
|
3f6f73b796 | ||
|
ed423c2c52 | ||
|
aa78aeba98 | ||
|
74eb9a0a30 | ||
|
46c022a0a9 | ||
|
9079079ec0 | ||
|
ef927cc428 | ||
|
7288689d8c | ||
|
1d2736f24d | ||
|
9f09d1804a | ||
|
c6e0d0e7f3 | ||
|
42e1e2abef | ||
|
e844510f44 | ||
|
65a4d20deb | ||
|
a60cc08d83 | ||
|
cba04b19e8 | ||
|
6fffd4adb4 | ||
|
56da82820e | ||
|
c00274313d | ||
|
36f51f963c | ||
|
e7f5c9d071 | ||
|
5a3405c51a | ||
|
bd29f86804 | ||
|
36f68e02d5 | ||
|
39756643df | ||
|
7b54b34c1e | ||
|
7f3e237071 | ||
|
9d3288e651 | ||
|
2c36cc30dd | ||
|
afc59ab55a | ||
|
87e4976ba4 | ||
|
a83ac8663f | ||
|
a323f1e65d | ||
|
ccb76fff44 | ||
|
5af0b547de | ||
|
1f09786229 | ||
|
ea51149100 | ||
|
c15217f922 | ||
|
c2a5669773 | ||
|
32fa55e666 | ||
|
4e7ecde15c | ||
|
3d7b42d1a6 | ||
|
140e28d12e | ||
|
0aa5af3e68 | ||
|
a101fa5289 | ||
|
e41b667da5 | ||
|
047575f20c | ||
|
eed9951991 | ||
|
24908e1b32 | ||
|
d0bc096b4a | ||
|
c9cd6acd71 | ||
|
1651342501 | ||
|
cf477d46ca | ||
|
adcccd0f81 | ||
|
feb78fb293 | ||
|
e4baf3f58a | ||
|
e53dd99350 | ||
|
fac90c66c3 | ||
|
75ac3973ef | ||
|
effcb132e1 | ||
|
228d242c58 | ||
|
fb71df9f0b | ||
|
e76d91a9d1 | ||
|
0bdf4a617f | ||
|
2bddffc993 | ||
|
2c16f6979a | ||
|
ffa71f8007 | ||
|
1041710fce | ||
|
24f0d5691e | ||
|
988ffe0a78 | ||
|
2deb139bc9 | ||
|
17a8a7619a | ||
|
c55175cb9f | ||
|
a59205215a | ||
|
b40d318650 | ||
|
4cb113a91b | ||
|
30250cde5e | ||
|
5f65ee6ac7 | ||
|
4455cdf7ee | ||
|
05b019aedc | ||
|
f52e188fe4 | ||
|
137dc026cf | ||
|
abe172564e | ||
|
4e229c8b5c | ||
|
15a15e336b | ||
|
6c021b3d5f | ||
|
d948b66d4f | ||
|
5731ca5af0 | ||
|
ee0a24346e | ||
|
d1e7bd9842 | ||
|
cdc2766a5d | ||
|
bb2c6b21a0 | ||
|
fb15862bac | ||
|
98d89d4277 | ||
|
1b3a0c16e6 | ||
|
183d31cbdb | ||
|
f39cf88a34 | ||
|
b18bc9b944 | ||
|
ef61a9d313 | ||
|
ba63fa731e | ||
|
a95e38ce8d | ||
|
a902e2588d | ||
|
83d681ee2c | ||
|
d1c1dad047 | ||
|
c68fc589a9 | ||
|
2ff42dcf2c | ||
|
f983302ca7 | ||
|
837fd6b6a0 | ||
|
f77b7d9ee3 | ||
|
4c5d3eddf9 | ||
|
5587562a70 | ||
|
7b220f3db5 | ||
|
9d709f446f | ||
|
83c728a940 | ||
|
eb455ce1c9 | ||
|
6b86a8922b | ||
|
4c252dd80b | ||
|
ec021f5429 | ||
|
29fb87e1d5 | ||
|
fda9049ead | ||
|
277a8b6580 | ||
|
84948462a4 | ||
|
dc11940568 | ||
|
e19f3b5e3a | ||
|
1ac8944294 | ||
|
e43f73e099 | ||
|
70e21d7cf9 | ||
|
bc9d0774f3 | ||
|
2754586fa4 | ||
|
e3da722b66 | ||
|
243ebec887 | ||
|
d8f54c4206 | ||
|
09dc933932 | ||
|
e3e38b81cc | ||
|
4474c042c0 | ||
|
6b4eee408b | ||
|
34a1b6e6b8 | ||
|
46ae90dc5e | ||
|
631f4618a7 | ||
|
4c84b474d1 | ||
|
dad775b798 | ||
|
e219be7440 | ||
|
b1295eeffb | ||
|
867dbac820 | ||
|
c836ad4dc7 | ||
|
1d91c2588c | ||
|
2f29f0ae09 | ||
|
057389cae3 | ||
|
850d573aca | ||
|
788d14a46b | ||
|
bb77cbf05a | ||
|
607b921499 | ||
|
1a56251a35 | ||
|
ced8f73ffc | ||
|
0509072614 | ||
|
c664b66808 | ||
|
4cc160e196 | ||
|
f92b455aa6 | ||
|
f1ce60e7b4 | ||
|
4280c27403 | ||
|
45d92aea27 | ||
|
6b60dddb88 | ||
|
7550bcd89f | ||
|
f8ca3acd29 | ||
|
34dc96ba7f | ||
|
b790da5a0b | ||
|
851cb81ddd | ||
|
f813bd9f8f | ||
|
39f9b43219 | ||
|
65479cb7b1 | ||
|
259dd7e842 | ||
|
db35fe735a | ||
|
a7f300d6ff | ||
|
c950471563 | ||
|
0fa31b2bfa | ||
|
a41090ee6b | ||
|
72002d8898 | ||
|
fda876a149 | ||
|
b7632464b4 | ||
|
04bd614711 | ||
|
40f3586412 | ||
|
315350b2fa | ||
|
b4dd686ab4 | ||
|
a5c30ce623 | ||
|
780793255d | ||
|
599613e4c4 | ||
|
1f077a0183 | ||
|
530ae302bd | ||
|
1673389ef1 | ||
|
5d63097fc2 | ||
|
5a76e633ea | ||
|
cd315dcbad | ||
|
44edefaef6 | ||
|
d571d39923 | ||
|
14c147ea79 | ||
|
99564c3347 | ||
|
fc27ead107 | ||
|
a3dfbe6e52 | ||
|
01d321c2d6 | ||
|
130bb0739a | ||
|
83d6411bf3 | ||
|
bf379715c9 | ||
|
c6f3d700b9 | ||
|
bd850a25f5 | ||
|
292c2c91cf | ||
|
6e93fa41c4 | ||
|
a95d052bdb | ||
|
3c0e0ce2b0 | ||
|
aac9ed8e39 | ||
|
3316062e98 | ||
|
74a636a7a2 | ||
|
0c0f7e2aa8 | ||
|
5d9dbe3ecc | ||
|
abeff7b4fd | ||
|
a30e5af204 | ||
|
e02cb2bb83 | ||
|
8a4b2c573a | ||
|
df56736db9 | ||
|
ed08341234 | ||
|
bd158fc238 | ||
|
df8390790a | ||
|
9f75c5aa85 | ||
|
fce8b6b924 | ||
|
e75cf40e8f | ||
|
ce5160b83b | ||
|
d584321fb4 | ||
|
1f2dbc899b | ||
|
ecc460ab1b | ||
|
975d577a2b | ||
|
0d7199edc8 | ||
|
ca800ea823 | ||
|
089aaa996a | ||
|
8785004c80 | ||
|
eb7f3a3ad1 | ||
|
7bd11fcb59 | ||
|
4c310d78a2 | ||
|
50a37e0135 | ||
|
cb81314b1b | ||
|
3bdaaa5dda | ||
|
93a4fa23d0 | ||
|
750b9e2428 | ||
|
4d813de095 | ||
|
8fcd24b8db | ||
|
ea928a1811 | ||
|
98c01858f2 | ||
|
9819b72d49 | ||
|
a5a2c1d78f | ||
|
4587a3fd07 | ||
|
d58b92ae51 | ||
|
795976ecf5 | ||
|
e9d9e56a6b | ||
|
bfc1299a09 | ||
|
734930f919 | ||
|
2e314a697a | ||
|
59cd5d0e26 | ||
|
51c5ff889c | ||
|
58580da373 | ||
|
c0f95c6f94 | ||
|
9c6940f3bb | ||
|
7c913d821e | ||
|
df5841f0b2 | ||
|
008b5a228b | ||
|
9ec7a47ee8 | ||
|
993d604030 | ||
|
ad88f905ae | ||
|
686a19c9b7 | ||
|
e28286fa05 | ||
|
afaa827860 | ||
|
c2b3e70efd | ||
|
60d95f36c0 | ||
|
0321baf9e8 | ||
|
7332ffb1f0 | ||
|
fd046f6263 | ||
|
daba6653f1 | ||
|
5be6325c1f | ||
|
63448e6059 | ||
|
4f3d20a500 | ||
|
1e5d4ba938 | ||
|
c96dd669a9 | ||
|
447dee19a8 | ||
|
70477613b9 | ||
|
34cdaf4c36 | ||
|
c8bd36e5b9 | ||
|
c0719f062c | ||
|
91bbff217e | ||
|
fd332d146d | ||
|
89db7ce02b | ||
|
f2eeaf7110 | ||
|
4a4a1627c1 | ||
|
0bf5482712 | ||
|
ae9455c274 | ||
|
e0a6e52023 | ||
|
17cc42a45a | ||
|
8db25a2975 | ||
|
a41349dd68 | ||
|
39685f67d7 | ||
|
2937c67429 | ||
|
b155958859 | ||
|
9e260a323b | ||
|
1c4cf0eeb5 | ||
|
460e7dd7c4 | ||
|
4cf072248f | ||
|
f9f3c35eb3 | ||
|
0c7852526b | ||
|
e62d1f13f2 | ||
|
fac876dc7b | ||
|
9372292b29 | ||
|
f933d10fbe | ||
|
04d72c2997 | ||
|
9d4657a9e2 | ||
|
633fdfb510 | ||
|
952638549b | ||
|
89d8e43428 | ||
|
7fecfdbaa8 | ||
|
f7bb8477a8 | ||
|
31dd4998df | ||
|
23d4688cce | ||
|
93007e15ff | ||
|
fe1aaad7fe | ||
|
15f4db6cb1 | ||
|
af62fde5e8 | ||
|
e3f0689d05 | ||
|
cc8ca5b6a5 | ||
|
337a028bb6 | ||
|
b2b65842ea | ||
|
bc3bff165f | ||
|
c0c3aee6b9 | ||
|
431cee60e6 | ||
|
d947308aa1 | ||
|
b0d62dd713 | ||
|
96e2d76491 | ||
|
75b69887aa | ||
|
52ab3b07ac | ||
|
71e5994b1a | ||
|
60bc203346 | ||
|
2d897c8fa2 | ||
|
3a055be925 | ||
|
640c947458 | ||
|
149659b72a | ||
|
858db7a202 | ||
|
4d87527807 | ||
|
bcb32c0b86 | ||
|
297449aaf4 | ||
|
fe1d0a1f5a | ||
|
23f108d471 | ||
|
350d49449b | ||
|
dae50dc56a | ||
|
f17528a1fa | ||
|
1baaedfb3d | ||
|
25dbc8b1ea | ||
|
6005648c2c | ||
|
1d2c7b6c73 | ||
|
ee19a7c346 | ||
|
d94ff4142a | ||
|
07f3cab3dd | ||
|
b9bad65bf3 | ||
|
3b88a4ae87 | ||
|
3d598eecee | ||
|
fb85b4316b | ||
|
8b54280395 | ||
|
c4d70123ac | ||
|
3f59452448 | ||
|
787f3fb163 | ||
|
c531b49d38 | ||
|
530eede12b | ||
|
4d3e4cfa4a | ||
|
a428e42072 | ||
|
e7269aa4f6 | ||
|
87d61e44fa | ||
|
5248f61a34 | ||
|
907a075d7e | ||
|
3c88e1b53d | ||
|
c454b44335 | ||
|
73c8723266 | ||
|
18f336b98a | ||
|
f6b4d188b4 | ||
|
411968d01f | ||
|
37c3d05f57 | ||
|
0798d91f55 | ||
|
3bfc09d548 | ||
|
f184cb6035 | ||
|
34996c31b7 | ||
|
a289d43608 | ||
|
d9ff3ef859 | ||
|
8c88762e3e | ||
|
94bbeb4681 | ||
|
1b7a844fa1 | ||
|
9cb812fab5 | ||
|
11433f78a7 | ||
|
39a2a25f05 | ||
|
2649844cab | ||
|
5270e93803 | ||
|
923314cc88 | ||
|
1bf97d87f5 | ||
|
da7c026ce1 | ||
|
ca21b28287 | ||
|
ca8120cfcc | ||
|
8352d52dd8 | ||
|
bee5213b00 | ||
|
525c6327ab | ||
|
b8e7e892c8 | ||
|
b28ab73d22 | ||
|
142e2fa45e | ||
|
a2e73644be | ||
|
e25c56a861 | ||
|
050c014ac6 | ||
|
f81d44fafa | ||
|
741aa87942 | ||
|
b9bc9904c2 | ||
|
c8b9d41f99 | ||
|
1af7c4cb08 | ||
|
08e9f7011b | ||
|
22d7248c97 | ||
|
4f379f81ce | ||
|
6cb6bd9f21 | ||
|
ebcda12102 | ||
|
679381fba8 | ||
|
05aa0df532 | ||
|
a2c65011c3 | ||
|
0dca5a5bf9 | ||
|
96c469de68 | ||
|
98835fb8f8 | ||
|
7b00595ddf | ||
|
6ab51a0ebd | ||
|
5904279ebd | ||
|
b5bbdb0967 | ||
|
c44ca26fe8 | ||
|
9ac84f8f3f | ||
|
3b001ca6ba | ||
|
c6fa9c71a5 | ||
|
f174d36380 | ||
|
37e0e1ff86 | ||
|
9c4be5f654 | ||
|
b4235ac79c | ||
|
1aa6500056 | ||
|
e0e54661f7 | ||
|
683412b23f | ||
|
58860c021f | ||
|
13d6d17262 | ||
|
86fcd879b3 | ||
|
1affbd8717 | ||
|
4f032cd9af | ||
|
22e7fa6aef | ||
|
5caf516976 | ||
|
78aee1b15f | ||
|
643a02bc9c | ||
|
53387e5f55 | ||
|
e90292b2a6 | ||
|
1327e6f470 | ||
|
7377eb2b03 | ||
|
a86e6d8db2 | ||
|
5d35e60900 | ||
|
57170b9343 | ||
|
5699b920bf | ||
|
708296e583 | ||
|
161b937740 | ||
|
14e74f6a21 | ||
|
1fc416be21 | ||
|
a15df74146 | ||
|
337ec3065f | ||
|
82133ba00b | ||
|
08b1c718e4 | ||
|
4bc1657853 | ||
|
30e55aecc1 | ||
|
7645a3d03d | ||
|
f9fc56c42a | ||
|
1a58673508 | ||
|
e298ce5fd0 | ||
|
74638a253e | ||
|
65a595dea8 | ||
|
01d1750477 | ||
|
9b8da104c1 | ||
|
96a9d97352 | ||
|
7c3f7c6a09 | ||
|
6e11540b32 | ||
|
0c9999f6d0 | ||
|
a098e80933 | ||
|
4041ed4c0d | ||
|
9befe47924 | ||
|
9d30a98893 | ||
|
fa6428ed2a | ||
|
85c1adf9f9 | ||
|
64958cdb1d | ||
|
a7eaf36967 | ||
|
13a41246dd | ||
|
d00cab0f8c | ||
|
df6088a7e8 | ||
|
5a17660ca0 | ||
|
e514f232a0 | ||
|
48811b2edd | ||
|
11d6cb56d0 | ||
|
588a803d58 | ||
|
b9649765f8 | ||
|
52e491b3bb | ||
|
8ee6f568ea | ||
|
de028631fc | ||
|
047419a172 | ||
|
c0a6a6b462 | ||
|
b6dec9b8d4 | ||
|
dd45c0b9fd | ||
|
8c93606357 | ||
|
78a6d310de | ||
|
e721ce66cf | ||
|
8335b7d93e | ||
|
3a674ffe05 | ||
|
eedc7be680 | ||
|
7e627738b3 | ||
|
c32b9dd474 | ||
|
f5c7a4896d | ||
|
4fd4471de2 | ||
|
2e66a61b54 | ||
|
1760feb621 | ||
|
1e6dc7d2c3 | ||
|
d4213d839f | ||
|
3d9d1a1255 | ||
|
c4a84abcb6 | ||
|
bba446bbf2 | ||
|
08951c3c3a | ||
|
4d04fcdaf6 | ||
|
b97a4a53cd | ||
|
866d3e5327 | ||
|
569d5ce65b | ||
|
290d26b462 | ||
|
93362a5aa5 | ||
|
80f65d2df8 | ||
|
b5794ed024 | ||
|
7437774a27 | ||
|
ff2a6600e5 | ||
|
8b301451bc | ||
|
45d04d0296 | ||
|
584917fe84 | ||
|
564c02f5cb | ||
|
a877fdfafe | ||
|
116596a4e6 | ||
|
62f2ff86b5 | ||
|
a989501f47 | ||
|
42ab9b4442 | ||
|
549dde1928 | ||
|
e505098875 | ||
|
e389165586 | ||
|
4763e64eb1 | ||
|
d9ccf4d0b1 | ||
|
81564101ee | ||
|
336ee28b34 | ||
|
f9d93f358d | ||
|
bbeb983bac | ||
|
f8c37b97da | ||
|
a2484208c3 | ||
|
cd561dddc9 | ||
|
ff85a1735f | ||
|
a0df678df9 | ||
|
17d601a2b6 | ||
|
91b6d04e2d | ||
|
27c8962505 | ||
|
ca5b7751e5 | ||
|
ac3df39c22 | ||
|
30bbbe99e2 | ||
|
1a6c1d092d | ||
|
237f321e33 | ||
|
56b8f44eed | ||
|
32fadc0d49 | ||
|
1102a8a767 | ||
|
a375e1acfd | ||
|
e30b7b4461 | ||
|
f1f30b53cc | ||
|
ddf6d1eb75 | ||
|
faea19c359 | ||
|
c59473d53e | ||
|
6d134eac6f | ||
|
ea081fe220 | ||
|
0dca3cc5d6 | ||
|
dedd8aec0d | ||
|
3886860aa4 | ||
|
cf42b608e0 | ||
|
eefd1fdd48 | ||
|
3916a0aa99 | ||
|
8d8115bf52 | ||
|
e0779d5a64 | ||
|
3cec2ea8d6 | ||
|
30647cae9f | ||
|
ff46627725 | ||
|
7d275ec168 | ||
|
00d5a7f099 | ||
|
275db044b2 | ||
|
6b3d120539 | ||
|
1112989a1b | ||
|
915d79efa8 | ||
|
3ef07568cd | ||
|
e139117108 | ||
|
169d0ca43c | ||
|
c4790429fc | ||
|
baa4023cd5 | ||
|
f3449e5f57 | ||
|
811674f479 | ||
|
42e54876be | ||
|
7e93458bb7 | ||
|
6a59ac94e1 | ||
|
9a11ab4f4f | ||
|
a2174089b2 | ||
|
c466f4b539 | ||
|
a207a2bd00 | ||
|
e3094a8d80 | ||
|
de30c56391 | ||
|
e3fac65add | ||
|
2662fd3d0c | ||
|
1b1a8f4017 | ||
|
33d2b2a04f | ||
|
38c5f2f3e6 | ||
|
e8ae137c96 | ||
|
e7982e409d | ||
|
e0d817e0de | ||
|
4e169bf0e5 | ||
|
86535a1ce7 | ||
|
be78976ac8 | ||
|
af2fa056f7 | ||
|
a8aae8989c | ||
|
e67204752f | ||
|
7ba044a1c0 | ||
|
7c9c314ca7 | ||
|
0750797db4 | ||
|
54feb9ac24 | ||
|
b1aac0b4ed | ||
|
032fb914e2 | ||
|
154e278a2f | ||
|
b6b521b6b7 | ||
|
12581b4c8e | ||
|
234ec01795 | ||
|
43b36dd983 | ||
|
f11a4f1fe4 | ||
|
b3b07cd851 | ||
|
ba52f2b678 | ||
|
c43f71886d | ||
|
97e20261ac | ||
|
6d92233e72 | ||
|
6cab568e0b | ||
|
b553b87b26 | ||
|
b1cecb6762 | ||
|
0973822d03 | ||
|
5a6c921217 | ||
|
a17367f44a | ||
|
fb7a7c5f1f | ||
|
4f19797baf | ||
|
868ea59256 | ||
|
b6cd9dd759 | ||
|
44bd6bda58 | ||
|
d07a9963df | ||
|
9e3c98f17b | ||
|
3a1259cb45 | ||
|
0622030332 | ||
|
1b3796c890 | ||
|
fdd970e4ed | ||
|
9702b9f785 | ||
|
c2ced9ad48 | ||
|
9009662b71 | ||
|
16adea3ddc | ||
|
4ddaad4f3a | ||
|
de5236dc9f | ||
|
2ff93494a7 | ||
|
20fbb357d0 | ||
|
2ba058c66c | ||
|
ff7f68ae9f | ||
|
ad49ed78f3 | ||
|
30d8416c1c | ||
|
a4f68b16a0 | ||
|
af8732ec11 | ||
|
e465f26310 | ||
|
dd3d9d65e5 | ||
|
73e0b49272 | ||
|
deaea21315 | ||
|
60cb094b7b | ||
|
36adb40064 | ||
|
2e30301837 | ||
|
e4b129f304 | ||
|
db1b2a06e3 | ||
|
970a4fda17 | ||
|
77b08afaf8 | ||
|
e0e7377119 | ||
|
24ac9c0cb4 | ||
|
fa52702408 | ||
|
7429b91eda | ||
|
2078f614e4 | ||
|
923eae8b16 | ||
|
56855f6f00 | ||
|
82b43d1f41 | ||
|
b6a620da13 | ||
|
2e98ed5d17 | ||
|
3d9726f919 | ||
|
b99577c5ac | ||
|
f6d1d1a17e | ||
|
1349fb8b14 | ||
|
3a8d8ead4f | ||
|
1bce70dddb | ||
|
0b6825516b | ||
|
e1f146bc4f | ||
|
b5ce5251fd | ||
|
5e0de1ebee | ||
|
2ee1e52380 | ||
|
b053b9211b | ||
|
d9334ea8d9 | ||
|
10a8fb4e73 | ||
|
4e0d05138a | ||
|
c2ebdec355 | ||
|
8b659b226a | ||
|
047a3b4852 | ||
|
dd37b992be | ||
|
932f94e16e | ||
|
06a02488ce | ||
|
7a7913e442 | ||
|
443eb27c7c | ||
|
9086d96439 | ||
|
042993b3dd | ||
|
8eb90e380c | ||
|
5520447a78 | ||
|
70c1ac756d | ||
|
0d079bca76 | ||
|
790e6afb72 | ||
|
3560cc9ede | ||
|
297ec746cd | ||
|
8779cba302 | ||
|
3df146e198 | ||
|
c404c2a2e3 | ||
|
8c23655519 | ||
|
8b00675fc8 | ||
|
03d9e096d9 | ||
|
c850ebcafa | ||
|
e9a7fc837f | ||
|
57638d58e1 | ||
|
eaf3451cbb | ||
|
be0d7f6664 | ||
|
0d5091ee88 | ||
|
d84d0ca13e | ||
|
a29a9c5d49 | ||
|
c10938a1d9 | ||
|
c64d86ed4f | ||
|
ec4589736e | ||
|
523bfd4f23 | ||
|
c53484539c | ||
|
ada0a81a74 | ||
|
d2ae496623 | ||
|
3808d091f8 | ||
|
cae3b0cbb6 | ||
|
02b55d248f | ||
|
e102db1f05 | ||
|
aeff638a4c | ||
|
7e8c893003 | ||
|
454dbf16fc | ||
|
2fe0556c7a | ||
|
69cc213c76 | ||
|
b83af525db | ||
|
6cfc19edde | ||
|
31999a3f95 | ||
|
80694669e4 | ||
|
5977fb0a05 | ||
|
fd1c289886 |
1027 changed files with 133046 additions and 43266 deletions
47
.gitignore
vendored
47
.gitignore
vendored
|
@ -47,6 +47,7 @@ any_test.pb.*
|
|||
map*unittest.pb.*
|
||||
unittest*.pb.*
|
||||
cpp_test*.pb.*
|
||||
src/google/protobuf/compiler/js/well_known_types_embed.cc
|
||||
src/google/protobuf/util/**/*.pb.cc
|
||||
src/google/protobuf/util/**/*.pb.h
|
||||
|
||||
|
@ -60,10 +61,16 @@ python/build/
|
|||
python/google/protobuf/compiler/
|
||||
python/google/protobuf/util/
|
||||
|
||||
src/js_embed
|
||||
src/protoc
|
||||
src/unittest_proto_middleman
|
||||
|
||||
# vim generated
|
||||
*.swp
|
||||
|
||||
# Generated test scaffolding
|
||||
src/no_warning_test.cc
|
||||
src/no-warning-test
|
||||
src/protobuf*-test
|
||||
src/test_plugin
|
||||
src/testzip.*
|
||||
|
@ -77,7 +84,8 @@ src/**/*.log
|
|||
src/**/*.trs
|
||||
|
||||
# JavaBuild output.
|
||||
java/target
|
||||
java/core/target
|
||||
java/util/target
|
||||
javanano/target
|
||||
|
||||
# Windows native output.
|
||||
|
@ -108,8 +116,43 @@ conformance/conformance.pb.cc
|
|||
conformance/conformance.pb.h
|
||||
conformance/Conformance.pbobjc.h
|
||||
conformance/Conformance.pbobjc.m
|
||||
conformance/conformance.rb
|
||||
conformance/conformance_pb.js
|
||||
conformance/conformance_pb.rb
|
||||
conformance/failing_tests.txt
|
||||
conformance/google/
|
||||
conformance/google-protobuf/
|
||||
conformance/javac_middleman
|
||||
conformance/lite/
|
||||
conformance/nonexistent_tests.txt
|
||||
conformance/protoc_middleman
|
||||
conformance/succeeding_tests.txt
|
||||
conformance/Conformance/
|
||||
conformance/GPBMetadata/
|
||||
conformance/Google/
|
||||
conformance/Protobuf_test_messages/
|
||||
conformance/conformance-php
|
||||
conformance/conformance-php-c
|
||||
|
||||
# php test output
|
||||
composer.lock
|
||||
php/tests/generated/
|
||||
php/ext/google/protobuf/.libs/
|
||||
php/ext/google/protobuf/Makefile.fragments
|
||||
php/ext/google/protobuf/Makefile.global
|
||||
php/ext/google/protobuf/Makefile.objects
|
||||
php/ext/google/protobuf/acinclude.m4
|
||||
php/ext/google/protobuf/build/
|
||||
php/ext/google/protobuf/config.h
|
||||
php/ext/google/protobuf/config.nice
|
||||
php/ext/google/protobuf/configure.in
|
||||
php/ext/google/protobuf/mkinstalldirs
|
||||
php/ext/google/protobuf/run-tests.php
|
||||
vendor/
|
||||
|
||||
# JavaScript artifacts
|
||||
js/commonjs_out/
|
||||
js/deps.js
|
||||
js/google-protobuf.js
|
||||
js/google/
|
||||
js/node_modules/
|
||||
js/testproto_libs.js
|
||||
|
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
[submodule "third_party/benchmark"]
|
||||
path = third_party/benchmark
|
||||
url = https://github.com/google/benchmark.git
|
40
.travis.yml
40
.travis.yml
|
@ -1,25 +1,22 @@
|
|||
sudo: required
|
||||
dist: trusty
|
||||
# Note: travis currently does not support listing more than one language so
|
||||
# this cheats and claims to only be cpp. If they add multiple language
|
||||
# support, this should probably get updated to install steps and/or
|
||||
# rvm/gemfile/jdk/etc. entries rather than manually doing the work.
|
||||
language: cpp
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
# The Objective C build needs Xcode 7.0 or later.
|
||||
osx_image: xcode7.3
|
||||
osx_image: xcode8.1
|
||||
script:
|
||||
- ./tests.sh $CONFIG
|
||||
env:
|
||||
- CONFIG=cpp
|
||||
- CONFIG=cpp_distcheck
|
||||
- CONFIG=csharp
|
||||
- CONFIG=golang
|
||||
- CONFIG=java_jdk6
|
||||
- CONFIG=java_jdk7
|
||||
- CONFIG=java_oracle7
|
||||
- CONFIG=javanano_jdk6
|
||||
- CONFIG=javanano_jdk7
|
||||
- CONFIG=javanano_oracle7
|
||||
- CONFIG=javascript
|
||||
|
@ -31,45 +28,46 @@ env:
|
|||
- CONFIG=objectivec_cocoapods_integration
|
||||
- CONFIG=python
|
||||
- CONFIG=python_cpp
|
||||
- CONFIG=ruby19
|
||||
- CONFIG=ruby20
|
||||
- CONFIG=ruby21
|
||||
- CONFIG=ruby22
|
||||
- CONFIG=jruby
|
||||
- CONFIG=php5.6_mac
|
||||
- CONFIG=php7.0_mac
|
||||
matrix:
|
||||
exclude:
|
||||
# It's nontrivial to programmatically install a new JDK from the command
|
||||
# line on OS X, so we rely on testing on Linux for Java code.
|
||||
- os: osx
|
||||
env: CONFIG=java_jdk6
|
||||
- os: osx
|
||||
env: CONFIG=java_jdk7
|
||||
- os: osx
|
||||
env: CONFIG=java_oracle7
|
||||
- os: osx
|
||||
env: CONFIG=javanano_jdk6
|
||||
- os: osx
|
||||
env: CONFIG=javanano_jdk7
|
||||
- os: osx
|
||||
env: CONFIG=javanano_oracle7
|
||||
# Requires installing mono, currently travis.sh is doing that with apt-get
|
||||
# which doesn't work on OS X.
|
||||
- os: osx
|
||||
env: CONFIG=csharp
|
||||
# Requires installing golang, currently travis.sh is doing that with apt-get
|
||||
# which doesn't work on OS X.
|
||||
- os: osx
|
||||
env: CONFIG=golang
|
||||
# OS X/iOS tests of Objective C (needs Xcode, so it won't work on other
|
||||
# platforms).
|
||||
include:
|
||||
# The dotnet environment requires Ubuntu 14.04 or 16.04. This
|
||||
# configuration is effectively an "extra" one, outside the
|
||||
# autogenerated matrix.
|
||||
- os: linux
|
||||
env: CONFIG=objectivec_ios_debug
|
||||
env: CONFIG=csharp
|
||||
dist: trusty
|
||||
# This test is kept on travis because it doesn't play nicely with other
|
||||
# tests on jenkins running in parallel.
|
||||
- os: linux
|
||||
env: CONFIG=objectivec_ios_release
|
||||
env: CONFIG=cpp_distcheck
|
||||
# The Java compatibility test currently only runs on Linux because it will
|
||||
# fetch pre-built Linux protoc binaries in the test.
|
||||
- os: linux
|
||||
env: CONFIG=objectivec_osx
|
||||
env: CONFIG=java_compatibility
|
||||
# The Python compatibility test currently only runs on Linux because it will
|
||||
# fetch pre-built Linux protoc binaries in the test.
|
||||
- os: linux
|
||||
env: CONFIG=objectivec_cocoapods_integration
|
||||
env: CONFIG=python_compatibility
|
||||
allow_failures:
|
||||
# These currently do not work on OS X but are being worked on by @haberman.
|
||||
- os: osx
|
||||
|
|
87
BUILD
87
BUILD
|
@ -2,6 +2,8 @@
|
|||
|
||||
licenses(["notice"])
|
||||
|
||||
exports_files(["LICENSE"])
|
||||
|
||||
################################################################################
|
||||
# Protobuf Runtime Library
|
||||
################################################################################
|
||||
|
@ -12,7 +14,7 @@ COPTS = [
|
|||
"-Wwrite-strings",
|
||||
"-Woverloaded-virtual",
|
||||
"-Wno-sign-compare",
|
||||
"-Wno-error=unused-function",
|
||||
"-Wno-unused-function",
|
||||
]
|
||||
|
||||
config_setting(
|
||||
|
@ -25,11 +27,11 @@ config_setting(
|
|||
# Android builds do not need to link in a separate pthread library.
|
||||
LINK_OPTS = select({
|
||||
":android": [],
|
||||
"//conditions:default": ["-lpthread"],
|
||||
"//conditions:default": ["-lpthread", "-lm"],
|
||||
})
|
||||
|
||||
load(
|
||||
"protobuf",
|
||||
":protobuf.bzl",
|
||||
"cc_proto_library",
|
||||
"py_proto_library",
|
||||
"internal_copied_filegroup",
|
||||
|
@ -143,6 +145,7 @@ cc_library(
|
|||
"src/google/protobuf/timestamp.pb.cc",
|
||||
"src/google/protobuf/type.pb.cc",
|
||||
"src/google/protobuf/unknown_field_set.cc",
|
||||
"src/google/protobuf/util/delimited_message_util.cc",
|
||||
"src/google/protobuf/util/field_comparator.cc",
|
||||
"src/google/protobuf/util/field_mask_util.cc",
|
||||
"src/google/protobuf/util/internal/datapiece.cc",
|
||||
|
@ -179,6 +182,17 @@ cc_library(
|
|||
deps = [":protobuf_lite"],
|
||||
)
|
||||
|
||||
# This provides just the header files for use in projects that need to build
|
||||
# shared libraries for dynamic loading. This target is available until Bazel
|
||||
# adds native support for such use cases.
|
||||
# TODO(keveman): Remove this target once the support gets added to Bazel.
|
||||
cc_library(
|
||||
name = "protobuf_headers",
|
||||
hdrs = glob(["src/**/*.h"]),
|
||||
includes = ["src/"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
objc_library(
|
||||
name = "protobuf_objc",
|
||||
hdrs = ["objectivec/GPBProtocolBuffers.h"],
|
||||
|
@ -192,6 +206,7 @@ RELATIVE_WELL_KNOWN_PROTOS = [
|
|||
"google/protobuf/any.proto",
|
||||
"google/protobuf/api.proto",
|
||||
"google/protobuf/compiler/plugin.proto",
|
||||
"google/protobuf/compiler/profile.proto",
|
||||
"google/protobuf/descriptor.proto",
|
||||
"google/protobuf/duration.proto",
|
||||
"google/protobuf/empty.proto",
|
||||
|
@ -225,6 +240,24 @@ cc_proto_library(
|
|||
# Protocol Buffers Compiler
|
||||
################################################################################
|
||||
|
||||
cc_binary(
|
||||
name = "js_embed",
|
||||
srcs = ["src/google/protobuf/compiler/js/embed.cc"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
genrule(
|
||||
name = "generate_js_well_known_types_embed",
|
||||
srcs = [
|
||||
"src/google/protobuf/compiler/js/well_known_types/any.js",
|
||||
"src/google/protobuf/compiler/js/well_known_types/struct.js",
|
||||
"src/google/protobuf/compiler/js/well_known_types/timestamp.js",
|
||||
],
|
||||
outs = ["src/google/protobuf/compiler/js/well_known_types_embed.cc"],
|
||||
cmd = "$(location :js_embed) $(SRCS) > $@",
|
||||
tools = [":js_embed"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "protoc_lib",
|
||||
srcs = [
|
||||
|
@ -302,6 +335,7 @@ cc_library(
|
|||
"src/google/protobuf/compiler/javanano/javanano_message_field.cc",
|
||||
"src/google/protobuf/compiler/javanano/javanano_primitive_field.cc",
|
||||
"src/google/protobuf/compiler/js/js_generator.cc",
|
||||
"src/google/protobuf/compiler/js/well_known_types_embed.cc",
|
||||
"src/google/protobuf/compiler/objectivec/objectivec_enum.cc",
|
||||
"src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc",
|
||||
"src/google/protobuf/compiler/objectivec/objectivec_extension.cc",
|
||||
|
@ -314,8 +348,10 @@ cc_library(
|
|||
"src/google/protobuf/compiler/objectivec/objectivec_message_field.cc",
|
||||
"src/google/protobuf/compiler/objectivec/objectivec_oneof.cc",
|
||||
"src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc",
|
||||
"src/google/protobuf/compiler/php/php_generator.cc",
|
||||
"src/google/protobuf/compiler/plugin.cc",
|
||||
"src/google/protobuf/compiler/plugin.pb.cc",
|
||||
"src/google/protobuf/compiler/profile.pb.cc",
|
||||
"src/google/protobuf/compiler/python/python_generator.cc",
|
||||
"src/google/protobuf/compiler/ruby/ruby_generator.cc",
|
||||
"src/google/protobuf/compiler/subprocess.cc",
|
||||
|
@ -367,6 +403,9 @@ RELATIVE_TEST_PROTOS = [
|
|||
"google/protobuf/unittest_enormous_descriptor.proto",
|
||||
"google/protobuf/unittest_import.proto",
|
||||
"google/protobuf/unittest_import_public.proto",
|
||||
"google/protobuf/unittest_lazy_dependencies.proto",
|
||||
"google/protobuf/unittest_lazy_dependencies_custom_option.proto",
|
||||
"google/protobuf/unittest_lazy_dependencies_enum.proto",
|
||||
"google/protobuf/unittest_lite_imports_nonlite.proto",
|
||||
"google/protobuf/unittest_mset.proto",
|
||||
"google/protobuf/unittest_mset_wire_format.proto",
|
||||
|
@ -388,8 +427,10 @@ RELATIVE_TEST_PROTOS = [
|
|||
"google/protobuf/util/internal/testdata/field_mask.proto",
|
||||
"google/protobuf/util/internal/testdata/maps.proto",
|
||||
"google/protobuf/util/internal/testdata/oneofs.proto",
|
||||
"google/protobuf/util/internal/testdata/proto3.proto",
|
||||
"google/protobuf/util/internal/testdata/struct.proto",
|
||||
"google/protobuf/util/internal/testdata/timestamp_duration.proto",
|
||||
"google/protobuf/util/internal/testdata/wrappers.proto",
|
||||
"google/protobuf/util/json_format_proto3.proto",
|
||||
"google/protobuf/util/message_differencer_unittest.proto",
|
||||
]
|
||||
|
@ -441,6 +482,7 @@ cc_test(
|
|||
"src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc",
|
||||
"src/google/protobuf/compiler/cpp/cpp_unittest.cc",
|
||||
"src/google/protobuf/compiler/cpp/metadata_test.cc",
|
||||
"src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc",
|
||||
"src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc",
|
||||
"src/google/protobuf/compiler/importer_unittest.cc",
|
||||
"src/google/protobuf/compiler/java/java_doc_comment_unittest.cc",
|
||||
|
@ -486,6 +528,7 @@ cc_test(
|
|||
"src/google/protobuf/stubs/type_traits_unittest.cc",
|
||||
"src/google/protobuf/text_format_unittest.cc",
|
||||
"src/google/protobuf/unknown_field_set_unittest.cc",
|
||||
"src/google/protobuf/util/delimited_message_util_test.cc",
|
||||
"src/google/protobuf/util/field_comparator_test.cc",
|
||||
"src/google/protobuf/util/field_mask_util_test.cc",
|
||||
"src/google/protobuf/util/internal/default_value_objectwriter_test.cc",
|
||||
|
@ -506,6 +549,10 @@ cc_test(
|
|||
":test_plugin",
|
||||
] + glob([
|
||||
"src/google/protobuf/**/*",
|
||||
# Files for csharp_bootstrap_unittest.cc.
|
||||
"conformance/**/*",
|
||||
"csharp/src/**/*",
|
||||
"examples/**/*",
|
||||
]),
|
||||
includes = [
|
||||
"src/",
|
||||
|
@ -533,6 +580,7 @@ java_library(
|
|||
]) + [
|
||||
":gen_well_known_protos_java",
|
||||
],
|
||||
javacopts = ["-source 6"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
|
@ -541,12 +589,12 @@ java_library(
|
|||
srcs = glob([
|
||||
"java/util/src/main/java/com/google/protobuf/util/*.java",
|
||||
]),
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"protobuf_java",
|
||||
"//external:gson",
|
||||
"//external:guava",
|
||||
],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
################################################################################
|
||||
|
@ -567,12 +615,12 @@ py_library(
|
|||
"python/google/protobuf/internal/test_util.py",
|
||||
],
|
||||
),
|
||||
srcs_version = "PY2AND3",
|
||||
imports = ["python"],
|
||||
srcs_version = "PY2AND3",
|
||||
)
|
||||
|
||||
cc_binary(
|
||||
name = "internal/_api_implementation.so",
|
||||
name = "python/google/protobuf/internal/_api_implementation.so",
|
||||
srcs = ["python/google/protobuf/internal/api_implementation.cc"],
|
||||
copts = COPTS + [
|
||||
"-DPYTHON_PROTO2_CPP_IMPL_V2",
|
||||
|
@ -586,7 +634,7 @@ cc_binary(
|
|||
)
|
||||
|
||||
cc_binary(
|
||||
name = "pyext/_message.so",
|
||||
name = "python/google/protobuf/pyext/_message.so",
|
||||
srcs = glob([
|
||||
"python/google/protobuf/pyext/*.cc",
|
||||
"python/google/protobuf/pyext/*.h",
|
||||
|
@ -633,8 +681,8 @@ config_setting(
|
|||
internal_copied_filegroup(
|
||||
name = "protos_python",
|
||||
srcs = WELL_KNOWN_PROTOS,
|
||||
strip_prefix = "src",
|
||||
dest = "python",
|
||||
strip_prefix = "src",
|
||||
)
|
||||
|
||||
# TODO(dzc): Remove this once py_proto_library can have labels in srcs, in
|
||||
|
@ -648,15 +696,15 @@ py_proto_library(
|
|||
data = select({
|
||||
"//conditions:default": [],
|
||||
":use_fast_cpp_protos": [
|
||||
":internal/_api_implementation.so",
|
||||
":pyext/_message.so",
|
||||
":python/google/protobuf/internal/_api_implementation.so",
|
||||
":python/google/protobuf/pyext/_message.so",
|
||||
],
|
||||
}),
|
||||
default_runtime = "",
|
||||
protoc = ":protoc",
|
||||
py_libs = [
|
||||
":python_srcs",
|
||||
"//external:six"
|
||||
"//external:six",
|
||||
],
|
||||
srcs_version = "PY2AND3",
|
||||
visibility = ["//visibility:public"],
|
||||
|
@ -670,13 +718,14 @@ py_proto_library(
|
|||
internal_copied_filegroup(
|
||||
name = "protos_python_test",
|
||||
srcs = LITE_TEST_PROTOS + TEST_PROTOS,
|
||||
strip_prefix = "src",
|
||||
dest = "python",
|
||||
strip_prefix = "src",
|
||||
)
|
||||
|
||||
# TODO(dzc): Remove this once py_proto_library can have labels in srcs, in
|
||||
# which case we can simply add :protos_python_test in srcs.
|
||||
COPIED_LITE_TEST_PROTOS = ["python/" + s for s in RELATIVE_LITE_TEST_PROTOS]
|
||||
|
||||
COPIED_TEST_PROTOS = ["python/" + s for s in RELATIVE_TEST_PROTOS]
|
||||
|
||||
py_proto_library(
|
||||
|
@ -744,3 +793,17 @@ internal_protobuf_py_tests(
|
|||
],
|
||||
deps = [":python_tests"],
|
||||
)
|
||||
|
||||
proto_lang_toolchain(
|
||||
name = "cc_toolchain",
|
||||
command_line = "--cpp_out=$(OUT)",
|
||||
runtime = ":protobuf",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
||||
proto_lang_toolchain(
|
||||
name = "java_toolchain",
|
||||
command_line = "--java_out=$(OUT)",
|
||||
runtime = ":protobuf_java",
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
||||
|
|
414
CHANGES.txt
414
CHANGES.txt
|
@ -1,3 +1,415 @@
|
|||
2017-04-05 version 3.3.0 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
|
||||
Planned Future Changes
|
||||
* There are some changes that are not included in this release but are
|
||||
planned for the near future:
|
||||
- Preserve unknown fields in proto3: please read this doc:
|
||||
|
||||
https://docs.google.com/document/d/1KMRX-G91Aa-Y2FkEaHeeviLRRNblgIahbsk4wA14gRk/view
|
||||
|
||||
for the timeline and follow up this github issue:
|
||||
|
||||
https://github.com/google/protobuf/issues/272
|
||||
|
||||
for discussion.
|
||||
- Make C++ implementation C++11 only: we plan to require C++11 to build
|
||||
protobuf code starting from 3.4.0 or 3.5.0 release. Please join this
|
||||
github issue:
|
||||
|
||||
https://github.com/google/protobuf/issues/2780
|
||||
|
||||
to provide your feedback.
|
||||
|
||||
C++
|
||||
* Fixed map fields serialization of DynamicMessage to correctly serialize
|
||||
both key and value regardless of their presence.
|
||||
* Parser now rejects field number 0 correctly.
|
||||
* New API Message::SpaceUsedLong() that’s equivalent to
|
||||
Message::SpaceUsed() but returns the value in size_t.
|
||||
* JSON support
|
||||
- New flag always_print_enums_as_ints in JsonPrintOptions.
|
||||
- New flag preserve_proto_field_names in JsonPrintOptions. It will instruct
|
||||
the JSON printer to use the original field name declared in the .proto
|
||||
file instead of converting them to lowerCamelCase when printing JSON.
|
||||
- JsonPrintOptions.always_print_primtive_fields now works for oneof message
|
||||
fields.
|
||||
- Fixed a bug that doesn’t allow different fields to set the same json_name
|
||||
value.
|
||||
- Fixed a performance bug that causes excessive memory copy when printing
|
||||
large messages.
|
||||
* Various performance optimizations.
|
||||
|
||||
Java
|
||||
* Map field setters eagerly validate inputs and throw NullPointerExceptions
|
||||
as appropriate.
|
||||
* Added ByteBuffer overloads to the generated parsing methods and the Parser
|
||||
interface.
|
||||
* proto3 enum's getNumber() method now throws on UNRECOGNIZED values.
|
||||
* Output of JsonFormat is now locale independent.
|
||||
|
||||
Python
|
||||
* Added FindServiceByName() in the pure-Python DescriptorPool. This works only
|
||||
for descriptors added with DescriptorPool.Add(). Generated descriptor_pool
|
||||
does not support this yet.
|
||||
* Added a descriptor_pool parameter for parsing Any in text_format.Parse().
|
||||
* descriptor_pool.FindFileContainingSymbol() now is able to find nested
|
||||
extensions.
|
||||
* Extending empty [] to repeated field now sets parent message presence.
|
||||
|
||||
PHP
|
||||
* Added file option php_class_prefix. The prefix will be prepended to all
|
||||
generated classes defined in the file.
|
||||
* When encoding, negative int32 values are sign-extended to int64.
|
||||
* Repeated/Map field setter accepts a regular PHP array. Type checking is
|
||||
done on the array elements.
|
||||
* encode/decode are renamed to serializeToString/mergeFromString.
|
||||
* Added mergeFrom, clear method on Message.
|
||||
* Fixed a bug that oneof accessor didn’t return the field name that is
|
||||
actually set.
|
||||
* C extension now works with php7.
|
||||
* This is the first GA release of PHP. We guarantee that old generated code
|
||||
can always work with new runtime and new generated code.
|
||||
|
||||
Objective-C
|
||||
* Fixed help for GPBTimestamp for dates before the epoch that contain
|
||||
fractional seconds.
|
||||
* Added GPBMessageDropUnknownFieldsRecursively() to remove unknowns from a
|
||||
message and any sub messages.
|
||||
* Addressed a threading race in extension registration/lookup.
|
||||
* Increased the max message parsing depth to 100 to match the other languages.
|
||||
* Removed some use of dispatch_once in favor of atomic compare/set since it
|
||||
needs to be heap based.
|
||||
* Fixes for new Xcode 8.3 warnings.
|
||||
|
||||
C#
|
||||
* Fixed MapField.Values.CopyTo, which would throw an exception unnecessarily
|
||||
if provided exactly the right size of array to copy to.
|
||||
* Fixed enum JSON formatting when multiple names mapped to the same numeric
|
||||
value.
|
||||
* Added JSON formatting option to format enums as integers.
|
||||
* Modified RepeatedField<T> to implement IReadOnlyList<T>.
|
||||
* Introduced the start of custom option handling; it's not as pleasant as it
|
||||
might be, but the information is at least present. We expect to extend code
|
||||
generation to improve this in the future.
|
||||
* Introduced ByteString.FromStream and ByteString.FromStreamAsync to
|
||||
efficiently create a ByteString from a stream.
|
||||
* Added whole-message deprecation, which decorates the class with [Obsolete].
|
||||
|
||||
Ruby
|
||||
* Fixed Message#to_h for messages with map fields.
|
||||
* Fixed memcpy() in binary gems to work for old glibc, without breaking the
|
||||
build for non-glibc libc’s like musl.
|
||||
|
||||
Javascript
|
||||
* Added compatibility tests for version 3.0.0.
|
||||
* Added conformance tests.
|
||||
* Fixed serialization of extensions: we need to emit a value even if it is
|
||||
falsy (like the number 0).
|
||||
* Use closurebuilder.py in favor of calcdeps.py for compiling JavaScript.
|
||||
|
||||
2017-01-23 version 3.2.0 (C++/Java/Python/PHP/Ruby/Objective-C/C#/JavaScript/Lite)
|
||||
General
|
||||
* Added protoc version number to protoc plugin protocol. It can be used by
|
||||
protoc plugin to detect which version of protoc is used with the plugin and
|
||||
mitigate known problems in certain version of protoc.
|
||||
|
||||
C++
|
||||
* The default parsing byte size limit has been raised from 64MB to 2GB.
|
||||
* Added rvalue setters for non-arena string fields.
|
||||
* Enabled debug logging for Android.
|
||||
* Fixed a double-free problem when using Reflection::SetAllocatedMessage()
|
||||
with extension fields.
|
||||
* Fixed several deterministic serialization bugs:
|
||||
* MessageLite::SerializeAsString() now respects the global deterministic
|
||||
serialization flag.
|
||||
* Extension fields are serialized deterministically as well. Fixed protocol
|
||||
compiler to correctly report importing-self as an error.
|
||||
* Fixed FileDescriptor::DebugString() to print custom options correctly.
|
||||
* Various performance/codesize optimizations and cleanups.
|
||||
|
||||
Java
|
||||
* The default parsing byte size limit has been raised from 64MB to 2GB.
|
||||
* Added recursion limit when parsing JSON.
|
||||
* Fixed a bug that enumType.getDescriptor().getOptions() doesn't have custom
|
||||
options.
|
||||
* Fixed generated code to support field numbers up to 2^29-1.
|
||||
|
||||
Python
|
||||
* You can now assign NumPy scalars/arrays (np.int32, np.int64) to protobuf
|
||||
fields, and assigning other numeric types has been optimized for
|
||||
performance.
|
||||
* Pure-Python: message types are now garbage-collectable.
|
||||
* Python/C++: a lot of internal cleanup/refactoring.
|
||||
|
||||
PHP (Alpha)
|
||||
* For 64-bit integers type (int64/uint64/sfixed64/fixed64/sint64), use PHP
|
||||
integer on 64-bit environment and PHP string on 32-bit environment.
|
||||
* PHP generated code also conforms to PSR-4 now.
|
||||
* Fixed ZTS build for c extension.
|
||||
* Fixed c extension build on Mac.
|
||||
* Fixed c extension build on 32-bit linux.
|
||||
* Fixed the bug that message without namespace is not found in the descriptor
|
||||
pool. (#2240)
|
||||
* Fixed the bug that repeated field is not iterable in c extension.
|
||||
* Message names Empty will be converted to GPBEmpty in generated code.
|
||||
* Added phpdoc in generated files.
|
||||
* The released API is almost stable. Unless there is large problem, we won't
|
||||
change it. See
|
||||
https://developers.google.com/protocol-buffers/docs/reference/php-generated
|
||||
for more details.
|
||||
|
||||
Objective-C
|
||||
* Added support for push/pop of the stream limit on CodedInputStream for
|
||||
anyone doing manual parsing.
|
||||
|
||||
C#
|
||||
* No changes.
|
||||
|
||||
Ruby
|
||||
* Message objects now support #respond_to? for field getters/setters.
|
||||
* You can now compare “message == non_message_object” and it will return false
|
||||
instead of throwing an exception.
|
||||
* JRuby: fixed #hashCode to properly reflect the values in the message.
|
||||
|
||||
Javascript
|
||||
* Deserialization of repeated fields no longer has quadratic performance
|
||||
behavior.
|
||||
* UTF-8 encoding/decoding now properly supports high codepoints.
|
||||
* Added convenience methods for some well-known types: Any, Struct, and
|
||||
Timestamp. These make it easier to convert data between native JavaScript
|
||||
types and the well-known protobuf types.
|
||||
|
||||
2016-09-23 version 3.1.0 (C++/Java/Python/PHP/Ruby/Objective-C/C#/JavaScript/Lite)
|
||||
General
|
||||
* Proto3 support in PHP (alpha).
|
||||
* Various bug fixes.
|
||||
|
||||
C++
|
||||
* Added MessageLite::ByteSizeLong() that’s equivalent to
|
||||
MessageLite::ByteSize() but returns the value in size_t. Useful to check
|
||||
whether a message is over the 2G size limit that protobuf can support.
|
||||
* Moved default_instances to global variables. This allows default_instance
|
||||
addresses to be known at compile time.
|
||||
* Adding missing generic gcc 64-bit atomicops.
|
||||
* Restore New*Callback into google::protobuf namespace since these are used
|
||||
by the service stubs code
|
||||
* JSON support.
|
||||
* Fixed some conformance issues.
|
||||
* Fixed a JSON serialization bug for bytes fields.
|
||||
|
||||
Java
|
||||
* Fixed a bug in TextFormat that doesn’t accept empty repeated fields (i.e.,
|
||||
“field: [ ]”).
|
||||
* JSON support
|
||||
* Fixed JsonFormat to do correct snake_case-to-camelCase conversion for
|
||||
non-style-conforming field names.
|
||||
* Fixed JsonFormat to parse empty Any message correctly.
|
||||
* Added an option to JsonFormat.Parser to ignore unknown fields.
|
||||
* Experimental API
|
||||
* Added UnsafeByteOperations.unsafeWrap(byte[]) to wrap a byte array into
|
||||
ByteString without copy.
|
||||
|
||||
Python
|
||||
* JSON support
|
||||
* Fixed some conformance issues.
|
||||
|
||||
PHP (Alpha)
|
||||
* We have added the proto3 support for PHP via both a pure PHP package and a
|
||||
native c extension. The pure PHP package is intended to provide usability
|
||||
to wider range of PHP platforms, while the c extension is intended to
|
||||
provide higher performance. Both implementations provide the same runtime
|
||||
APIs and share the same generated code. Users don’t need to re-generate
|
||||
code for the same proto definition when they want to switch the
|
||||
implementation later. The pure PHP package is included in the php/src
|
||||
directory, and the c extension is included in the php/ext directory.
|
||||
|
||||
Both implementations provide idiomatic PHP APIs:
|
||||
* All messages and enums are defined as PHP classes.
|
||||
* All message fields can only be accessed via getter/setter.
|
||||
* Both repeated field elements and map elements are stored in containers
|
||||
that act like a normal PHP array.
|
||||
|
||||
Unlike several existing third-party PHP implementations for protobuf, our
|
||||
implementations are built on a "strongly-typed" philosophy: message fields
|
||||
and array/map containers will throw exceptions eagerly when values of the
|
||||
incorrect type (not including those that can be type converted, e.g.,
|
||||
double <-> integer <-> numeric string) are inserted.
|
||||
|
||||
Currently, pure PHP runtime supports php5.5, 5.6 and 7 on linux. C
|
||||
extension runtime supports php5.5 and 5.6 on linux.
|
||||
|
||||
See php/README.md for more details about installment. See
|
||||
https://developers.google.com/protocol-buffers/docs/phptutorial for more
|
||||
details about APIs.
|
||||
|
||||
Objective-C
|
||||
* Helpers are now provided for working the the Any well known type (see
|
||||
GPBWellKnownTypes.h for the api additions).
|
||||
* Some improvements in startup code (especially when extensions aren’t used).
|
||||
|
||||
Javascript
|
||||
* Fixed missing import of jspb.Map
|
||||
* Fixed valueWriterFn variable name
|
||||
|
||||
Ruby
|
||||
* Fixed hash computation for JRuby's RubyMessage
|
||||
* Make sure map parsing frames are GC-rooted.
|
||||
* Added API support for well-known types.
|
||||
|
||||
C#
|
||||
* Removed check on dependency in the C# reflection API.
|
||||
|
||||
2016-09-06 version 3.0.2 (C++/Java/Python/Ruby/Objective-C/C#/JavaScript/Lite)
|
||||
General
|
||||
* Various bug fixes.
|
||||
|
||||
Objective C
|
||||
* Fix for oneofs in proto3 syntax files where fields were set to the zero
|
||||
value.
|
||||
* Fix for embedded null character in strings.
|
||||
* CocoaDocs support
|
||||
|
||||
Ruby
|
||||
* Fixed memory corruption bug in parsing that could occur under GC pressure.
|
||||
|
||||
Javascript
|
||||
* jspb.Map is now properly exported to CommonJS modules.
|
||||
|
||||
C#
|
||||
* Removed legacy_enum_values flag.
|
||||
|
||||
|
||||
2016-07-27 version 3.0.0 (C++/Java/Python/Ruby/Objective-C/C#/JavaScript/Lite)
|
||||
General
|
||||
* This log only contains changes since the beta-4 release. Summarized change
|
||||
log since the last stable release (v2.6.1) can be found in the github
|
||||
release page.
|
||||
|
||||
Compatibility Notice
|
||||
* v3.0.0 is the first API stable release of the v3.x series. We do not expect
|
||||
any future API breaking changes.
|
||||
* For C++, Java Lite and Objective-C, source level compatibility is
|
||||
guaranteed. Upgrading from v3.0.0 to newer minor version releases will be
|
||||
source compatible. For example, if your code compiles against protobuf
|
||||
v3.0.0, it will continue to compile after you upgrade protobuf library to
|
||||
v3.1.0.
|
||||
* For other languages, both source level compatibility and binary level
|
||||
compatibility are guaranteed. For example, if you have a Java binary built
|
||||
against protobuf v3.0.0. After switching the protobuf runtime binary to
|
||||
v3.1.0, your built binary should continue to work.
|
||||
* Compatibility is only guaranteed for documented API and documented
|
||||
behaviors. If you are using undocumented API (e.g., use anything in the C++
|
||||
internal namespace), it can be broken by minor version releases in an
|
||||
undetermined manner.
|
||||
|
||||
Ruby
|
||||
* When you assign a string field `a.string_field = "X"`, we now call
|
||||
#encode(UTF-8) on the string and freeze the copy. This saves you from
|
||||
needing to ensure the string is already encoded as UTF-8. It also prevents
|
||||
you from mutating the string after it has been assigned (this is how we
|
||||
ensure it stays valid UTF-8).
|
||||
* The generated file for `foo.proto` is now `foo_pb.rb` instead of just
|
||||
`foo.rb`. This makes it easier to see which imports/requires are from
|
||||
protobuf generated code, and also prevents conflicts with any `foo.rb` file
|
||||
you might have written directly in Ruby. It is a backward-incompatible
|
||||
change: you will need to update all of your `require` statements.
|
||||
* For package names like `foo_bar`, we now translate this to the Ruby module
|
||||
`FooBar`. This is more idiomatic Ruby than what we used to do (`Foo_bar`).
|
||||
|
||||
JavaScript
|
||||
* Scalar fields like numbers and boolean now return defaults instead of
|
||||
`undefined` or `null` when they are unset. You can test for presence
|
||||
explicitly by calling `hasFoo()`, which we now generate for scalar fields.
|
||||
|
||||
Java Lite
|
||||
* Java Lite is now implemented as a separate plugin, maintained in the
|
||||
`javalite` branch. Both lite runtime and protoc artifacts will be available
|
||||
in Maven.
|
||||
|
||||
C#
|
||||
* Target platforms now .NET 4.5, selected portable subsets and .NET Core.
|
||||
* legacy_enum_values option is no longer supported.
|
||||
|
||||
2016-07-15 version 3.0.0-beta-4 (C++/Java/Python/Ruby/Objective-C/C#/JavaScript)
|
||||
General
|
||||
* Added a deterministic serialization API for C++. The deterministic
|
||||
serialization guarantees that given a binary, equal messages will be
|
||||
serialized to the same bytes. This allows applications like MapReduce to
|
||||
group equal messages based on the serialized bytes. The deterministic
|
||||
serialization is, however, NOT canonical across languages; it is also
|
||||
unstable across different builds with schema changes due to unknown fields.
|
||||
Users who need canonical serialization, e.g. persistent storage in a
|
||||
canonical form, fingerprinting, etc, should define their own
|
||||
canonicalization specification and implement the serializer using reflection
|
||||
APIs rather than relying on this API.
|
||||
* Added OneofOptions. You can now define custom options for oneof groups.
|
||||
import "google/protobuf/descriptor.proto";
|
||||
extend google.protobuf.OneofOptions {
|
||||
optional int32 my_oneof_extension = 12345;
|
||||
}
|
||||
message Foo {
|
||||
oneof oneof_group {
|
||||
(my_oneof_extension) = 54321;
|
||||
...
|
||||
}
|
||||
}
|
||||
|
||||
C++ (beta)
|
||||
* Introduced a deterministic serialization API in
|
||||
CodedOutputStream::SetSerializationDeterministic(bool). See the notes about
|
||||
deterministic serialization in the General section.
|
||||
* Added google::protobuf::Map::swap() to swap two map fields.
|
||||
* Fixed a memory leak when calling Reflection::ReleaseMessage() on a message
|
||||
allocated on arena.
|
||||
* Improved error reporting when parsing text format protos.
|
||||
* JSON
|
||||
- Added a new parser option to ignore unknown fields when parsing JSON.
|
||||
- Added convenient methods for message to/from JSON conversion.
|
||||
* Various performance optimizations.
|
||||
|
||||
Java (beta)
|
||||
* File option "java_generate_equals_and_hash" is now deprecated. equals() and
|
||||
hashCode() methods are generated by default.
|
||||
* Added a new JSON printer option "omittingInsignificantWhitespace" to produce
|
||||
a more compact JSON output. The printer will pretty-print by default.
|
||||
* Updated Java runtime to be compatible with 2.5.0/2.6.1 generated protos.
|
||||
|
||||
Python (beta)
|
||||
* Added support to pretty print Any messages in text format.
|
||||
* Added a flag to ignore unknown fields when parsing JSON.
|
||||
* Bugfix: "@type" field of a JSON Any message is now correctly put before
|
||||
other fields.
|
||||
|
||||
Objective-C (beta)
|
||||
* Updated the code to support compiling with more compiler warnings
|
||||
enabled. (Issue 1616)
|
||||
* Exposing more detailed errors for parsing failures. (PR 1623)
|
||||
* Small (breaking) change to the naming of some methods on the support classes
|
||||
for map<>. There were collisions with the system provided KVO support, so
|
||||
the names were changed to avoid those issues. (PR 1699)
|
||||
* Fixed for proper Swift bridging of error handling during parsing. (PR 1712)
|
||||
* Complete support for generating sources that will go into a Framework and
|
||||
depend on generated sources from other Frameworks. (Issue 1457)
|
||||
|
||||
C# (beta)
|
||||
* RepeatedField optimizations.
|
||||
* Support for .NET Core.
|
||||
* Minor bug fixes.
|
||||
* Ability to format a single value in JsonFormatter (advanced usage only).
|
||||
* Modifications to attributes applied to generated code.
|
||||
|
||||
Javascript (alpha)
|
||||
* Maps now have a real map API instead of being treated as repeated fields.
|
||||
* Well-known types are now provided in the google-protobuf package, and the
|
||||
code generator knows to require() them from that package.
|
||||
* Bugfix: non-canonical varints are correctly decoded.
|
||||
|
||||
Ruby (alpha)
|
||||
* Accessors for oneof fields now return default values instead of nil.
|
||||
|
||||
Java Lite
|
||||
* Java lite support is removed from protocol compiler. It will be supported
|
||||
as a protocol compiler plugin in a separate code branch.
|
||||
|
||||
2016-05-16 version 3.0.0-beta-3 (C++/Java/Python/Ruby/Nano/Objective-C/C#/JavaScript)
|
||||
General
|
||||
* Supported Proto3 lite-runtime in C++/Java for mobile platforms.
|
||||
|
@ -1077,7 +1489,7 @@
|
|||
2008-09-29 version 2.0.2:
|
||||
|
||||
General
|
||||
* License changed from Apache 2.0 to New BSD.
|
||||
* License changed from Apache 2.0 to 3-Clause BSD.
|
||||
* It is now possible to define custom "options", which are basically
|
||||
annotations which may be placed on definitions in a .proto file.
|
||||
For example, you might define a field option called "foo" like so:
|
||||
|
|
293
Makefile.am
293
Makefile.am
|
@ -51,30 +51,31 @@ pkgconfig_DATA = protobuf.pc protobuf-lite.pc
|
|||
csharp_EXTRA_DIST= \
|
||||
csharp/.gitignore \
|
||||
csharp/CHANGES.txt \
|
||||
csharp/Google.Protobuf.Tools.nuspec \
|
||||
csharp/README.md \
|
||||
csharp/build_packages.bat \
|
||||
csharp/build_tools.sh \
|
||||
csharp/buildall.sh \
|
||||
csharp/generate_protos.sh \
|
||||
csharp/keys/Google.Protobuf.public.snk \
|
||||
csharp/keys/Google.Protobuf.snk \
|
||||
csharp/keys/README.md \
|
||||
csharp/protos/unittest_custom_options_proto3.proto \
|
||||
csharp/protos/unittest_issues.proto \
|
||||
csharp/src/AddressBook/AddPerson.cs \
|
||||
csharp/src/AddressBook/AddressBook.csproj \
|
||||
csharp/src/AddressBook/Addressbook.cs \
|
||||
csharp/src/AddressBook/AddressBook.xproj \
|
||||
csharp/src/AddressBook/ListPeople.cs \
|
||||
csharp/src/AddressBook/Program.cs \
|
||||
csharp/src/AddressBook/Properties/AssemblyInfo.cs \
|
||||
csharp/src/AddressBook/SampleUsage.cs \
|
||||
csharp/src/AddressBook/app.config \
|
||||
csharp/src/Google.Protobuf.Conformance/App.config \
|
||||
csharp/src/AddressBook/project.json \
|
||||
csharp/src/Google.Protobuf.Conformance/Conformance.cs \
|
||||
csharp/src/Google.Protobuf.Conformance/Google.Protobuf.Conformance.csproj \
|
||||
csharp/src/Google.Protobuf.Conformance/Google.Protobuf.Conformance.xproj \
|
||||
csharp/src/Google.Protobuf.Conformance/Program.cs \
|
||||
csharp/src/Google.Protobuf.Conformance/Properties/AssemblyInfo.cs \
|
||||
csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.csproj \
|
||||
csharp/src/Google.Protobuf.Conformance/project.json \
|
||||
csharp/src/Google.Protobuf.JsonDump/Google.Protobuf.JsonDump.xproj \
|
||||
csharp/src/Google.Protobuf.JsonDump/Program.cs \
|
||||
csharp/src/Google.Protobuf.JsonDump/Properties/AssemblyInfo.cs \
|
||||
csharp/src/Google.Protobuf.JsonDump/app.config \
|
||||
csharp/src/Google.Protobuf.JsonDump/project.json \
|
||||
csharp/src/Google.Protobuf.Test/ByteStringTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/CodedInputStreamExtensions.cs \
|
||||
csharp/src/Google.Protobuf.Test/CodedInputStreamTest.cs \
|
||||
|
@ -82,25 +83,28 @@ csharp_EXTRA_DIST= \
|
|||
csharp/src/Google.Protobuf.Test/Collections/MapFieldTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/Compatibility/PropertyInfoExtensionsTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/Compatibility/StreamExtensionsTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/Compatibility/TypeExtensionsTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/DeprecatedMemberTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/EqualityTester.cs \
|
||||
csharp/src/Google.Protobuf.Test/FieldCodecTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/GeneratedMessageTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.csproj \
|
||||
csharp/src/Google.Protobuf.Test/Google.Protobuf.Test.xproj \
|
||||
csharp/src/Google.Protobuf.Test/IssuesTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/JsonParserTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/JsonTokenizerTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/Properties/AppManifest.xml \
|
||||
csharp/src/Google.Protobuf.Test/Properties/AssemblyInfo.cs \
|
||||
csharp/src/Google.Protobuf.Test/Reflection/CustomOptionsTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/Reflection/DescriptorsTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/Reflection/FieldAccessTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/Reflection/TypeRegistryTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/SampleEnum.cs \
|
||||
csharp/src/Google.Protobuf.Test/SampleMessages.cs \
|
||||
csharp/src/Google.Protobuf.Test/TestCornerCases.cs \
|
||||
csharp/src/Google.Protobuf.Test/TestProtos/ForeignMessagePartial.cs \
|
||||
csharp/src/Google.Protobuf.Test/TestProtos/MapUnittestProto3.cs \
|
||||
csharp/src/Google.Protobuf.Test/TestProtos/TestMessagesProto3.cs \
|
||||
csharp/src/Google.Protobuf.Test/TestProtos/UnittestCustomOptionsProto3.cs \
|
||||
csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportProto3.cs \
|
||||
csharp/src/Google.Protobuf.Test/TestProtos/UnittestImportPublicProto3.cs \
|
||||
csharp/src/Google.Protobuf.Test/TestProtos/UnittestIssues.cs \
|
||||
|
@ -108,9 +112,10 @@ csharp_EXTRA_DIST= \
|
|||
csharp/src/Google.Protobuf.Test/TestProtos/UnittestWellKnownTypes.cs \
|
||||
csharp/src/Google.Protobuf.Test/WellKnownTypes/AnyTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/WellKnownTypes/DurationTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/WellKnownTypes/FieldMaskTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/WellKnownTypes/TimestampTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/WellKnownTypes/WrappersTest.cs \
|
||||
csharp/src/Google.Protobuf.Test/packages.config \
|
||||
csharp/src/Google.Protobuf.Test/project.json \
|
||||
csharp/src/Google.Protobuf.sln \
|
||||
csharp/src/Google.Protobuf/ByteArray.cs \
|
||||
csharp/src/Google.Protobuf/ByteString.cs \
|
||||
|
@ -121,11 +126,12 @@ csharp_EXTRA_DIST= \
|
|||
csharp/src/Google.Protobuf/Collections/ReadOnlyDictionary.cs \
|
||||
csharp/src/Google.Protobuf/Collections/RepeatedField.cs \
|
||||
csharp/src/Google.Protobuf/Compatibility/PropertyInfoExtensions.cs \
|
||||
csharp/src/Google.Protobuf/Compatibility/StreamExtensions.cs \
|
||||
csharp/src/Google.Protobuf/Compatibility/TypeExtensions.cs \
|
||||
csharp/src/Google.Protobuf/FieldCodec.cs \
|
||||
csharp/src/Google.Protobuf/FrameworkPortability.cs \
|
||||
csharp/src/Google.Protobuf/Google.Protobuf.csproj \
|
||||
csharp/src/Google.Protobuf/Google.Protobuf.nuspec \
|
||||
csharp/src/Google.Protobuf/Google.Protobuf.xproj \
|
||||
csharp/src/Google.Protobuf/ICustomDiagnosticMessage.cs \
|
||||
csharp/src/Google.Protobuf/IDeepCloneable.cs \
|
||||
csharp/src/Google.Protobuf/IMessage.cs \
|
||||
csharp/src/Google.Protobuf/InvalidJsonException.cs \
|
||||
|
@ -139,6 +145,7 @@ csharp_EXTRA_DIST= \
|
|||
csharp/src/Google.Protobuf/MessageParser.cs \
|
||||
csharp/src/Google.Protobuf/ProtoPreconditions.cs \
|
||||
csharp/src/Google.Protobuf/Properties/AssemblyInfo.cs \
|
||||
csharp/src/Google.Protobuf/Reflection/CustomOptions.cs \
|
||||
csharp/src/Google.Protobuf/Reflection/Descriptor.cs \
|
||||
csharp/src/Google.Protobuf/Reflection/DescriptorBase.cs \
|
||||
csharp/src/Google.Protobuf/Reflection/DescriptorPool.cs \
|
||||
|
@ -173,6 +180,7 @@ csharp_EXTRA_DIST= \
|
|||
csharp/src/Google.Protobuf/WellKnownTypes/DurationPartial.cs \
|
||||
csharp/src/Google.Protobuf/WellKnownTypes/Empty.cs \
|
||||
csharp/src/Google.Protobuf/WellKnownTypes/FieldMask.cs \
|
||||
csharp/src/Google.Protobuf/WellKnownTypes/FieldMaskPartial.cs \
|
||||
csharp/src/Google.Protobuf/WellKnownTypes/SourceContext.cs \
|
||||
csharp/src/Google.Protobuf/WellKnownTypes/Struct.cs \
|
||||
csharp/src/Google.Protobuf/WellKnownTypes/TimeExtensions.cs \
|
||||
|
@ -183,7 +191,8 @@ csharp_EXTRA_DIST= \
|
|||
csharp/src/Google.Protobuf/WellKnownTypes/Wrappers.cs \
|
||||
csharp/src/Google.Protobuf/WellKnownTypes/WrappersPartial.cs \
|
||||
csharp/src/Google.Protobuf/WireFormat.cs \
|
||||
csharp/src/Google.Protobuf/packages.config \
|
||||
csharp/src/Google.Protobuf/project.json \
|
||||
csharp/src/global.json \
|
||||
csharp/src/packages/repositories.config
|
||||
|
||||
java_EXTRA_DIST= \
|
||||
|
@ -206,6 +215,7 @@ java_EXTRA_DIST=
|
|||
java/core/src/main/java/com/google/protobuf/Descriptors.java \
|
||||
java/core/src/main/java/com/google/protobuf/DoubleArrayList.java \
|
||||
java/core/src/main/java/com/google/protobuf/DynamicMessage.java \
|
||||
java/core/src/main/java/com/google/protobuf/ExperimentalApi.java \
|
||||
java/core/src/main/java/com/google/protobuf/Extension.java \
|
||||
java/core/src/main/java/com/google/protobuf/ExtensionLite.java \
|
||||
java/core/src/main/java/com/google/protobuf/ExtensionRegistry.java \
|
||||
|
@ -215,6 +225,7 @@ java_EXTRA_DIST=
|
|||
java/core/src/main/java/com/google/protobuf/FloatArrayList.java \
|
||||
java/core/src/main/java/com/google/protobuf/GeneratedMessage.java \
|
||||
java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java \
|
||||
java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java \
|
||||
java/core/src/main/java/com/google/protobuf/IntArrayList.java \
|
||||
java/core/src/main/java/com/google/protobuf/Internal.java \
|
||||
java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java \
|
||||
|
@ -236,10 +247,12 @@ java_EXTRA_DIST=
|
|||
java/core/src/main/java/com/google/protobuf/MutabilityOracle.java \
|
||||
java/core/src/main/java/com/google/protobuf/NioByteString.java \
|
||||
java/core/src/main/java/com/google/protobuf/Parser.java \
|
||||
java/core/src/main/java/com/google/protobuf/PrimitiveNonBoxingCollection.java \
|
||||
java/core/src/main/java/com/google/protobuf/ProtobufArrayList.java \
|
||||
java/core/src/main/java/com/google/protobuf/ProtocolMessageEnum.java \
|
||||
java/core/src/main/java/com/google/protobuf/ProtocolStringList.java \
|
||||
java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java \
|
||||
java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilderV3.java \
|
||||
java/core/src/main/java/com/google/protobuf/RopeByteString.java \
|
||||
java/core/src/main/java/com/google/protobuf/RpcCallback.java \
|
||||
java/core/src/main/java/com/google/protobuf/RpcChannel.java \
|
||||
|
@ -248,6 +261,7 @@ java_EXTRA_DIST=
|
|||
java/core/src/main/java/com/google/protobuf/Service.java \
|
||||
java/core/src/main/java/com/google/protobuf/ServiceException.java \
|
||||
java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java \
|
||||
java/core/src/main/java/com/google/protobuf/SingleFieldBuilderV3.java \
|
||||
java/core/src/main/java/com/google/protobuf/SmallSortedMap.java \
|
||||
java/core/src/main/java/com/google/protobuf/TextFormat.java \
|
||||
java/core/src/main/java/com/google/protobuf/TextFormatEscaper.java \
|
||||
|
@ -258,6 +272,7 @@ java_EXTRA_DIST=
|
|||
java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java \
|
||||
java/core/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java \
|
||||
java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java \
|
||||
java/core/src/main/java/com/google/protobuf/UnsafeUtil.java \
|
||||
java/core/src/main/java/com/google/protobuf/Utf8.java \
|
||||
java/core/src/main/java/com/google/protobuf/WireFormat.java \
|
||||
java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java \
|
||||
|
@ -297,16 +312,18 @@ java_EXTRA_DIST=
|
|||
java/core/src/test/java/com/google/protobuf/MessageTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/NestedBuildersTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/NioByteStringTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/ParseExceptionsTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/ParserTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/ProtobufArrayListTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/RepeatedFieldBuilderV3Test.java \
|
||||
java/core/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/RopeByteStringTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/ServiceTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/SingleFieldBuilderV3Test.java \
|
||||
java/core/src/test/java/com/google/protobuf/SmallSortedMapTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/TestBadIdentifiers.java \
|
||||
java/core/src/test/java/com/google/protobuf/TestUtil.java \
|
||||
java/core/src/test/java/com/google/protobuf/TestUtilLite.java \
|
||||
java/core/src/test/java/com/google/protobuf/TextFormatParseInfoTreeTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/TextFormatParseLocationTest.java \
|
||||
java/core/src/test/java/com/google/protobuf/TextFormatTest.java \
|
||||
|
@ -338,13 +355,17 @@ java_EXTRA_DIST=
|
|||
java/core/src/test/proto/com/google/protobuf/test_check_utf8_size.proto \
|
||||
java/core/src/test/proto/com/google/protobuf/test_custom_options.proto \
|
||||
java/core/src/test/proto/com/google/protobuf/test_extra_interfaces.proto \
|
||||
java/lite/generate-sources-build.xml \
|
||||
java/lite/generate-test-sources-build.xml \
|
||||
java/lite/pom.xml \
|
||||
java/pom.xml \
|
||||
java/util/pom.xml \
|
||||
java/util/src/main/java/com/google/protobuf/util/Durations.java \
|
||||
java/util/src/main/java/com/google/protobuf/util/FieldMaskTree.java \
|
||||
java/util/src/main/java/com/google/protobuf/util/FieldMaskUtil.java \
|
||||
java/util/src/main/java/com/google/protobuf/util/JsonFormat.java \
|
||||
java/util/src/main/java/com/google/protobuf/util/TimeUtil.java \
|
||||
java/util/src/main/java/com/google/protobuf/util/Timestamps.java \
|
||||
java/util/src/test/java/com/google/protobuf/util/FieldMaskTreeTest.java \
|
||||
java/util/src/test/java/com/google/protobuf/util/FieldMaskUtilTest.java \
|
||||
java/util/src/test/java/com/google/protobuf/util/JsonFormatTest.java \
|
||||
|
@ -463,8 +484,6 @@ objectivec_EXTRA_DIST= \
|
|||
objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj \
|
||||
objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
|
||||
objectivec/ProtocolBuffers_iOS.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings \
|
||||
objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcbaselines/8BBEA4A5147C727100C4ADB7.xcbaseline/FFE465CA-0E74-40E8-9F09-500B66B7DCB2.plist \
|
||||
objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcbaselines/8BBEA4A5147C727100C4ADB7.xcbaseline/Info.plist \
|
||||
objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme \
|
||||
objectivec/ProtocolBuffers_iOS.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme \
|
||||
objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj \
|
||||
|
@ -473,6 +492,33 @@ objectivec_EXTRA_DIST= \
|
|||
objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/PerformanceTests.xcscheme \
|
||||
objectivec/ProtocolBuffers_OSX.xcodeproj/xcshareddata/xcschemes/ProtocolBuffers.xcscheme \
|
||||
objectivec/README.md \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/project.pbxproj \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester.xcodeproj/xcshareddata/xcschemes/OSXCocoaPodsTester.xcscheme \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/AppDelegate.h \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/AppDelegate.m \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Assets.xcassets/AppIcon.appiconset/Contents.json \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Base.lproj/MainMenu.xib \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/Info.plist \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/OSXCocoaPodsTester/main.m \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/Podfile-framework \
|
||||
objectivec/Tests/CocoaPods/OSXCocoaPodsTester/Podfile-static \
|
||||
objectivec/Tests/CocoaPods/README.md \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/Podfile-framework \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/Podfile-static \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/project.pbxproj \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/project.xcworkspace/contents.xcworkspacedata \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester.xcodeproj/xcshareddata/xcschemes/iOSCocoaPodsTester.xcscheme \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/AppDelegate.h \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/AppDelegate.m \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Assets.xcassets/AppIcon.appiconset/Contents.json \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Base.lproj/LaunchScreen.storyboard \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Base.lproj/Main.storyboard \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/Info.plist \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/ViewController.h \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/ViewController.m \
|
||||
objectivec/Tests/CocoaPods/iOSCocoaPodsTester/iOSCocoaPodsTester/main.m \
|
||||
objectivec/Tests/CocoaPods/run_tests.sh \
|
||||
objectivec/Tests/golden_message \
|
||||
objectivec/Tests/golden_packed_fields_message \
|
||||
objectivec/Tests/GPBARCUnittestProtos.m \
|
||||
|
@ -487,6 +533,7 @@ objectivec_EXTRA_DIST= \
|
|||
objectivec/Tests/GPBDictionaryTests+String.m \
|
||||
objectivec/Tests/GPBDictionaryTests+UInt32.m \
|
||||
objectivec/Tests/GPBDictionaryTests+UInt64.m \
|
||||
objectivec/Tests/GPBDictionaryTests.m \
|
||||
objectivec/Tests/GPBDictionaryTests.pddm \
|
||||
objectivec/Tests/GPBMessageTests+Merge.m \
|
||||
objectivec/Tests/GPBMessageTests+Runtime.m \
|
||||
|
@ -498,6 +545,7 @@ objectivec_EXTRA_DIST= \
|
|||
objectivec/Tests/GPBTestUtilities.h \
|
||||
objectivec/Tests/GPBTestUtilities.m \
|
||||
objectivec/Tests/GPBUnittestProtos.m \
|
||||
objectivec/Tests/GPBUnittestProtos2.m \
|
||||
objectivec/Tests/GPBUnknownFieldSetTest.m \
|
||||
objectivec/Tests/GPBUtilitiesTests.m \
|
||||
objectivec/Tests/GPBWellKnownTypesTest.m \
|
||||
|
@ -519,6 +567,15 @@ objectivec_EXTRA_DIST= \
|
|||
objectivec/Tests/text_format_map_unittest_data.txt \
|
||||
objectivec/Tests/text_format_unittest_data.txt \
|
||||
objectivec/Tests/unittest_cycle.proto \
|
||||
objectivec/Tests/unittest_deprecated.proto \
|
||||
objectivec/Tests/unittest_deprecated_file.proto \
|
||||
objectivec/Tests/unittest_extension_chain_a.proto \
|
||||
objectivec/Tests/unittest_extension_chain_b.proto \
|
||||
objectivec/Tests/unittest_extension_chain_c.proto \
|
||||
objectivec/Tests/unittest_extension_chain_d.proto \
|
||||
objectivec/Tests/unittest_extension_chain_e.proto \
|
||||
objectivec/Tests/unittest_extension_chain_f.proto \
|
||||
objectivec/Tests/unittest_extension_chain_g.proto \
|
||||
objectivec/Tests/unittest_objc.proto \
|
||||
objectivec/Tests/unittest_objc_startup.proto \
|
||||
objectivec/Tests/unittest_runtime_proto2.proto \
|
||||
|
@ -527,6 +584,94 @@ objectivec_EXTRA_DIST= \
|
|||
objectivec/Tests/UnitTests-Info.plist \
|
||||
Protobuf.podspec
|
||||
|
||||
php_EXTRA_DIST= \
|
||||
php/ext/google/protobuf/utf8.h \
|
||||
php/ext/google/protobuf/message.c \
|
||||
php/ext/google/protobuf/utf8.c \
|
||||
php/ext/google/protobuf/package.xml \
|
||||
php/ext/google/protobuf/upb.h \
|
||||
php/ext/google/protobuf/array.c \
|
||||
php/ext/google/protobuf/encode_decode.c \
|
||||
php/ext/google/protobuf/protobuf.h \
|
||||
php/ext/google/protobuf/type_check.c \
|
||||
php/ext/google/protobuf/def.c \
|
||||
php/ext/google/protobuf/storage.c \
|
||||
php/ext/google/protobuf/map.c \
|
||||
php/ext/google/protobuf/config.m4 \
|
||||
php/ext/google/protobuf/upb.c \
|
||||
php/ext/google/protobuf/protobuf.c \
|
||||
php/src/phpdoc.dist.xml \
|
||||
php/src/Google/Protobuf/Internal/DescriptorPool.php \
|
||||
php/src/Google/Protobuf/Internal/GeneratedCodeInfo.php \
|
||||
php/src/Google/Protobuf/Internal/OneofField.php \
|
||||
php/src/Google/Protobuf/Internal/MessageOptions.php \
|
||||
php/src/Google/Protobuf/Internal/FileDescriptorProto.php \
|
||||
php/src/Google/Protobuf/Internal/MapEntry.php \
|
||||
php/src/Google/Protobuf/Internal/FieldDescriptorProto.php \
|
||||
php/src/Google/Protobuf/Internal/InputStream.php \
|
||||
php/src/Google/Protobuf/Internal/UninterpretedOption.php \
|
||||
php/src/Google/Protobuf/Internal/ServiceOptions.php \
|
||||
php/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php \
|
||||
php/src/Google/Protobuf/Internal/ServiceDescriptorProto.php \
|
||||
php/src/Google/Protobuf/Internal/OneofDescriptorProto.php \
|
||||
php/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php \
|
||||
php/src/Google/Protobuf/Internal/OutputStream.php \
|
||||
php/src/Google/Protobuf/Internal/MessageBuilderContext.php \
|
||||
php/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php \
|
||||
php/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php \
|
||||
php/src/Google/Protobuf/Internal/DescriptorProto.php \
|
||||
php/src/Google/Protobuf/Internal/MapField.php \
|
||||
php/src/Google/Protobuf/Internal/MethodDescriptorProto.php \
|
||||
php/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php \
|
||||
php/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php \
|
||||
php/src/Google/Protobuf/Internal/RepeatedField.php \
|
||||
php/src/Google/Protobuf/Internal/EnumValueOptions.php \
|
||||
php/src/Google/Protobuf/Internal/MethodOptions.php \
|
||||
php/src/Google/Protobuf/Internal/OneofOptions.php \
|
||||
php/src/Google/Protobuf/Internal/Message.php \
|
||||
php/src/Google/Protobuf/Internal/FileOptions.php \
|
||||
php/src/Google/Protobuf/Internal/FileDescriptorSet.php \
|
||||
php/src/Google/Protobuf/Internal/EnumDescriptorProto.php \
|
||||
php/src/Google/Protobuf/Internal/GPBWire.php \
|
||||
php/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php \
|
||||
php/src/Google/Protobuf/Internal/FieldOptions.php \
|
||||
php/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php \
|
||||
php/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php \
|
||||
php/src/Google/Protobuf/Internal/GPBType.php \
|
||||
php/src/Google/Protobuf/Internal/FieldOptions_JSType.php \
|
||||
php/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php \
|
||||
php/src/Google/Protobuf/Internal/SourceCodeInfo.php \
|
||||
php/src/Google/Protobuf/Internal/EnumOptions.php \
|
||||
php/src/Google/Protobuf/Internal/GPBLabel.php \
|
||||
php/src/Google/Protobuf/Internal/EnumBuilderContext.php \
|
||||
php/src/Google/Protobuf/Internal/GPBUtil.php \
|
||||
php/src/Google/Protobuf/Internal/FieldOptions_CType.php \
|
||||
php/src/Google/Protobuf/Internal/GPBDecodeException.php \
|
||||
php/src/Google/Protobuf/descriptor.php \
|
||||
php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php \
|
||||
php/tests/array_test.php \
|
||||
php/tests/autoload.php \
|
||||
php/tests/encode_decode_test.php \
|
||||
php/tests/gdb_test.sh \
|
||||
php/tests/generated_class_test.php \
|
||||
php/tests/map_field_test.php \
|
||||
php/tests/memory_leak_test.php \
|
||||
php/tests/php_implementation_test.php \
|
||||
php/tests/proto/test_import_descriptor_proto.proto \
|
||||
php/tests/proto/test_include.proto \
|
||||
php/tests/proto/test.proto \
|
||||
php/tests/proto/test_prefix.proto \
|
||||
php/tests/proto/test_no_namespace.proto \
|
||||
php/tests/test.sh \
|
||||
php/tests/test_base.php \
|
||||
php/tests/test_util.php \
|
||||
php/tests/well_known_test.php \
|
||||
php/README.md \
|
||||
php/phpunit.xml \
|
||||
php/composer.json \
|
||||
php/generate_descriptor_protos.sh \
|
||||
composer.json
|
||||
|
||||
python_EXTRA_DIST= \
|
||||
python/MANIFEST.in \
|
||||
python/google/__init__.py \
|
||||
|
@ -551,6 +696,7 @@ python_EXTRA_DIST= \
|
|||
python/google/protobuf/internal/enum_type_wrapper.py \
|
||||
python/google/protobuf/internal/factory_test1.proto \
|
||||
python/google/protobuf/internal/factory_test2.proto \
|
||||
python/google/protobuf/internal/file_options_test.proto \
|
||||
python/google/protobuf/internal/generator_test.py \
|
||||
python/google/protobuf/internal/import_test_package/__init__.py \
|
||||
python/google/protobuf/internal/import_test_package/inner.proto \
|
||||
|
@ -567,11 +713,13 @@ python_EXTRA_DIST= \
|
|||
python/google/protobuf/internal/packed_field_test.proto \
|
||||
python/google/protobuf/internal/proto_builder_test.py \
|
||||
python/google/protobuf/internal/python_message.py \
|
||||
python/google/protobuf/internal/python_protobuf.cc \
|
||||
python/google/protobuf/internal/reflection_test.py \
|
||||
python/google/protobuf/internal/service_reflection_test.py \
|
||||
python/google/protobuf/internal/symbol_database_test.py \
|
||||
python/google/protobuf/internal/test_bad_identifiers.proto \
|
||||
python/google/protobuf/internal/test_util.py \
|
||||
python/google/protobuf/internal/testing_refleaks.py \
|
||||
python/google/protobuf/internal/text_encoding_test.py \
|
||||
python/google/protobuf/internal/text_format_test.py \
|
||||
python/google/protobuf/internal/type_checkers.py \
|
||||
|
@ -603,14 +751,18 @@ python_EXTRA_DIST= \
|
|||
python/google/protobuf/pyext/map_container.h \
|
||||
python/google/protobuf/pyext/message.cc \
|
||||
python/google/protobuf/pyext/message.h \
|
||||
python/google/protobuf/pyext/message_factory.cc \
|
||||
python/google/protobuf/pyext/message_factory.h \
|
||||
python/google/protobuf/pyext/message_module.cc \
|
||||
python/google/protobuf/pyext/proto2_api_test.proto \
|
||||
python/google/protobuf/pyext/python.proto \
|
||||
python/google/protobuf/pyext/python_protobuf.h \
|
||||
python/google/protobuf/pyext/repeated_composite_container.cc \
|
||||
python/google/protobuf/pyext/repeated_composite_container.h \
|
||||
python/google/protobuf/pyext/repeated_scalar_container.cc \
|
||||
python/google/protobuf/pyext/repeated_scalar_container.h \
|
||||
python/google/protobuf/pyext/safe_numerics.h \
|
||||
python/google/protobuf/pyext/scoped_pyobject_ptr.h \
|
||||
python/google/protobuf/python_protobuf.h \
|
||||
python/google/protobuf/reflection.py \
|
||||
python/google/protobuf/service.py \
|
||||
python/google/protobuf/service_reflection.py \
|
||||
|
@ -618,6 +770,7 @@ python_EXTRA_DIST= \
|
|||
python/google/protobuf/text_encoding.py \
|
||||
python/google/protobuf/text_format.py \
|
||||
python/mox.py \
|
||||
python/setup.cfg \
|
||||
python/setup.py \
|
||||
python/stubout.py \
|
||||
python/tox.ini \
|
||||
|
@ -625,10 +778,18 @@ python_EXTRA_DIST= \
|
|||
|
||||
ruby_EXTRA_DIST= \
|
||||
ruby/Gemfile \
|
||||
ruby/Gemfile.lock \
|
||||
ruby/.gitignore \
|
||||
ruby/README.md \
|
||||
ruby/Rakefile \
|
||||
ruby/compatibility_tests/v3.0.0/tests/test_import.proto \
|
||||
ruby/compatibility_tests/v3.0.0/tests/stress.rb \
|
||||
ruby/compatibility_tests/v3.0.0/tests/repeated_field_test.rb \
|
||||
ruby/compatibility_tests/v3.0.0/tests/generated_code_test.rb \
|
||||
ruby/compatibility_tests/v3.0.0/tests/generated_code.proto \
|
||||
ruby/compatibility_tests/v3.0.0/tests/basic.rb \
|
||||
ruby/compatibility_tests/v3.0.0/test.sh \
|
||||
ruby/compatibility_tests/v3.0.0/Rakefile \
|
||||
ruby/compatibility_tests/v3.0.0/README.md \
|
||||
ruby/ext/google/protobuf_c/defs.c \
|
||||
ruby/ext/google/protobuf_c/encode_decode.c \
|
||||
ruby/ext/google/protobuf_c/extconf.rb \
|
||||
|
@ -640,9 +801,11 @@ ruby_EXTRA_DIST= \
|
|||
ruby/ext/google/protobuf_c/storage.c \
|
||||
ruby/ext/google/protobuf_c/upb.c \
|
||||
ruby/ext/google/protobuf_c/upb.h \
|
||||
ruby/ext/google/protobuf_c/wrap_memcpy.c \
|
||||
ruby/google-protobuf.gemspec \
|
||||
ruby/lib/google/protobuf/message_exts.rb \
|
||||
ruby/lib/google/protobuf/repeated_field.rb \
|
||||
ruby/lib/google/protobuf/well_known_types.rb \
|
||||
ruby/lib/google/protobuf.rb \
|
||||
ruby/pom.xml \
|
||||
ruby/src/main/java/com/google/protobuf/jruby/RubyBuilder.java \
|
||||
|
@ -667,45 +830,59 @@ ruby_EXTRA_DIST= \
|
|||
ruby/tests/repeated_field_test.rb \
|
||||
ruby/tests/stress.rb \
|
||||
ruby/tests/generated_code.proto \
|
||||
ruby/tests/test_import.proto \
|
||||
ruby/tests/generated_code_test.rb \
|
||||
ruby/tests/well_known_types_test.rb \
|
||||
ruby/travis-test.sh
|
||||
|
||||
js_EXTRA_DIST= \
|
||||
js/README.md \
|
||||
js/binary/arith.js \
|
||||
js/binary/arith_test.js \
|
||||
js/binary/constants.js \
|
||||
js/binary/decoder.js \
|
||||
js/binary/decoder_test.js \
|
||||
js/binary/encoder.js \
|
||||
js/binary/proto_test.js \
|
||||
js/binary/reader.js \
|
||||
js/binary/reader_test.js \
|
||||
js/binary/utils.js \
|
||||
js/binary/utils_test.js \
|
||||
js/binary/writer.js \
|
||||
js/binary/writer_test.js \
|
||||
js/data.proto \
|
||||
js/debug.js \
|
||||
js/debug_test.js \
|
||||
js/gulpfile.js \
|
||||
js/jasmine.json \
|
||||
js/message.js \
|
||||
js/message_test.js \
|
||||
js/node_loader.js \
|
||||
js/package.json \
|
||||
js/proto3_test.js \
|
||||
js/proto3_test.proto \
|
||||
js/test.proto \
|
||||
js/test2.proto \
|
||||
js/test3.proto \
|
||||
js/test4.proto \
|
||||
js/test5.proto \
|
||||
js/test_bootstrap.js \
|
||||
js/testbinary.proto \
|
||||
js_EXTRA_DIST= \
|
||||
js/README.md \
|
||||
js/binary/arith.js \
|
||||
js/binary/arith_test.js \
|
||||
js/binary/constants.js \
|
||||
js/binary/decoder.js \
|
||||
js/binary/decoder_test.js \
|
||||
js/binary/encoder.js \
|
||||
js/binary/message_test.js \
|
||||
js/binary/proto_test.js \
|
||||
js/binary/reader.js \
|
||||
js/binary/reader_test.js \
|
||||
js/binary/utils.js \
|
||||
js/binary/utils_test.js \
|
||||
js/binary/writer.js \
|
||||
js/binary/writer_test.js \
|
||||
js/commonjs/export.js \
|
||||
js/commonjs/export_asserts.js \
|
||||
js/commonjs/export_testdeps.js \
|
||||
js/commonjs/import_test.js \
|
||||
js/commonjs/jasmine.json \
|
||||
js/commonjs/rewrite_tests_for_commonjs.js \
|
||||
js/commonjs/test6/test6.proto \
|
||||
js/commonjs/test7/test7.proto \
|
||||
js/data.proto \
|
||||
js/debug.js \
|
||||
js/debug_test.js \
|
||||
js/gulpfile.js \
|
||||
js/jasmine.json \
|
||||
js/map.js \
|
||||
js/maps_test.js \
|
||||
js/message.js \
|
||||
js/message_test.js \
|
||||
js/node_loader.js \
|
||||
js/package.json \
|
||||
js/proto3_test.js \
|
||||
js/proto3_test.proto \
|
||||
js/test.proto \
|
||||
js/test2.proto \
|
||||
js/test3.proto \
|
||||
js/test4.proto \
|
||||
js/test5.proto \
|
||||
js/test8.proto \
|
||||
js/test_bootstrap.js \
|
||||
js/testbinary.proto \
|
||||
js/testempty.proto
|
||||
|
||||
all_EXTRA_DIST=$(csharp_EXTRA_DIST) $(java_EXTRA_DIST) $(javanano_EXTRA_DIST) $(objectivec_EXTRA_DIST) $(python_EXTRA_DIST) $(ruby_EXTRA_DIST) $(js_EXTRA_DIST)
|
||||
all_EXTRA_DIST=$(csharp_EXTRA_DIST) $(java_EXTRA_DIST) $(javanano_EXTRA_DIST) $(objectivec_EXTRA_DIST) $(php_EXTRA_DIST) $(python_EXTRA_DIST) $(ruby_EXTRA_DIST) $(js_EXTRA_DIST)
|
||||
|
||||
EXTRA_DIST = $(@DIST_LANG@_EXTRA_DIST) \
|
||||
autogen.sh \
|
||||
|
@ -720,6 +897,7 @@ EXTRA_DIST = $(@DIST_LANG@_EXTRA_DIST) \
|
|||
WORKSPACE \
|
||||
cmake/CMakeLists.txt \
|
||||
cmake/README.md \
|
||||
cmake/examples.cmake \
|
||||
cmake/extract_includes.bat.in \
|
||||
cmake/install.cmake \
|
||||
cmake/libprotobuf.cmake \
|
||||
|
@ -728,11 +906,13 @@ EXTRA_DIST = $(@DIST_LANG@_EXTRA_DIST) \
|
|||
cmake/protobuf-config-version.cmake.in \
|
||||
cmake/protobuf-config.cmake.in \
|
||||
cmake/protobuf-module.cmake.in \
|
||||
cmake/protobuf-options.cmake \
|
||||
cmake/protoc.cmake \
|
||||
cmake/tests.cmake \
|
||||
editors/README.txt \
|
||||
editors/proto.vim \
|
||||
editors/protobuf-mode.el \
|
||||
examples/CMakeLists.txt \
|
||||
examples/README.txt \
|
||||
examples/Makefile \
|
||||
examples/addressbook.proto \
|
||||
|
@ -742,6 +922,7 @@ EXTRA_DIST = $(@DIST_LANG@_EXTRA_DIST) \
|
|||
examples/list_people.cc \
|
||||
examples/list_people.go \
|
||||
examples/AddPerson.java \
|
||||
examples/CMakeLists.txt \
|
||||
examples/ListPeople.java \
|
||||
examples/add_person.py \
|
||||
examples/list_people.py \
|
||||
|
|
|
@ -5,10 +5,10 @@
|
|||
# dependent projects use the :git notation to refer to the library.
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Protobuf'
|
||||
s.version = '3.0.0-beta-3'
|
||||
s.version = '3.3.0'
|
||||
s.summary = 'Protocol Buffers v.3 runtime library for Objective-C.'
|
||||
s.homepage = 'https://github.com/google/protobuf'
|
||||
s.license = 'New BSD'
|
||||
s.license = '3-Clause BSD License'
|
||||
s.authors = { 'The Protocol Buffers contributors' => 'protobuf@googlegroups.com' }
|
||||
s.cocoapods_version = '>= 1.0'
|
||||
|
||||
|
@ -18,18 +18,14 @@ Pod::Spec.new do |s|
|
|||
s.source_files = 'objectivec/*.{h,m}',
|
||||
'objectivec/google/protobuf/Any.pbobjc.{h,m}',
|
||||
'objectivec/google/protobuf/Api.pbobjc.{h,m}',
|
||||
'objectivec/google/protobuf/Duration.pbobjc.h',
|
||||
'objectivec/google/protobuf/Duration.pbobjc.{h,m}',
|
||||
'objectivec/google/protobuf/Empty.pbobjc.{h,m}',
|
||||
'objectivec/google/protobuf/FieldMask.pbobjc.{h,m}',
|
||||
'objectivec/google/protobuf/SourceContext.pbobjc.{h,m}',
|
||||
'objectivec/google/protobuf/Struct.pbobjc.{h,m}',
|
||||
'objectivec/google/protobuf/Timestamp.pbobjc.h',
|
||||
'objectivec/google/protobuf/Timestamp.pbobjc.{h,m}',
|
||||
'objectivec/google/protobuf/Type.pbobjc.{h,m}',
|
||||
'objectivec/google/protobuf/Wrappers.pbobjc.{h,m}'
|
||||
# Timestamp.pbobjc.m and Duration.pbobjc.m are #imported by GPBWellKnownTypes.m. So we can't
|
||||
# compile them (duplicate symbols), but we need them available for the importing:
|
||||
s.preserve_paths = 'objectivec/google/protobuf/Duration.pbobjc.m',
|
||||
'objectivec/google/protobuf/Timestamp.pbobjc.m'
|
||||
# The following would cause duplicate symbol definitions. GPBProtocolBuffers is expected to be
|
||||
# left out, as it's an umbrella implementation file.
|
||||
s.exclude_files = 'objectivec/GPBProtocolBuffers.m'
|
||||
|
@ -38,7 +34,8 @@ Pod::Spec.new do |s|
|
|||
s.user_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1' }
|
||||
s.pod_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1' }
|
||||
|
||||
s.ios.deployment_target = '7.1'
|
||||
s.ios.deployment_target = '7.0'
|
||||
s.osx.deployment_target = '10.9'
|
||||
s.watchos.deployment_target = '2.0'
|
||||
s.requires_arc = false
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Protocol Buffers - Google's data interchange format
|
||||
===================================================
|
||||
|
||||
[](https://travis-ci.org/google/protobuf) [](https://ci.appveyor.com/project/protobuf/protobuf)
|
||||
[](https://travis-ci.org/google/protobuf) [](https://ci.appveyor.com/project/protobuf/protobuf) [](https://grpc-testing.appspot.com/job/protobuf_branch) [](https://grpc-testing.appspot.com/job/protobuf_branch_32) [](http://ci.bazel.io/job/protobuf/)
|
||||
|
||||
Copyright 2008 Google Inc.
|
||||
|
||||
|
@ -65,7 +65,7 @@ how to install protobuf runtime for that specific language:
|
|||
| JavaScript | [js](js) |
|
||||
| Ruby | [ruby](ruby) |
|
||||
| Go | [golang/protobuf](https://github.com/golang/protobuf) |
|
||||
| PHP | TBD |
|
||||
| PHP | [php](php) |
|
||||
|
||||
|
||||
Usage
|
||||
|
@ -74,4 +74,4 @@ Usage
|
|||
The complete documentation for Protocol Buffers is available via the
|
||||
web at:
|
||||
|
||||
https://developers.google.com/protocol-buffers/
|
||||
https://developers.google.com/protocol-buffers/
|
||||
|
|
24
WORKSPACE
24
WORKSPACE
|
@ -1,15 +1,15 @@
|
|||
new_http_archive(
|
||||
name = "gmock_archive",
|
||||
url = "https://googlemock.googlecode.com/files/gmock-1.7.0.zip",
|
||||
sha256 = "26fcbb5925b74ad5fc8c26b0495dfc96353f4d553492eb97e85a8a6d2f43095b",
|
||||
new_git_repository(
|
||||
name = "googletest",
|
||||
build_file = "gmock.BUILD",
|
||||
remote = "https://github.com/google/googletest",
|
||||
tag = "release-1.8.0",
|
||||
)
|
||||
|
||||
new_http_archive(
|
||||
name = "six_archive",
|
||||
url = "https://pypi.python.org/packages/source/s/six/six-1.10.0.tar.gz#md5=34eed507548117b2ab523ab14b2f8b55",
|
||||
sha256 = "105f8d68616f8248e24bf0e9372ef04d3cc10104f1980f54d57b2ce73a5ad56a",
|
||||
build_file = "six.BUILD",
|
||||
sha256 = "105f8d68616f8248e24bf0e9372ef04d3cc10104f1980f54d57b2ce73a5ad56a",
|
||||
url = "https://pypi.python.org/packages/source/s/six/six-1.10.0.tar.gz#md5=34eed507548117b2ab523ab14b2f8b55",
|
||||
)
|
||||
|
||||
bind(
|
||||
|
@ -19,12 +19,12 @@ bind(
|
|||
|
||||
bind(
|
||||
name = "gtest",
|
||||
actual = "@gmock_archive//:gtest",
|
||||
actual = "@googletest//:gtest",
|
||||
)
|
||||
|
||||
bind(
|
||||
name = "gtest_main",
|
||||
actual = "@gmock_archive//:gtest_main",
|
||||
actual = "@googletest//:gtest_main",
|
||||
)
|
||||
|
||||
bind(
|
||||
|
@ -33,8 +33,8 @@ bind(
|
|||
)
|
||||
|
||||
maven_jar(
|
||||
name = "guava_maven",
|
||||
artifact = "com.google.guava:guava:18.0",
|
||||
name = "guava_maven",
|
||||
artifact = "com.google.guava:guava:18.0",
|
||||
)
|
||||
|
||||
bind(
|
||||
|
@ -43,8 +43,8 @@ bind(
|
|||
)
|
||||
|
||||
maven_jar(
|
||||
name = "gson_maven",
|
||||
artifact = "com.google.code.gson:gson:2.3",
|
||||
name = "gson_maven",
|
||||
artifact = "com.google.code.gson:gson:2.7",
|
||||
)
|
||||
|
||||
bind(
|
||||
|
|
11
appveyor.bat
11
appveyor.bat
|
@ -10,7 +10,7 @@ goto :error
|
|||
echo Building C++
|
||||
mkdir build_msvc
|
||||
cd build_msvc
|
||||
cmake -G "%generator%" -Dprotobuf_BUILD_SHARED_LIBS=%BUILD_DLL% ../cmake
|
||||
cmake -G "%generator%" -Dprotobuf_BUILD_SHARED_LIBS=%BUILD_DLL% -Dprotobuf_UNICODE=%UNICODE% ../cmake
|
||||
msbuild protobuf.sln /p:Platform=%vcplatform% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" || goto error
|
||||
cd %configuration%
|
||||
tests.exe || goto error
|
||||
|
@ -19,9 +19,12 @@ goto :EOF
|
|||
:build_csharp
|
||||
echo Building C#
|
||||
cd csharp\src
|
||||
nuget restore
|
||||
msbuild Google.Protobuf.sln /p:Platform="Any CPU" /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" || goto error
|
||||
nunit-console Google.Protobuf.Test\bin\%configuration%\Google.Protobuf.Test.dll || goto error
|
||||
dotnet restore
|
||||
dotnet build -c %configuration% Google.Protobuf Google.Protobuf.Test Google.Protobuf.Conformance || goto error
|
||||
|
||||
echo Testing C#
|
||||
dotnet test -c %configuration% Google.Protobuf.Test || goto error
|
||||
|
||||
goto :EOF
|
||||
|
||||
:error
|
||||
|
|
19
appveyor.yml
19
appveyor.yml
|
@ -11,13 +11,26 @@ environment:
|
|||
matrix:
|
||||
- language: cpp
|
||||
BUILD_DLL: ON
|
||||
UNICODE: ON
|
||||
|
||||
- language: csharp
|
||||
|
||||
# Our build scripts run tests automatically; we don't want AppVeyor
|
||||
# to try to detect them itself.
|
||||
test: off
|
||||
|
||||
install:
|
||||
- ps: Start-FileDownload https://googlemock.googlecode.com/files/gmock-1.7.0.zip
|
||||
- 7z x gmock-1.7.0.zip
|
||||
- rename gmock-1.7.0 gmock
|
||||
- curl -L -o release-1.7.0.zip https://github.com/google/googlemock/archive/release-1.7.0.zip
|
||||
- 7z x release-1.7.0.zip
|
||||
- del /Q release-1.7.0.zip
|
||||
- rename googlemock-release-1.7.0 gmock
|
||||
- curl -L -o release-1.7.0.zip "https://github.com/google/googletest/archive/release-1.7.0.zip"
|
||||
- 7z x release-1.7.0.zip
|
||||
- del /Q release-1.7.0.zip
|
||||
- rename googletest-release-1.7.0 gtest
|
||||
- move gtest gmock
|
||||
- curl -L -o dotnetsdk.exe "https://go.microsoft.com/fwlink/?LinkID=809122"
|
||||
- dotnetsdk.exe /install /quiet /norestart
|
||||
|
||||
before_build:
|
||||
- if %platform%==Win32 set generator=Visual Studio 12
|
||||
|
|
13
autogen.sh
13
autogen.sh
|
@ -31,10 +31,15 @@ fi
|
|||
# directory is set up as an SVN external.
|
||||
if test ! -e gmock; then
|
||||
echo "Google Mock not present. Fetching gmock-1.7.0 from the web..."
|
||||
curl $curlopts -O https://googlemock.googlecode.com/files/gmock-1.7.0.zip
|
||||
unzip -q gmock-1.7.0.zip
|
||||
rm gmock-1.7.0.zip
|
||||
mv gmock-1.7.0 gmock
|
||||
curl $curlopts -L -O https://github.com/google/googlemock/archive/release-1.7.0.zip
|
||||
unzip -q release-1.7.0.zip
|
||||
rm release-1.7.0.zip
|
||||
mv googlemock-release-1.7.0 gmock
|
||||
|
||||
curl $curlopts -L -O https://github.com/google/googletest/archive/release-1.7.0.zip
|
||||
unzip -q release-1.7.0.zip
|
||||
rm release-1.7.0.zip
|
||||
mv googletest-release-1.7.0 gmock/gtest
|
||||
fi
|
||||
|
||||
set -ex
|
||||
|
|
|
@ -16,7 +16,9 @@ benchmarks_protoc_outputs_proto2 = \
|
|||
benchmark_messages_proto2.pb.cc \
|
||||
benchmark_messages_proto2.pb.h
|
||||
|
||||
bin_PROGRAMS = generate-datasets
|
||||
AM_CXXFLAGS = $(NO_OPT_CXXFLAGS) $(PROTOBUF_OPT_FLAG) -Wall -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare
|
||||
|
||||
bin_PROGRAMS = generate-datasets cpp-benchmark
|
||||
|
||||
generate_datasets_LDADD = $(top_srcdir)/src/libprotobuf.la
|
||||
generate_datasets_SOURCES = generate_datasets.cc
|
||||
|
@ -30,6 +32,13 @@ nodist_generate_datasets_SOURCES = \
|
|||
# See: https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
|
||||
generate_datasets-generate_datasets.$(OBJEXT): benchmarks.pb.h
|
||||
|
||||
cpp_benchmark_LDADD = $(top_srcdir)/src/libprotobuf.la $(top_srcdir)/third_party/benchmark/src/libbenchmark.a
|
||||
cpp_benchmark_SOURCES = cpp_benchmark.cc
|
||||
cpp_benchmark_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir) -I$(top_srcdir)/third_party/benchmark/include
|
||||
nodist_cpp_benchmark_SOURCES = \
|
||||
$(benchmarks_protoc_outputs) \
|
||||
$(benchmarks_protoc_outputs_proto2)
|
||||
|
||||
$(benchmarks_protoc_outputs): protoc_middleman
|
||||
$(benchmarks_protoc_outputs_proto2): protoc_middleman2
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@ option java_package = "com.google.protobuf.benchmarks";
|
|||
// This is the default, but we specify it here explicitly.
|
||||
option optimize_for = SPEED;
|
||||
|
||||
option cc_enable_arenas = true;
|
||||
|
||||
message GoogleMessage1 {
|
||||
required string field1 = 1;
|
||||
optional string field9 = 9;
|
||||
|
|
|
@ -8,6 +8,8 @@ option java_package = "com.google.protobuf.benchmarks";
|
|||
// This is the default, but we specify it here explicitly.
|
||||
option optimize_for = SPEED;
|
||||
|
||||
option cc_enable_arenas = true;
|
||||
|
||||
message GoogleMessage1 {
|
||||
string field1 = 1;
|
||||
string field9 = 9;
|
||||
|
|
242
benchmarks/cpp_benchmark.cc
Normal file
242
benchmarks/cpp_benchmark.cc
Normal file
|
@ -0,0 +1,242 @@
|
|||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include <glob.h>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include "benchmark/benchmark_api.h"
|
||||
#include "benchmarks.pb.h"
|
||||
#include "benchmark_messages_proto2.pb.h"
|
||||
#include "benchmark_messages_proto3.pb.h"
|
||||
|
||||
#define PREFIX "dataset."
|
||||
#define SUFFIX ".pb"
|
||||
|
||||
using benchmarks::BenchmarkDataset;
|
||||
using google::protobuf::Arena;
|
||||
using google::protobuf::Descriptor;
|
||||
using google::protobuf::DescriptorPool;
|
||||
using google::protobuf::Message;
|
||||
using google::protobuf::MessageFactory;
|
||||
|
||||
class Fixture : public benchmark::Fixture {
|
||||
public:
|
||||
Fixture(const BenchmarkDataset& dataset, const std::string& suffix) {
|
||||
for (int i = 0; i < dataset.payload_size(); i++) {
|
||||
payloads_.push_back(dataset.payload(i));
|
||||
}
|
||||
|
||||
const Descriptor* d =
|
||||
DescriptorPool::generated_pool()->FindMessageTypeByName(
|
||||
dataset.message_name());
|
||||
|
||||
if (!d) {
|
||||
std::cerr << "Couldn't find message named '" << dataset.message_name()
|
||||
<< "\n";
|
||||
}
|
||||
|
||||
prototype_ = MessageFactory::generated_factory()->GetPrototype(d);
|
||||
SetName((dataset.name() + suffix).c_str());
|
||||
}
|
||||
|
||||
protected:
|
||||
std::vector<std::string> payloads_;
|
||||
const Message* prototype_;
|
||||
};
|
||||
|
||||
class WrappingCounter {
|
||||
public:
|
||||
WrappingCounter(size_t limit) : value_(0), limit_(limit) {}
|
||||
|
||||
size_t Next() {
|
||||
size_t ret = value_;
|
||||
if (++value_ == limit_) {
|
||||
value_ = 0;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
private:
|
||||
size_t value_;
|
||||
size_t limit_;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class ParseNewFixture : public Fixture {
|
||||
public:
|
||||
ParseNewFixture(const BenchmarkDataset& dataset)
|
||||
: Fixture(dataset, "_parse_new") {}
|
||||
|
||||
virtual void BenchmarkCase(benchmark::State& state) {
|
||||
WrappingCounter i(payloads_.size());
|
||||
size_t total = 0;
|
||||
|
||||
while (state.KeepRunning()) {
|
||||
T m;
|
||||
const std::string& payload = payloads_[i.Next()];
|
||||
total += payload.size();
|
||||
m.ParseFromString(payload);
|
||||
}
|
||||
|
||||
state.SetBytesProcessed(total);
|
||||
}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class ParseNewArenaFixture : public Fixture {
|
||||
public:
|
||||
ParseNewArenaFixture(const BenchmarkDataset& dataset)
|
||||
: Fixture(dataset, "_parse_newarena") {}
|
||||
|
||||
virtual void BenchmarkCase(benchmark::State& state) {
|
||||
WrappingCounter i(payloads_.size());
|
||||
size_t total = 0;
|
||||
|
||||
while (state.KeepRunning()) {
|
||||
Arena arena;
|
||||
Message* m = Arena::CreateMessage<T>(&arena);
|
||||
const std::string& payload = payloads_[i.Next()];
|
||||
total += payload.size();
|
||||
m->ParseFromString(payload);
|
||||
}
|
||||
|
||||
state.SetBytesProcessed(total);
|
||||
}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class ParseReuseFixture : public Fixture {
|
||||
public:
|
||||
ParseReuseFixture(const BenchmarkDataset& dataset)
|
||||
: Fixture(dataset, "_parse_reuse") {}
|
||||
|
||||
virtual void BenchmarkCase(benchmark::State& state) {
|
||||
T m;
|
||||
WrappingCounter i(payloads_.size());
|
||||
size_t total = 0;
|
||||
|
||||
while (state.KeepRunning()) {
|
||||
const std::string& payload = payloads_[i.Next()];
|
||||
total += payload.size();
|
||||
m.ParseFromString(payload);
|
||||
}
|
||||
|
||||
state.SetBytesProcessed(total);
|
||||
}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class SerializeFixture : public Fixture {
|
||||
public:
|
||||
SerializeFixture(const BenchmarkDataset& dataset)
|
||||
: Fixture(dataset, "_serialize") {
|
||||
for (size_t i = 0; i < payloads_.size(); i++) {
|
||||
message_.push_back(new T);
|
||||
message_.back()->ParseFromString(payloads_[i]);
|
||||
}
|
||||
}
|
||||
|
||||
~SerializeFixture() {
|
||||
for (size_t i = 0; i < message_.size(); i++) {
|
||||
delete message_[i];
|
||||
}
|
||||
}
|
||||
|
||||
virtual void BenchmarkCase(benchmark::State& state) {
|
||||
size_t total = 0;
|
||||
std::string str;
|
||||
WrappingCounter i(payloads_.size());
|
||||
|
||||
while (state.KeepRunning()) {
|
||||
str.clear();
|
||||
message_[i.Next()]->SerializeToString(&str);
|
||||
total += str.size();
|
||||
}
|
||||
|
||||
state.SetBytesProcessed(total);
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<T*> message_;
|
||||
};
|
||||
|
||||
std::string ReadFile(const std::string& name) {
|
||||
std::ifstream file(name.c_str());
|
||||
GOOGLE_CHECK(file.is_open()) << "Couldn't find file '" << name <<
|
||||
"', please make sure you are running "
|
||||
"this command from the benchmarks/ "
|
||||
"directory.\n";
|
||||
return std::string((std::istreambuf_iterator<char>(file)),
|
||||
std::istreambuf_iterator<char>());
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void RegisterBenchmarksForType(const BenchmarkDataset& dataset) {
|
||||
::benchmark::internal::RegisterBenchmarkInternal(
|
||||
new ParseNewFixture<T>(dataset));
|
||||
::benchmark::internal::RegisterBenchmarkInternal(
|
||||
new ParseReuseFixture<T>(dataset));
|
||||
::benchmark::internal::RegisterBenchmarkInternal(
|
||||
new ParseNewArenaFixture<T>(dataset));
|
||||
::benchmark::internal::RegisterBenchmarkInternal(
|
||||
new SerializeFixture<T>(dataset));
|
||||
}
|
||||
|
||||
void RegisterBenchmarks(const std::string& dataset_bytes) {
|
||||
BenchmarkDataset dataset;
|
||||
GOOGLE_CHECK(dataset.ParseFromString(dataset_bytes));
|
||||
|
||||
if (dataset.message_name() == "benchmarks.proto3.GoogleMessage1") {
|
||||
RegisterBenchmarksForType<benchmarks::proto3::GoogleMessage1>(dataset);
|
||||
} else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage1") {
|
||||
RegisterBenchmarksForType<benchmarks::proto2::GoogleMessage1>(dataset);
|
||||
} else if (dataset.message_name() == "benchmarks.proto2.GoogleMessage2") {
|
||||
RegisterBenchmarksForType<benchmarks::proto2::GoogleMessage2>(dataset);
|
||||
} else {
|
||||
std::cerr << "Unknown message type: " << dataset.message_name();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
glob_t glob_result;
|
||||
if (glob("dataset.*.pb", 0, NULL, &glob_result) != 0) {
|
||||
fprintf(stderr, "No dataset files found.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < glob_result.gl_pathc; i++) {
|
||||
fprintf(stderr, "Found input dataset: %s\n", glob_result.gl_pathv[i]);
|
||||
RegisterBenchmarks(ReadFile(glob_result.gl_pathv[i]));
|
||||
}
|
||||
|
||||
::benchmark::Initialize(&argc, argv);
|
||||
::benchmark::RunSpecifiedBenchmarks();
|
||||
}
|
|
@ -22,29 +22,25 @@ Running a benchmark (Java)
|
|||
$ javac -d tmp -cp protobuf.jar ProtoBench.java
|
||||
|
||||
3) Generate code for the relevant benchmark protocol buffer, e.g.
|
||||
$ protoc --java_out=tmp google_size.proto google_speed.proto
|
||||
$ protoc --java_out=tmp google_size.proto
|
||||
|
||||
4) Build the generated code, e.g.
|
||||
$ cd tmp
|
||||
$ javac -d . -cp ../protobuf.jar benchmarks/*.java
|
||||
$ javac -d tmp -cp protobuf.jar tmp/benchmarks/*.java
|
||||
|
||||
5) Run the test. Arguments are given in pairs - the first argument
|
||||
is the descriptor type; the second is the filename. For example:
|
||||
$ java -cp .;../protobuf.jar com.google.protocolbuffers.ProtoBench
|
||||
benchmarks.GoogleSize$SizeMessage1 ../google_message1.dat
|
||||
benchmarks.GoogleSpeed$SpeedMessage1 ../google_message1.dat
|
||||
benchmarks.GoogleSize$SizeMessage2 ../google_message2.dat
|
||||
benchmarks.GoogleSpeed$SpeedMessage2 ../google_message2.dat
|
||||
$ java -cp tmp:protobuf.jar com.google.protocolbuffers.ProtoBench \
|
||||
'benchmarks.GoogleSize$SizeMessage1' google_message1.dat \
|
||||
'benchmarks.GoogleSize$SizeMessage2' google_message2.dat
|
||||
|
||||
6) Wait! Each test runs for around 30 seconds, and there are 6 tests
|
||||
6) Wait! Each test runs for around 30 seconds, and there are 8 tests
|
||||
per class/data combination. The above command would therefore take
|
||||
about 12 minutes to run.
|
||||
about 8 minutes to run.
|
||||
|
||||
|
||||
Benchmarks available
|
||||
--------------------
|
||||
|
||||
From Google:
|
||||
google_size.proto and google_speed.proto, messages
|
||||
google_message1.dat and google_message2.dat. The proto files are
|
||||
equivalent, but optimized differently.
|
||||
google_size.proto,
|
||||
messages google_message1.dat and google_message2.dat.
|
||||
|
|
|
@ -86,6 +86,7 @@ if (CMAKE_USE_PTHREADS_INIT)
|
|||
add_definitions(-DHAVE_PTHREAD)
|
||||
endif (CMAKE_USE_PTHREADS_INIT)
|
||||
|
||||
set(_protobuf_FIND_ZLIB)
|
||||
if (protobuf_WITH_ZLIB)
|
||||
find_package(ZLIB)
|
||||
if (ZLIB_FOUND)
|
||||
|
@ -96,6 +97,7 @@ if (protobuf_WITH_ZLIB)
|
|||
# Using imported target if exists
|
||||
if (TARGET ZLIB::ZLIB)
|
||||
set(ZLIB_LIBRARIES ZLIB::ZLIB)
|
||||
set(_protobuf_FIND_ZLIB "if(NOT ZLIB_FOUND)\n find_package(ZLIB)\nendif()")
|
||||
endif (TARGET ZLIB::ZLIB)
|
||||
else (ZLIB_FOUND)
|
||||
set(HAVE_ZLIB 0)
|
||||
|
@ -133,7 +135,7 @@ endif (protobuf_BUILD_SHARED_LIBS)
|
|||
if (MSVC)
|
||||
# Build with multiple processes
|
||||
add_definitions(/MP)
|
||||
add_definitions(/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305)
|
||||
add_definitions(/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305 /wd4309)
|
||||
# Allow big object
|
||||
add_definitions(/bigobj)
|
||||
string(REPLACE "/" "\\" PROTOBUF_SOURCE_WIN32_PATH ${protobuf_SOURCE_DIR})
|
||||
|
@ -157,6 +159,10 @@ else (MSVC)
|
|||
set(LIB_PREFIX)
|
||||
endif (MSVC)
|
||||
|
||||
if (protobuf_UNICODE)
|
||||
add_definitions(-DUNICODE -D_UNICODE)
|
||||
endif (protobuf_UNICODE)
|
||||
|
||||
include(libprotobuf-lite.cmake)
|
||||
include(libprotobuf.cmake)
|
||||
include(libprotoc.cmake)
|
||||
|
|
|
@ -1,57 +1,57 @@
|
|||
if(protobuf_VERBOSE)
|
||||
message(STATUS "Protocol Buffers Examples Configuring...")
|
||||
endif()
|
||||
|
||||
get_filename_component(examples_dir "../examples" ABSOLUTE)
|
||||
|
||||
if(protobuf_VERBOSE)
|
||||
message(STATUS "Protocol Buffers Examples Configuring done")
|
||||
endif()
|
||||
include(ExternalProject)
|
||||
|
||||
# Internal utility function: Create a custom target representing a build of examples with custom options.
|
||||
function(add_examples_build NAME)
|
||||
|
||||
ExternalProject_Add(${NAME}
|
||||
PREFIX ${NAME}
|
||||
SOURCE_DIR "${examples_dir}"
|
||||
BINARY_DIR ${NAME}
|
||||
STAMP_DIR ${NAME}/logs
|
||||
INSTALL_COMMAND "" #Skip
|
||||
LOG_CONFIGURE 1
|
||||
CMAKE_CACHE_ARGS "-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}"
|
||||
"-Dprotobuf_VERBOSE:BOOL=${protobuf_VERBOSE}"
|
||||
${ARGN}
|
||||
)
|
||||
set_property(TARGET ${NAME} PROPERTY FOLDER "Examples")
|
||||
set_property(TARGET ${NAME} PROPERTY EXCLUDE_FROM_ALL TRUE)
|
||||
endfunction()
|
||||
|
||||
# Add examples as an external project.
|
||||
# sub_directory cannot be used because the find_package(protobuf) call would cause failures with redefined targets.
|
||||
add_examples_build(examples "-Dprotobuf_DIR:PATH=${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}")
|
||||
add_dependencies(examples libprotobuf protoc)
|
||||
|
||||
option(protobuf_BUILD_EXAMPLES_MULTITEST "Build Examples in multiple configurations. Useful for testing." OFF)
|
||||
mark_as_advanced(protobuf_BUILD_EXAMPLES_MULTITEST)
|
||||
if(protobuf_BUILD_EXAMPLES_MULTITEST)
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
#Build using the legacy compatiblity module.
|
||||
add_examples_build(examples-legacy
|
||||
"-Dprotobuf_DIR:PATH=${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}"
|
||||
"-Dprotobuf_MODULE_COMPATIBLE:BOOL=TRUE"
|
||||
)
|
||||
add_dependencies(examples-legacy libprotobuf protoc)
|
||||
|
||||
#Build using the installed library.
|
||||
add_examples_build(examples-installed
|
||||
"-Dprotobuf_DIR:PATH=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_CMAKEDIR}"
|
||||
)
|
||||
|
||||
#Build using the installed library in legacy compatiblity mode.
|
||||
add_examples_build(examples-installed-legacy
|
||||
"-Dprotobuf_DIR:PATH=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_CMAKEDIR}"
|
||||
"-Dprotobuf_MODULE_COMPATIBLE:BOOL=TRUE"
|
||||
)
|
||||
endif()
|
||||
if(protobuf_VERBOSE)
|
||||
message(STATUS "Protocol Buffers Examples Configuring...")
|
||||
endif()
|
||||
|
||||
get_filename_component(examples_dir "../examples" ABSOLUTE)
|
||||
|
||||
if(protobuf_VERBOSE)
|
||||
message(STATUS "Protocol Buffers Examples Configuring done")
|
||||
endif()
|
||||
include(ExternalProject)
|
||||
|
||||
# Internal utility function: Create a custom target representing a build of examples with custom options.
|
||||
function(add_examples_build NAME)
|
||||
|
||||
ExternalProject_Add(${NAME}
|
||||
PREFIX ${NAME}
|
||||
SOURCE_DIR "${examples_dir}"
|
||||
BINARY_DIR ${NAME}
|
||||
STAMP_DIR ${NAME}/logs
|
||||
INSTALL_COMMAND "" #Skip
|
||||
LOG_CONFIGURE 1
|
||||
CMAKE_CACHE_ARGS "-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}"
|
||||
"-Dprotobuf_VERBOSE:BOOL=${protobuf_VERBOSE}"
|
||||
${ARGN}
|
||||
)
|
||||
set_property(TARGET ${NAME} PROPERTY FOLDER "Examples")
|
||||
set_property(TARGET ${NAME} PROPERTY EXCLUDE_FROM_ALL TRUE)
|
||||
endfunction()
|
||||
|
||||
# Add examples as an external project.
|
||||
# sub_directory cannot be used because the find_package(protobuf) call would cause failures with redefined targets.
|
||||
add_examples_build(examples "-Dprotobuf_DIR:PATH=${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}")
|
||||
add_dependencies(examples libprotobuf protoc)
|
||||
|
||||
option(protobuf_BUILD_EXAMPLES_MULTITEST "Build Examples in multiple configurations. Useful for testing." OFF)
|
||||
mark_as_advanced(protobuf_BUILD_EXAMPLES_MULTITEST)
|
||||
if(protobuf_BUILD_EXAMPLES_MULTITEST)
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
#Build using the legacy compatibility module.
|
||||
add_examples_build(examples-legacy
|
||||
"-Dprotobuf_DIR:PATH=${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}"
|
||||
"-Dprotobuf_MODULE_COMPATIBLE:BOOL=TRUE"
|
||||
)
|
||||
add_dependencies(examples-legacy libprotobuf protoc)
|
||||
|
||||
#Build using the installed library.
|
||||
add_examples_build(examples-installed
|
||||
"-Dprotobuf_DIR:PATH=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_CMAKEDIR}"
|
||||
)
|
||||
|
||||
#Build using the installed library in legacy compatibility mode.
|
||||
add_examples_build(examples-installed-legacy
|
||||
"-Dprotobuf_DIR:PATH=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_CMAKEDIR}"
|
||||
"-Dprotobuf_MODULE_COMPATIBLE:BOOL=TRUE"
|
||||
)
|
||||
endif()
|
||||
|
|
|
@ -8,118 +8,122 @@ mkdir include\google\protobuf\compiler\java
|
|||
mkdir include\google\protobuf\compiler\javanano
|
||||
mkdir include\google\protobuf\compiler\js
|
||||
mkdir include\google\protobuf\compiler\objectivec
|
||||
mkdir include\google\protobuf\compiler\php
|
||||
mkdir include\google\protobuf\compiler\python
|
||||
mkdir include\google\protobuf\compiler\ruby
|
||||
mkdir include\google\protobuf\io
|
||||
mkdir include\google\protobuf\stubs
|
||||
mkdir include\google\protobuf\util
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.h include\google\protobuf\any.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.pb.h include\google\protobuf\any.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\api.pb.h include\google\protobuf\api.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arena.h include\google\protobuf\arena.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arenastring.h include\google\protobuf\arenastring.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\code_generator.h include\google\protobuf\compiler\code_generator.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\command_line_interface.h include\google\protobuf\compiler\command_line_interface.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\cpp\cpp_generator.h include\google\protobuf\compiler\cpp\cpp_generator.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_generator.h include\google\protobuf\compiler\csharp\csharp_generator.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_names.h include\google\protobuf\compiler\csharp\csharp_names.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_options.h include\google\protobuf\compiler\csharp\csharp_options.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\importer.h include\google\protobuf\compiler\importer.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\java_generator.h include\google\protobuf\compiler\java\java_generator.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\java_names.h include\google\protobuf\compiler\java\java_names.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\javanano\javanano_generator.h include\google\protobuf\compiler\javanano\javanano_generator.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\js\js_generator.h include\google\protobuf\compiler\js\js_generator.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\objectivec\objectivec_generator.h include\google\protobuf\compiler\objectivec\objectivec_generator.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\objectivec\objectivec_helpers.h include\google\protobuf\compiler\objectivec\objectivec_helpers.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\parser.h include\google\protobuf\compiler\parser.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.h include\google\protobuf\compiler\plugin.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.pb.h include\google\protobuf\compiler\plugin.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\python\python_generator.h include\google\protobuf\compiler\python\python_generator.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\ruby\ruby_generator.h include\google\protobuf\compiler\ruby\ruby_generator.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.h include\google\protobuf\descriptor.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.pb.h include\google\protobuf\descriptor.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor_database.h include\google\protobuf\descriptor_database.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\duration.pb.h include\google\protobuf\duration.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\dynamic_message.h include\google\protobuf\dynamic_message.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\empty.pb.h include\google\protobuf\empty.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\extension_set.h include\google\protobuf\extension_set.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\field_mask.pb.h include\google\protobuf\field_mask.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_enum_reflection.h include\google\protobuf\generated_enum_reflection.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_enum_util.h include\google\protobuf\generated_enum_util.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_reflection.h include\google\protobuf\generated_message_reflection.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_util.h include\google\protobuf\generated_message_util.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\coded_stream.h include\google\protobuf\io\coded_stream.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\gzip_stream.h include\google\protobuf\io\gzip_stream.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\printer.h include\google\protobuf\io\printer.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\strtod.h include\google\protobuf\io\strtod.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\tokenizer.h include\google\protobuf\io\tokenizer.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream.h include\google\protobuf\io\zero_copy_stream.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream_impl.h include\google\protobuf\io\zero_copy_stream_impl.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream_impl_lite.h include\google\protobuf\io\zero_copy_stream_impl_lite.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map.h include\google\protobuf\map.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_entry.h include\google\protobuf\map_entry.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_entry_lite.h include\google\protobuf\map_entry_lite.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field.h include\google\protobuf\map_field.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field_inl.h include\google\protobuf\map_field_inl.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field_lite.h include\google\protobuf\map_field_lite.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_type_handler.h include\google\protobuf\map_type_handler.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\message.h include\google\protobuf\message.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\message_lite.h include\google\protobuf\message_lite.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\metadata.h include\google\protobuf\metadata.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\reflection.h include\google\protobuf\reflection.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\reflection_ops.h include\google\protobuf\reflection_ops.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\repeated_field.h include\google\protobuf\repeated_field.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\repeated_field_reflection.h include\google\protobuf\repeated_field_reflection.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\service.h include\google\protobuf\service.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\source_context.pb.h include\google\protobuf\source_context.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\struct.pb.h include\google\protobuf\struct.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomic_sequence_num.h include\google\protobuf\stubs\atomic_sequence_num.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops.h include\google\protobuf\stubs\atomicops.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm64_gcc.h include\google\protobuf\stubs\atomicops_internals_arm64_gcc.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm_gcc.h include\google\protobuf\stubs\atomicops_internals_arm_gcc.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm_qnx.h include\google\protobuf\stubs\atomicops_internals_arm_qnx.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_atomicword_compat.h include\google\protobuf\stubs\atomicops_internals_atomicword_compat.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_generic_gcc.h include\google\protobuf\stubs\atomicops_internals_generic_gcc.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_macosx.h include\google\protobuf\stubs\atomicops_internals_macosx.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_mips_gcc.h include\google\protobuf\stubs\atomicops_internals_mips_gcc.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_pnacl.h include\google\protobuf\stubs\atomicops_internals_pnacl.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_power.h include\google\protobuf\stubs\atomicops_internals_power.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_solaris.h include\google\protobuf\stubs\atomicops_internals_solaris.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_tsan.h include\google\protobuf\stubs\atomicops_internals_tsan.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_x86_gcc.h include\google\protobuf\stubs\atomicops_internals_x86_gcc.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_x86_msvc.h include\google\protobuf\stubs\atomicops_internals_x86_msvc.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\bytestream.h include\google\protobuf\stubs\bytestream.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\callback.h include\google\protobuf\stubs\callback.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\casts.h include\google\protobuf\stubs\casts.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\common.h include\google\protobuf\stubs\common.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\fastmem.h include\google\protobuf\stubs\fastmem.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\hash.h include\google\protobuf\stubs\hash.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\logging.h include\google\protobuf\stubs\logging.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\macros.h include\google\protobuf\stubs\macros.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\mutex.h include\google\protobuf\stubs\mutex.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\once.h include\google\protobuf\stubs\once.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\platform_macros.h include\google\protobuf\stubs\platform_macros.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\port.h include\google\protobuf\stubs\port.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\scoped_ptr.h include\google\protobuf\stubs\scoped_ptr.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\shared_ptr.h include\google\protobuf\stubs\shared_ptr.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\singleton.h include\google\protobuf\stubs\singleton.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\status.h include\google\protobuf\stubs\status.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\stl_util.h include\google\protobuf\stubs\stl_util.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\stringpiece.h include\google\protobuf\stubs\stringpiece.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\template_util.h include\google\protobuf\stubs\template_util.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\type_traits.h include\google\protobuf\stubs\type_traits.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\text_format.h include\google\protobuf\text_format.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\timestamp.pb.h include\google\protobuf\timestamp.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\type.pb.h include\google\protobuf\type.pb.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\unknown_field_set.h include\google\protobuf\unknown_field_set.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\field_comparator.h include\google\protobuf\util\field_comparator.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\field_mask_util.h include\google\protobuf\util\field_mask_util.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\json_util.h include\google\protobuf\util\json_util.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\message_differencer.h include\google\protobuf\util\message_differencer.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\time_util.h include\google\protobuf\util\time_util.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\type_resolver.h include\google\protobuf\util\type_resolver.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\type_resolver_util.h include\google\protobuf\util\type_resolver_util.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format.h include\google\protobuf\wire_format.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format_lite.h include\google\protobuf\wire_format_lite.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format_lite_inl.h include\google\protobuf\wire_format_lite_inl.h
|
||||
copy ${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wrappers.pb.h include\google\protobuf\wrappers.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.h" include\google\protobuf\any.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\any.pb.h" include\google\protobuf\any.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\api.pb.h" include\google\protobuf\api.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arena.h" include\google\protobuf\arena.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\arenastring.h" include\google\protobuf\arenastring.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\code_generator.h" include\google\protobuf\compiler\code_generator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\command_line_interface.h" include\google\protobuf\compiler\command_line_interface.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\cpp\cpp_generator.h" include\google\protobuf\compiler\cpp\cpp_generator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_generator.h" include\google\protobuf\compiler\csharp\csharp_generator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\csharp\csharp_names.h" include\google\protobuf\compiler\csharp\csharp_names.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\importer.h" include\google\protobuf\compiler\importer.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\java_generator.h" include\google\protobuf\compiler\java\java_generator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\java\java_names.h" include\google\protobuf\compiler\java\java_names.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\javanano\javanano_generator.h" include\google\protobuf\compiler\javanano\javanano_generator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\js\js_generator.h" include\google\protobuf\compiler\js\js_generator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\js\well_known_types_embed.h" include\google\protobuf\compiler\js\well_known_types_embed.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\objectivec\objectivec_generator.h" include\google\protobuf\compiler\objectivec\objectivec_generator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\objectivec\objectivec_helpers.h" include\google\protobuf\compiler\objectivec\objectivec_helpers.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\parser.h" include\google\protobuf\compiler\parser.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\php\php_generator.h" include\google\protobuf\compiler\php\php_generator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.h" include\google\protobuf\compiler\plugin.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\plugin.pb.h" include\google\protobuf\compiler\plugin.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\profile.pb.h" include\google\protobuf\compiler\profile.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\python\python_generator.h" include\google\protobuf\compiler\python\python_generator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\compiler\ruby\ruby_generator.h" include\google\protobuf\compiler\ruby\ruby_generator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.h" include\google\protobuf\descriptor.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor.pb.h" include\google\protobuf\descriptor.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\descriptor_database.h" include\google\protobuf\descriptor_database.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\duration.pb.h" include\google\protobuf\duration.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\dynamic_message.h" include\google\protobuf\dynamic_message.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\empty.pb.h" include\google\protobuf\empty.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\extension_set.h" include\google\protobuf\extension_set.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\field_mask.pb.h" include\google\protobuf\field_mask.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_enum_reflection.h" include\google\protobuf\generated_enum_reflection.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_enum_util.h" include\google\protobuf\generated_enum_util.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_reflection.h" include\google\protobuf\generated_message_reflection.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\generated_message_util.h" include\google\protobuf\generated_message_util.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\has_bits.h" include\google\protobuf\has_bits.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\coded_stream.h" include\google\protobuf\io\coded_stream.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\gzip_stream.h" include\google\protobuf\io\gzip_stream.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\printer.h" include\google\protobuf\io\printer.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\strtod.h" include\google\protobuf\io\strtod.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\tokenizer.h" include\google\protobuf\io\tokenizer.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream.h" include\google\protobuf\io\zero_copy_stream.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream_impl.h" include\google\protobuf\io\zero_copy_stream_impl.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\io\zero_copy_stream_impl_lite.h" include\google\protobuf\io\zero_copy_stream_impl_lite.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map.h" include\google\protobuf\map.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_entry.h" include\google\protobuf\map_entry.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_entry_lite.h" include\google\protobuf\map_entry_lite.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field.h" include\google\protobuf\map_field.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field_inl.h" include\google\protobuf\map_field_inl.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_field_lite.h" include\google\protobuf\map_field_lite.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\map_type_handler.h" include\google\protobuf\map_type_handler.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\message.h" include\google\protobuf\message.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\message_lite.h" include\google\protobuf\message_lite.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\metadata.h" include\google\protobuf\metadata.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\reflection.h" include\google\protobuf\reflection.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\reflection_ops.h" include\google\protobuf\reflection_ops.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\repeated_field.h" include\google\protobuf\repeated_field.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\service.h" include\google\protobuf\service.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\source_context.pb.h" include\google\protobuf\source_context.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\struct.pb.h" include\google\protobuf\struct.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomic_sequence_num.h" include\google\protobuf\stubs\atomic_sequence_num.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops.h" include\google\protobuf\stubs\atomicops.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm64_gcc.h" include\google\protobuf\stubs\atomicops_internals_arm64_gcc.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm_gcc.h" include\google\protobuf\stubs\atomicops_internals_arm_gcc.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_arm_qnx.h" include\google\protobuf\stubs\atomicops_internals_arm_qnx.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_atomicword_compat.h" include\google\protobuf\stubs\atomicops_internals_atomicword_compat.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_generic_c11_atomic.h" include\google\protobuf\stubs\atomicops_internals_generic_c11_atomic.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_generic_gcc.h" include\google\protobuf\stubs\atomicops_internals_generic_gcc.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_mips_gcc.h" include\google\protobuf\stubs\atomicops_internals_mips_gcc.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_power.h" include\google\protobuf\stubs\atomicops_internals_power.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_ppc_gcc.h" include\google\protobuf\stubs\atomicops_internals_ppc_gcc.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_solaris.h" include\google\protobuf\stubs\atomicops_internals_solaris.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_tsan.h" include\google\protobuf\stubs\atomicops_internals_tsan.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_x86_gcc.h" include\google\protobuf\stubs\atomicops_internals_x86_gcc.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\atomicops_internals_x86_msvc.h" include\google\protobuf\stubs\atomicops_internals_x86_msvc.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\bytestream.h" include\google\protobuf\stubs\bytestream.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\callback.h" include\google\protobuf\stubs\callback.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\casts.h" include\google\protobuf\stubs\casts.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\common.h" include\google\protobuf\stubs\common.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\fastmem.h" include\google\protobuf\stubs\fastmem.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\hash.h" include\google\protobuf\stubs\hash.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\logging.h" include\google\protobuf\stubs\logging.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\macros.h" include\google\protobuf\stubs\macros.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\mutex.h" include\google\protobuf\stubs\mutex.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\once.h" include\google\protobuf\stubs\once.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\platform_macros.h" include\google\protobuf\stubs\platform_macros.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\port.h" include\google\protobuf\stubs\port.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\scoped_ptr.h" include\google\protobuf\stubs\scoped_ptr.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\shared_ptr.h" include\google\protobuf\stubs\shared_ptr.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\singleton.h" include\google\protobuf\stubs\singleton.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\status.h" include\google\protobuf\stubs\status.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\stl_util.h" include\google\protobuf\stubs\stl_util.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\stringpiece.h" include\google\protobuf\stubs\stringpiece.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\template_util.h" include\google\protobuf\stubs\template_util.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\stubs\type_traits.h" include\google\protobuf\stubs\type_traits.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\text_format.h" include\google\protobuf\text_format.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\timestamp.pb.h" include\google\protobuf\timestamp.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\type.pb.h" include\google\protobuf\type.pb.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\unknown_field_set.h" include\google\protobuf\unknown_field_set.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\delimited_message_util.h" include\google\protobuf\util\delimited_message_util.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\field_comparator.h" include\google\protobuf\util\field_comparator.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\field_mask_util.h" include\google\protobuf\util\field_mask_util.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\json_util.h" include\google\protobuf\util\json_util.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\message_differencer.h" include\google\protobuf\util\message_differencer.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\time_util.h" include\google\protobuf\util\time_util.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\type_resolver.h" include\google\protobuf\util\type_resolver.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\util\type_resolver_util.h" include\google\protobuf\util\type_resolver_util.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format.h" include\google\protobuf\wire_format.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format_lite.h" include\google\protobuf\wire_format_lite.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wire_format_lite_inl.h" include\google\protobuf\wire_format_lite_inl.h
|
||||
copy "${PROTOBUF_SOURCE_WIN32_PATH}\..\src\google\protobuf\wrappers.pb.h" include\google\protobuf\wrappers.pb.h
|
||||
|
|
|
@ -20,18 +20,12 @@ install(TARGETS protoc EXPORT protobuf-targets
|
|||
file(STRINGS extract_includes.bat.in _extract_strings
|
||||
REGEX "^copy")
|
||||
foreach(_extract_string ${_extract_strings})
|
||||
string(REPLACE "copy \${PROTOBUF_SOURCE_WIN32_PATH}\\" ""
|
||||
_extract_string ${_extract_string})
|
||||
string(REPLACE "\\" "/" _extract_string ${_extract_string})
|
||||
string(REGEX MATCH "^[^ ]+"
|
||||
_extract_from ${_extract_string})
|
||||
string(REGEX REPLACE "^${_extract_from} ([^$]+)" "\\1"
|
||||
_extract_to ${_extract_string})
|
||||
get_filename_component(_extract_from "${protobuf_SOURCE_DIR}/${_extract_from}" ABSOLUTE)
|
||||
get_filename_component(_extract_name ${_extract_to} NAME)
|
||||
get_filename_component(_extract_to ${_extract_to} PATH)
|
||||
string(REPLACE "include/" "${CMAKE_INSTALL_INCLUDEDIR}/"
|
||||
_extract_to "${_extract_to}")
|
||||
string(REGEX REPLACE "^.* .+ include\\\\(.+)$" "\\1"
|
||||
_header ${_extract_string})
|
||||
string(REPLACE "\\" "/" _header ${_header})
|
||||
get_filename_component(_extract_from "${protobuf_SOURCE_DIR}/../src/${_header}" ABSOLUTE)
|
||||
get_filename_component(_extract_name ${_header} NAME)
|
||||
get_filename_component(_extract_to "${CMAKE_INSTALL_INCLUDEDIR}/${_header}" PATH)
|
||||
if(EXISTS "${_extract_from}")
|
||||
install(FILES "${_extract_from}"
|
||||
DESTINATION "${_extract_to}"
|
||||
|
@ -110,7 +104,7 @@ install(EXPORT protobuf-targets
|
|||
NAMESPACE protobuf::
|
||||
COMPONENT protobuf-export)
|
||||
|
||||
install(DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}/
|
||||
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_CMAKEDIR}/
|
||||
DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
|
||||
COMPONENT protobuf-export
|
||||
PATTERN protobuf-targets.cmake EXCLUDE
|
||||
|
|
|
@ -30,6 +30,7 @@ set(libprotobuf_files
|
|||
${protobuf_source_dir}/src/google/protobuf/timestamp.pb.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/type.pb.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/unknown_field_set.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/util/delimited_message_util.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/util/field_comparator.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/util/field_mask_util.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/util/internal/datapiece.cc
|
||||
|
@ -56,7 +57,10 @@ set(libprotobuf_files
|
|||
|
||||
add_library(libprotobuf ${protobuf_SHARED_OR_STATIC}
|
||||
${libprotobuf_lite_files} ${libprotobuf_files})
|
||||
target_link_libraries(libprotobuf ${CMAKE_THREAD_LIBS_INIT} ${ZLIB_LIBRARIES})
|
||||
target_link_libraries(libprotobuf ${CMAKE_THREAD_LIBS_INIT})
|
||||
if(protobuf_WITH_ZLIB)
|
||||
target_link_libraries(libprotobuf ${ZLIB_LIBRARIES})
|
||||
endif()
|
||||
target_include_directories(libprotobuf PUBLIC ${protobuf_source_dir}/src)
|
||||
if(MSVC AND protobuf_BUILD_SHARED_LIBS)
|
||||
target_compile_definitions(libprotobuf
|
||||
|
|
|
@ -72,6 +72,7 @@ set(libprotoc_files
|
|||
${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_message_field.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/javanano/javanano_primitive_field.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/js/js_generator.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types_embed.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
|
||||
|
@ -84,14 +85,28 @@ set(libprotoc_files
|
|||
${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_message_field.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/php/php_generator.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/plugin.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/plugin.pb.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/profile.pb.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/python/python_generator.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/ruby/ruby_generator.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/subprocess.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/zip_writer.cc
|
||||
)
|
||||
|
||||
set(js_well_known_types_sources
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types/any.js
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types/struct.js
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types/timestamp.js
|
||||
)
|
||||
add_executable(js_embed ${protobuf_source_dir}/src/google/protobuf/compiler/js/embed.cc)
|
||||
add_custom_command(
|
||||
OUTPUT ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types_embed.cc
|
||||
DEPENDS js_embed ${js_well_known_types_sources}
|
||||
COMMAND js_embed ${js_well_known_types_sources} > ${protobuf_source_dir}/src/google/protobuf/compiler/js/well_known_types_embed.cc
|
||||
)
|
||||
|
||||
add_library(libprotoc ${protobuf_SHARED_OR_STATIC}
|
||||
${libprotoc_files})
|
||||
target_link_libraries(libprotoc libprotobuf)
|
||||
|
|
|
@ -3,7 +3,7 @@ set(${PACKAGE_FIND_NAME}_VERSION_PRERELEASE "@protobuf_VERSION_PRERELEASE@" PARE
|
|||
|
||||
# Prerelease versions cannot be passed in directly via the find_package command,
|
||||
# so we allow users to specify it in a variable
|
||||
if(NOT DEFINED "${${PACKAGE_FIND_NAME}_FIND_VERSION_PRERELEASE}")
|
||||
if(NOT DEFINED "${PACKAGE_FIND_NAME}_FIND_VERSION_PRERELEASE")
|
||||
set("${${PACKAGE_FIND_NAME}_FIND_VERSION_PRERELEASE}" "")
|
||||
else()
|
||||
set(PACKAGE_FIND_VERSION ${PACKAGE_FIND_VERSION}-${${PACKAGE_FIND_NAME}_FIND_VERSION_PRERELEASE})
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
# User options
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/protobuf-options.cmake")
|
||||
|
||||
# Depend packages
|
||||
@_protobuf_FIND_ZLIB@
|
||||
|
||||
# Imported targets
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/protobuf-targets.cmake")
|
||||
|
||||
|
|
|
@ -147,7 +147,6 @@ function(_protobuf_find_libraries name filename)
|
|||
LOCATION_RELEASE)
|
||||
get_target_property(${name}_LIBRARY_DEBUG protobuf::lib${filename}
|
||||
LOCATION_DEBUG)
|
||||
endif()
|
||||
|
||||
select_library_configurations(${name})
|
||||
set(${name}_LIBRARY ${${name}_LIBRARY} PARENT_SCOPE)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Verbose output
|
||||
option(protobuf_VERBOSE "Enable for verbose output" OFF)
|
||||
mark_as_advanced(protobuf_VERBOSE)
|
||||
|
||||
# FindProtobuf module compatibel
|
||||
option(protobuf_MODULE_COMPATIBLE "CMake build-in FindProtobuf.cmake module compatible" OFF)
|
||||
mark_as_advanced(protobuf_MODULE_COMPATIBLE)
|
||||
# Verbose output
|
||||
option(protobuf_VERBOSE "Enable for verbose output" OFF)
|
||||
mark_as_advanced(protobuf_VERBOSE)
|
||||
|
||||
# FindProtobuf module compatibel
|
||||
option(protobuf_MODULE_COMPATIBLE "CMake build-in FindProtobuf.cmake module compatible" OFF)
|
||||
mark_as_advanced(protobuf_MODULE_COMPATIBLE)
|
||||
|
|
|
@ -17,6 +17,7 @@ add_library(gmock STATIC
|
|||
${protobuf_source_dir}/gmock/src/gmock-all.cc
|
||||
${protobuf_source_dir}/gmock/gtest/src/gtest-all.cc
|
||||
)
|
||||
target_link_libraries(gmock ${CMAKE_THREAD_LIBS_INIT})
|
||||
add_library(gmock_main STATIC ${protobuf_source_dir}/gmock/src/gmock_main.cc)
|
||||
target_link_libraries(gmock_main gmock)
|
||||
|
||||
|
@ -42,6 +43,9 @@ set(tests_protos
|
|||
google/protobuf/unittest_empty.proto
|
||||
google/protobuf/unittest_import.proto
|
||||
google/protobuf/unittest_import_public.proto
|
||||
google/protobuf/unittest_lazy_dependencies.proto
|
||||
google/protobuf/unittest_lazy_dependencies_custom_option.proto
|
||||
google/protobuf/unittest_lazy_dependencies_enum.proto
|
||||
google/protobuf/unittest_lite_imports_nonlite.proto
|
||||
google/protobuf/unittest_mset.proto
|
||||
google/protobuf/unittest_mset_wire_format.proto
|
||||
|
@ -63,8 +67,10 @@ set(tests_protos
|
|||
google/protobuf/util/internal/testdata/field_mask.proto
|
||||
google/protobuf/util/internal/testdata/maps.proto
|
||||
google/protobuf/util/internal/testdata/oneofs.proto
|
||||
google/protobuf/util/internal/testdata/proto3.proto
|
||||
google/protobuf/util/internal/testdata/struct.proto
|
||||
google/protobuf/util/internal/testdata/timestamp_duration.proto
|
||||
google/protobuf/util/internal/testdata/wrappers.proto
|
||||
google/protobuf/util/json_format_proto3.proto
|
||||
google/protobuf/util/message_differencer_unittest.proto
|
||||
)
|
||||
|
@ -120,6 +126,7 @@ set(tests_files
|
|||
${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/cpp/cpp_unittest.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/cpp/metadata_test.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_bootstrap_unittest.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/csharp/csharp_generator_unittest.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/importer_unittest.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc
|
||||
|
@ -165,6 +172,7 @@ set(tests_files
|
|||
${protobuf_source_dir}/src/google/protobuf/stubs/type_traits_unittest.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/text_format_unittest.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/unknown_field_set_unittest.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/util/delimited_message_util_test.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/util/field_comparator_test.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/util/field_mask_util_test.cc
|
||||
${protobuf_source_dir}/src/google/protobuf/util/internal/default_value_objectwriter_test.cc
|
||||
|
@ -202,7 +210,7 @@ set(lite_test_files
|
|||
${protobuf_source_dir}/src/google/protobuf/lite_unittest.cc
|
||||
)
|
||||
add_executable(lite-test ${lite_test_files} ${common_lite_test_files} ${lite_test_proto_files})
|
||||
target_link_libraries(lite-test libprotobuf-lite)
|
||||
target_link_libraries(lite-test libprotobuf-lite gmock_main)
|
||||
|
||||
set(lite_arena_test_files
|
||||
${protobuf_source_dir}/src/google/protobuf/lite_arena_unittest.cc
|
||||
|
@ -212,4 +220,5 @@ target_link_libraries(lite-arena-test libprotobuf-lite gmock_main)
|
|||
|
||||
add_custom_target(check
|
||||
COMMAND tests
|
||||
DEPENDS tests test_plugin
|
||||
WORKING_DIRECTORY ${protobuf_source_dir})
|
||||
|
|
23
composer.json
Normal file
23
composer.json
Normal file
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"name": "google/protobuf",
|
||||
"type": "library",
|
||||
"description": "proto library for PHP",
|
||||
"keywords": ["proto"],
|
||||
"homepage": "https://developers.google.com/protocol-buffers/",
|
||||
"license": "BSD-3-Clause",
|
||||
"require": {
|
||||
"php": ">=5.5.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": ">=4.8.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Google\\Protobuf\\Internal\\": "php/src/Google/Protobuf/Internal",
|
||||
"GPBMetadata\\Google\\Protobuf\\Internal\\": "php/src/GPBMetadata/Google/Protobuf/Internal"
|
||||
},
|
||||
"files": [
|
||||
"php/src/Google/Protobuf/descriptor.php"
|
||||
]
|
||||
}
|
||||
}
|
26
configure.ac
26
configure.ac
|
@ -17,7 +17,7 @@ AC_PREREQ(2.59)
|
|||
# In the SVN trunk, the version should always be the next anticipated release
|
||||
# version with the "-pre" suffix. (We used to use "-SNAPSHOT" but this pushed
|
||||
# the size of one file name in the dist tarfile over the 99-char limit.)
|
||||
AC_INIT([Protocol Buffers],[3.0.0-beta-3],[protobuf@googlegroups.com],[protobuf])
|
||||
AC_INIT([Protocol Buffers],[3.3.0],[protobuf@googlegroups.com],[protobuf])
|
||||
|
||||
AM_MAINTAINER_MODE([enable])
|
||||
|
||||
|
@ -31,7 +31,7 @@ AC_CONFIG_MACRO_DIR([m4])
|
|||
AC_ARG_VAR(DIST_LANG, [language to include in the distribution package (i.e., make dist)])
|
||||
case "$DIST_LANG" in
|
||||
"") DIST_LANG=all ;;
|
||||
all | cpp | csharp | java | python | javanano | objectivec | ruby | js) ;;
|
||||
all | cpp | csharp | java | python | javanano | objectivec | ruby | js | php) ;;
|
||||
*) AC_MSG_FAILURE([unknown language: $DIST_LANG]) ;;
|
||||
esac
|
||||
AC_SUBST(DIST_LANG)
|
||||
|
@ -60,6 +60,7 @@ AC_ARG_WITH([protoc],
|
|||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CXX_FOR_BUILD
|
||||
AC_LANG([C++])
|
||||
ACX_USE_SYSTEM_EXTENSIONS
|
||||
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
|
||||
|
@ -92,6 +93,25 @@ ACX_CHECK_SUNCC
|
|||
# to the link
|
||||
AC_PROG_LIBTOOL
|
||||
|
||||
# Check whether the linker supports version scripts
|
||||
AC_MSG_CHECKING([whether the linker supports version scripts])
|
||||
save_LDFLAGS=$LDFLAGS
|
||||
LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
|
||||
cat > conftest.map <<EOF
|
||||
{
|
||||
global:
|
||||
main;
|
||||
local:
|
||||
*;
|
||||
};
|
||||
EOF
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_SOURCE([int main() { return 0; }])],
|
||||
[have_ld_version_script=yes; AC_MSG_RESULT(yes)],
|
||||
[have_ld_version_script=no; AC_MSG_RESULT(no)])
|
||||
LDFLAGS=$save_LDFLAGS
|
||||
AM_CONDITIONAL([HAVE_LD_VERSION_SCRIPT], [test "$have_ld_version_script" == "yes"])
|
||||
|
||||
# Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
AC_CHECK_HEADERS([fcntl.h inttypes.h limits.h stdlib.h unistd.h])
|
||||
|
@ -178,6 +198,8 @@ case "$target_os" in
|
|||
esac
|
||||
AM_CONDITIONAL([OBJC_CONFORMANCE_TEST], [test $OBJC_CONFORMANCE_TEST = 1])
|
||||
|
||||
AX_CXX_COMPILE_STDCXX([11], [noext], [optional])
|
||||
|
||||
# HACK: Make gmock's configure script pick up our copy of CFLAGS and CXXFLAGS,
|
||||
# since the flags added by ACX_CHECK_SUNCC must be used when compiling gmock
|
||||
# too.
|
||||
|
|
|
@ -1,8 +1,12 @@
|
|||
|
||||
import com.google.protobuf.ByteString;
|
||||
import com.google.protobuf.CodedInputStream;
|
||||
import com.google.protobuf.conformance.Conformance;
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
import com.google.protobuf_test_messages.proto3.TestMessagesProto3;
|
||||
import com.google.protobuf.util.JsonFormat;
|
||||
import com.google.protobuf.util.JsonFormat.TypeRegistry;
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
class ConformanceJava {
|
||||
private int testCount = 0;
|
||||
|
@ -47,13 +51,182 @@ class ConformanceJava {
|
|||
writeToStdout(buf);
|
||||
}
|
||||
|
||||
private enum BinaryDecoder {
|
||||
BYTE_STRING_DECODER() {
|
||||
@Override
|
||||
public TestMessagesProto3.TestAllTypes parse(ByteString bytes)
|
||||
throws InvalidProtocolBufferException {
|
||||
return TestMessagesProto3.TestAllTypes.parseFrom(bytes);
|
||||
}
|
||||
},
|
||||
BYTE_ARRAY_DECODER() {
|
||||
@Override
|
||||
public TestMessagesProto3.TestAllTypes parse(ByteString bytes)
|
||||
throws InvalidProtocolBufferException {
|
||||
return TestMessagesProto3.TestAllTypes.parseFrom(bytes.toByteArray());
|
||||
}
|
||||
},
|
||||
ARRAY_BYTE_BUFFER_DECODER() {
|
||||
@Override
|
||||
public TestMessagesProto3.TestAllTypes parse(ByteString bytes)
|
||||
throws InvalidProtocolBufferException {
|
||||
ByteBuffer buffer = ByteBuffer.allocate(bytes.size());
|
||||
bytes.copyTo(buffer);
|
||||
buffer.flip();
|
||||
try {
|
||||
return TestMessagesProto3.TestAllTypes.parseFrom(CodedInputStream.newInstance(buffer));
|
||||
} catch (InvalidProtocolBufferException e) {
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(
|
||||
"ByteString based ByteBuffer should not throw IOException.", e);
|
||||
}
|
||||
}
|
||||
},
|
||||
READONLY_ARRAY_BYTE_BUFFER_DECODER() {
|
||||
@Override
|
||||
public TestMessagesProto3.TestAllTypes parse(ByteString bytes)
|
||||
throws InvalidProtocolBufferException {
|
||||
try {
|
||||
return TestMessagesProto3.TestAllTypes.parseFrom(
|
||||
CodedInputStream.newInstance(bytes.asReadOnlyByteBuffer()));
|
||||
} catch (InvalidProtocolBufferException e) {
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(
|
||||
"ByteString based ByteBuffer should not throw IOException.", e);
|
||||
}
|
||||
}
|
||||
},
|
||||
DIRECT_BYTE_BUFFER_DECODER() {
|
||||
@Override
|
||||
public TestMessagesProto3.TestAllTypes parse(ByteString bytes)
|
||||
throws InvalidProtocolBufferException {
|
||||
ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.size());
|
||||
bytes.copyTo(buffer);
|
||||
buffer.flip();
|
||||
try {
|
||||
return TestMessagesProto3.TestAllTypes.parseFrom(CodedInputStream.newInstance(buffer));
|
||||
} catch (InvalidProtocolBufferException e) {
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(
|
||||
"ByteString based ByteBuffer should not throw IOException.", e);
|
||||
}
|
||||
}
|
||||
},
|
||||
READONLY_DIRECT_BYTE_BUFFER_DECODER() {
|
||||
@Override
|
||||
public TestMessagesProto3.TestAllTypes parse(ByteString bytes)
|
||||
throws InvalidProtocolBufferException {
|
||||
ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.size());
|
||||
bytes.copyTo(buffer);
|
||||
buffer.flip();
|
||||
try {
|
||||
return TestMessagesProto3.TestAllTypes.parseFrom(
|
||||
CodedInputStream.newInstance(buffer.asReadOnlyBuffer()));
|
||||
} catch (InvalidProtocolBufferException e) {
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(
|
||||
"ByteString based ByteBuffer should not throw IOException.", e);
|
||||
}
|
||||
}
|
||||
},
|
||||
INPUT_STREAM_DECODER() {
|
||||
@Override
|
||||
public TestMessagesProto3.TestAllTypes parse(ByteString bytes)
|
||||
throws InvalidProtocolBufferException {
|
||||
try {
|
||||
return TestMessagesProto3.TestAllTypes.parseFrom(bytes.newInput());
|
||||
} catch (InvalidProtocolBufferException e) {
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(
|
||||
"ByteString based InputStream should not throw IOException.", e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public abstract TestMessagesProto3.TestAllTypes parse(ByteString bytes)
|
||||
throws InvalidProtocolBufferException;
|
||||
}
|
||||
|
||||
private TestMessagesProto3.TestAllTypes parseBinary(ByteString bytes)
|
||||
throws InvalidProtocolBufferException {
|
||||
TestMessagesProto3.TestAllTypes[] messages =
|
||||
new TestMessagesProto3.TestAllTypes[BinaryDecoder.values().length];
|
||||
InvalidProtocolBufferException[] exceptions =
|
||||
new InvalidProtocolBufferException[BinaryDecoder.values().length];
|
||||
|
||||
boolean hasMessage = false;
|
||||
boolean hasException = false;
|
||||
for (int i = 0; i < BinaryDecoder.values().length; ++i) {
|
||||
try {
|
||||
messages[i] = BinaryDecoder.values()[i].parse(bytes);
|
||||
hasMessage = true;
|
||||
} catch (InvalidProtocolBufferException e) {
|
||||
exceptions[i] = e;
|
||||
hasException = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasMessage && hasException) {
|
||||
StringBuilder sb =
|
||||
new StringBuilder("Binary decoders disagreed on whether the payload was valid.\n");
|
||||
for (int i = 0; i < BinaryDecoder.values().length; ++i) {
|
||||
sb.append(BinaryDecoder.values()[i].name());
|
||||
if (messages[i] != null) {
|
||||
sb.append(" accepted the payload.\n");
|
||||
} else {
|
||||
sb.append(" rejected the payload.\n");
|
||||
}
|
||||
}
|
||||
throw new RuntimeException(sb.toString());
|
||||
}
|
||||
|
||||
if (hasException) {
|
||||
// We do not check if exceptions are equal. Different implementations may return different
|
||||
// exception messages. Throw an arbitrary one out instead.
|
||||
throw exceptions[0];
|
||||
}
|
||||
|
||||
// Fast path comparing all the messages with the first message, assuming equality being
|
||||
// symmetric and transitive.
|
||||
boolean allEqual = true;
|
||||
for (int i = 1; i < messages.length; ++i) {
|
||||
if (!messages[0].equals(messages[i])) {
|
||||
allEqual = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Slow path: compare and find out all unequal pairs.
|
||||
if (!allEqual) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < messages.length - 1; ++i) {
|
||||
for (int j = i + 1; j < messages.length; ++j) {
|
||||
if (!messages[i].equals(messages[j])) {
|
||||
sb.append(BinaryDecoder.values()[i].name())
|
||||
.append(" and ")
|
||||
.append(BinaryDecoder.values()[j].name())
|
||||
.append(" parsed the payload differently.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new RuntimeException(sb.toString());
|
||||
}
|
||||
|
||||
return messages[0];
|
||||
}
|
||||
|
||||
private Conformance.ConformanceResponse doTest(Conformance.ConformanceRequest request) {
|
||||
Conformance.TestAllTypes testMessage;
|
||||
TestMessagesProto3.TestAllTypes testMessage;
|
||||
|
||||
switch (request.getPayloadCase()) {
|
||||
case PROTOBUF_PAYLOAD: {
|
||||
try {
|
||||
testMessage = Conformance.TestAllTypes.parseFrom(request.getProtobufPayload());
|
||||
testMessage = parseBinary(request.getProtobufPayload());
|
||||
} catch (InvalidProtocolBufferException e) {
|
||||
return Conformance.ConformanceResponse.newBuilder().setParseError(e.getMessage()).build();
|
||||
}
|
||||
|
@ -61,7 +234,7 @@ class ConformanceJava {
|
|||
}
|
||||
case JSON_PAYLOAD: {
|
||||
try {
|
||||
Conformance.TestAllTypes.Builder builder = Conformance.TestAllTypes.newBuilder();
|
||||
TestMessagesProto3.TestAllTypes.Builder builder = TestMessagesProto3.TestAllTypes.newBuilder();
|
||||
JsonFormat.parser().usingTypeRegistry(typeRegistry)
|
||||
.merge(request.getJsonPayload(), builder);
|
||||
testMessage = builder.build();
|
||||
|
@ -127,7 +300,7 @@ class ConformanceJava {
|
|||
|
||||
public void run() throws Exception {
|
||||
typeRegistry = TypeRegistry.newBuilder().add(
|
||||
Conformance.TestAllTypes.getDescriptor()).build();
|
||||
TestMessagesProto3.TestAllTypes.getDescriptor()).build();
|
||||
while (doTestIo()) {
|
||||
this.testCount++;
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@ class ConformanceJavaLite {
|
|||
}
|
||||
case JSON_PAYLOAD: {
|
||||
return Conformance.ConformanceResponse.newBuilder().setSkipped(
|
||||
"Lite runtime does not suport Json Formant.").build();
|
||||
"Lite runtime does not support JSON format.").build();
|
||||
}
|
||||
case PAYLOAD_NOT_SET: {
|
||||
throw new RuntimeException("Request didn't have payload.");
|
||||
|
@ -78,7 +78,7 @@ class ConformanceJavaLite {
|
|||
|
||||
case JSON:
|
||||
return Conformance.ConformanceResponse.newBuilder().setSkipped(
|
||||
"Lite runtime does not suport Json Formant.").build();
|
||||
"Lite runtime does not support JSON format.").build();
|
||||
|
||||
default: {
|
||||
throw new RuntimeException("Unexpected request output.");
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
conformance_protoc_inputs = \
|
||||
conformance.proto
|
||||
conformance.proto \
|
||||
$(top_srcdir)/src/google/protobuf/test_messages_proto3.proto
|
||||
|
||||
well_known_type_protoc_inputs = \
|
||||
$(top_srcdir)/src/google/protobuf/any.proto \
|
||||
|
@ -20,7 +21,8 @@ other_language_protoc_outputs = \
|
|||
conformance_pb2.py \
|
||||
Conformance.pbobjc.h \
|
||||
Conformance.pbobjc.m \
|
||||
conformance.rb \
|
||||
conformance_pb.js \
|
||||
conformance_pb.rb \
|
||||
com/google/protobuf/Any.java \
|
||||
com/google/protobuf/AnyOrBuilder.java \
|
||||
com/google/protobuf/AnyProto.java \
|
||||
|
@ -61,6 +63,7 @@ other_language_protoc_outputs = \
|
|||
com/google/protobuf/Value.java \
|
||||
com/google/protobuf/ValueOrBuilder.java \
|
||||
com/google/protobuf/WrappersProto.java \
|
||||
com/google/protobuf_test_messages/proto3/TestMessagesProto3.java \
|
||||
google/protobuf/any.pb.cc \
|
||||
google/protobuf/any.pb.h \
|
||||
google/protobuf/any.rb \
|
||||
|
@ -77,6 +80,12 @@ other_language_protoc_outputs = \
|
|||
google/protobuf/struct.pb.h \
|
||||
google/protobuf/struct.rb \
|
||||
google/protobuf/struct_pb2.py \
|
||||
google/protobuf/TestMessagesProto3.pbobjc.h \
|
||||
google/protobuf/TestMessagesProto3.pbobjc.m \
|
||||
google/protobuf/test_messages_proto3.pb.cc \
|
||||
google/protobuf/test_messages_proto3.pb.h \
|
||||
google/protobuf/test_messages_proto3_pb.rb \
|
||||
google/protobuf/test_messages_proto3_pb2.py \
|
||||
google/protobuf/timestamp.pb.cc \
|
||||
google/protobuf/timestamp.pb.h \
|
||||
google/protobuf/timestamp.rb \
|
||||
|
@ -85,46 +94,79 @@ other_language_protoc_outputs = \
|
|||
google/protobuf/wrappers.pb.h \
|
||||
google/protobuf/wrappers.rb \
|
||||
google/protobuf/wrappers_pb2.py \
|
||||
lite/com/google/protobuf/Any.java \
|
||||
lite/com/google/protobuf/AnyOrBuilder.java \
|
||||
lite/com/google/protobuf/AnyProto.java \
|
||||
lite/com/google/protobuf/BoolValue.java \
|
||||
lite/com/google/protobuf/BoolValueOrBuilder.java \
|
||||
lite/com/google/protobuf/BytesValue.java \
|
||||
lite/com/google/protobuf/BytesValueOrBuilder.java \
|
||||
lite/com/google/protobuf/conformance/Conformance.java \
|
||||
lite/com/google/protobuf/DoubleValue.java \
|
||||
lite/com/google/protobuf/DoubleValueOrBuilder.java \
|
||||
lite/com/google/protobuf/Duration.java \
|
||||
lite/com/google/protobuf/DurationOrBuilder.java \
|
||||
lite/com/google/protobuf/DurationProto.java \
|
||||
lite/com/google/protobuf/FieldMask.java \
|
||||
lite/com/google/protobuf/FieldMaskOrBuilder.java \
|
||||
lite/com/google/protobuf/FieldMaskProto.java \
|
||||
lite/com/google/protobuf/FloatValue.java \
|
||||
lite/com/google/protobuf/FloatValueOrBuilder.java \
|
||||
lite/com/google/protobuf/Int32Value.java \
|
||||
lite/com/google/protobuf/Int32ValueOrBuilder.java \
|
||||
lite/com/google/protobuf/Int64Value.java \
|
||||
lite/com/google/protobuf/Int64ValueOrBuilder.java \
|
||||
lite/com/google/protobuf/ListValue.java \
|
||||
lite/com/google/protobuf/ListValueOrBuilder.java \
|
||||
lite/com/google/protobuf/NullValue.java \
|
||||
lite/com/google/protobuf/StringValue.java \
|
||||
lite/com/google/protobuf/StringValueOrBuilder.java \
|
||||
lite/com/google/protobuf/Struct.java \
|
||||
lite/com/google/protobuf/StructOrBuilder.java \
|
||||
lite/com/google/protobuf/StructProto.java \
|
||||
lite/com/google/protobuf/Timestamp.java \
|
||||
lite/com/google/protobuf/TimestampOrBuilder.java \
|
||||
lite/com/google/protobuf/TimestampProto.java \
|
||||
lite/com/google/protobuf/UInt32Value.java \
|
||||
lite/com/google/protobuf/UInt32ValueOrBuilder.java \
|
||||
lite/com/google/protobuf/UInt64Value.java \
|
||||
lite/com/google/protobuf/UInt64ValueOrBuilder.java \
|
||||
lite/com/google/protobuf/Value.java \
|
||||
lite/com/google/protobuf/ValueOrBuilder.java \
|
||||
lite/com/google/protobuf/WrappersProto.java
|
||||
Conformance/ConformanceRequest.php \
|
||||
Conformance/ConformanceResponse.php \
|
||||
Conformance/WireFormat.php \
|
||||
GPBMetadata/Conformance.php \
|
||||
GPBMetadata/Google/Protobuf/Any.php \
|
||||
GPBMetadata/Google/Protobuf/Duration.php \
|
||||
GPBMetadata/Google/Protobuf/FieldMask.php \
|
||||
GPBMetadata/Google/Protobuf/Struct.php \
|
||||
GPBMetadata/Google/Protobuf/TestMessagesProto3.php \
|
||||
GPBMetadata/Google/Protobuf/Timestamp.php \
|
||||
GPBMetadata/Google/Protobuf/Wrappers.php \
|
||||
Google/Protobuf/Any.php \
|
||||
Google/Protobuf/BoolValue.php \
|
||||
Google/Protobuf/BytesValue.php \
|
||||
Google/Protobuf/DoubleValue.php \
|
||||
Google/Protobuf/Duration.php \
|
||||
Google/Protobuf/FieldMask.php \
|
||||
Google/Protobuf/FloatValue.php \
|
||||
Google/Protobuf/Int32Value.php \
|
||||
Google/Protobuf/Int64Value.php \
|
||||
Google/Protobuf/ListValue.php \
|
||||
Google/Protobuf/NullValue.php \
|
||||
Google/Protobuf/StringValue.php \
|
||||
Google/Protobuf/Struct.php \
|
||||
Google/Protobuf/Timestamp.php \
|
||||
Google/Protobuf/UInt32Value.php \
|
||||
Google/Protobuf/UInt64Value.php \
|
||||
Google/Protobuf/Value.php \
|
||||
Protobuf_test_messages/Proto3/ForeignEnum.php \
|
||||
Protobuf_test_messages/Proto3/ForeignMessage.php \
|
||||
Protobuf_test_messages/Proto3/TestAllTypes_NestedEnum.php \
|
||||
Protobuf_test_messages/Proto3/TestAllTypes_NestedMessage.php \
|
||||
Protobuf_test_messages/Proto3/TestAllTypes.php
|
||||
# lite/com/google/protobuf/Any.java \
|
||||
# lite/com/google/protobuf/AnyOrBuilder.java \
|
||||
# lite/com/google/protobuf/AnyProto.java \
|
||||
# lite/com/google/protobuf/BoolValue.java \
|
||||
# lite/com/google/protobuf/BoolValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/BytesValue.java \
|
||||
# lite/com/google/protobuf/BytesValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/conformance/Conformance.java \
|
||||
# lite/com/google/protobuf/DoubleValue.java \
|
||||
# lite/com/google/protobuf/DoubleValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/Duration.java \
|
||||
# lite/com/google/protobuf/DurationOrBuilder.java \
|
||||
# lite/com/google/protobuf/DurationProto.java \
|
||||
# lite/com/google/protobuf/FieldMask.java \
|
||||
# lite/com/google/protobuf/FieldMaskOrBuilder.java \
|
||||
# lite/com/google/protobuf/FieldMaskProto.java \
|
||||
# lite/com/google/protobuf/FloatValue.java \
|
||||
# lite/com/google/protobuf/FloatValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/Int32Value.java \
|
||||
# lite/com/google/protobuf/Int32ValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/Int64Value.java \
|
||||
# lite/com/google/protobuf/Int64ValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/ListValue.java \
|
||||
# lite/com/google/protobuf/ListValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/NullValue.java \
|
||||
# lite/com/google/protobuf/StringValue.java \
|
||||
# lite/com/google/protobuf/StringValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/Struct.java \
|
||||
# lite/com/google/protobuf/StructOrBuilder.java \
|
||||
# lite/com/google/protobuf/StructProto.java \
|
||||
# lite/com/google/protobuf/Timestamp.java \
|
||||
# lite/com/google/protobuf/TimestampOrBuilder.java \
|
||||
# lite/com/google/protobuf/TimestampProto.java \
|
||||
# lite/com/google/protobuf/UInt32Value.java \
|
||||
# lite/com/google/protobuf/UInt32ValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/UInt64Value.java \
|
||||
# lite/com/google/protobuf/UInt64ValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/Value.java \
|
||||
# lite/com/google/protobuf/ValueOrBuilder.java \
|
||||
# lite/com/google/protobuf/WrappersProto.java
|
||||
|
||||
bin_PROGRAMS = conformance-test-runner conformance-cpp
|
||||
|
||||
|
@ -138,21 +180,25 @@ EXTRA_DIST = \
|
|||
conformance.proto \
|
||||
conformance_python.py \
|
||||
conformance_ruby.rb \
|
||||
conformance_php.php \
|
||||
failure_list_cpp.txt \
|
||||
failure_list_csharp.txt \
|
||||
failure_list_java.txt \
|
||||
failure_list_js.txt \
|
||||
failure_list_objc.txt \
|
||||
failure_list_python.txt \
|
||||
failure_list_python_cpp.txt \
|
||||
failure_list_python-post26.txt \
|
||||
failure_list_ruby.txt
|
||||
failure_list_ruby.txt \
|
||||
failure_list_php.txt \
|
||||
failure_list_php_c.txt
|
||||
|
||||
conformance_test_runner_LDADD = $(top_srcdir)/src/libprotobuf.la
|
||||
conformance_test_runner_SOURCES = conformance_test.h conformance_test.cc \
|
||||
conformance_test_runner.cc \
|
||||
third_party/jsoncpp/json.h \
|
||||
third_party/jsoncpp/jsoncpp.cpp
|
||||
nodist_conformance_test_runner_SOURCES = conformance.pb.cc
|
||||
nodist_conformance_test_runner_SOURCES = conformance.pb.cc google/protobuf/test_messages_proto3.pb.cc
|
||||
conformance_test_runner_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir)
|
||||
conformance_test_runner_CXXFLAGS = -std=c++11
|
||||
# Explicit deps beacuse BUILT_SOURCES are only done before a "make all/check"
|
||||
|
@ -162,7 +208,7 @@ conformance_test_runner-conformance_test_runner.$(OBJEXT): conformance.pb.h
|
|||
|
||||
conformance_cpp_LDADD = $(top_srcdir)/src/libprotobuf.la
|
||||
conformance_cpp_SOURCES = conformance_cpp.cc
|
||||
nodist_conformance_cpp_SOURCES = conformance.pb.cc
|
||||
nodist_conformance_cpp_SOURCES = conformance.pb.cc google/protobuf/test_messages_proto3.pb.cc
|
||||
conformance_cpp_CPPFLAGS = -I$(top_srcdir)/src
|
||||
# Explicit dep beacuse BUILT_SOURCES are only done before a "make all/check"
|
||||
# so a direct "make test_cpp" could fail if parallel enough.
|
||||
|
@ -173,7 +219,7 @@ if OBJC_CONFORMANCE_TEST
|
|||
bin_PROGRAMS += conformance-objc
|
||||
|
||||
conformance_objc_SOURCES = conformance_objc.m ../objectivec/GPBProtocolBuffers.m
|
||||
nodist_conformance_objc_SOURCES = Conformance.pbobjc.m
|
||||
nodist_conformance_objc_SOURCES = Conformance.pbobjc.m google/protobuf/TestMessagesProto3.pbobjc.m
|
||||
# On travis, the build fails without the isysroot because whatever system
|
||||
# headers are being found don't include generics support for
|
||||
# NSArray/NSDictionary, the only guess is their image at one time had an odd
|
||||
|
@ -182,17 +228,24 @@ conformance_objc_CPPFLAGS = -I$(top_srcdir)/objectivec -isysroot `xcrun --sdk ma
|
|||
conformance_objc_LDFLAGS = -framework Foundation
|
||||
# Explicit dep beacuse BUILT_SOURCES are only done before a "make all/check"
|
||||
# so a direct "make test_objc" could fail if parallel enough.
|
||||
conformance_objc-conformance_objc.$(OBJEXT): Conformance.pbobjc.h
|
||||
conformance_objc-conformance_objc.$(OBJEXT): Conformance.pbobjc.h google/protobuf/TestMessagesProto3.pbobjc.h
|
||||
|
||||
endif
|
||||
|
||||
# JavaScript well-known types are expected to be in a directory called
|
||||
# google-protobuf, because they are usually in the google-protobuf npm
|
||||
# package. But we want to use the sources from our tree, so we recreate
|
||||
# that directory structure here.
|
||||
google-protobuf:
|
||||
mkdir google-protobuf
|
||||
|
||||
if USE_EXTERNAL_PROTOC
|
||||
|
||||
# Some implementations include pre-generated versions of well-known types.
|
||||
protoc_middleman: $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
|
||||
$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=. $(conformance_protoc_inputs)
|
||||
$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --python_out=. $(well_known_type_protoc_inputs)
|
||||
$(PROTOC) -I$(srcdir) -I$(top_srcdir) --java_out=lite:lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
|
||||
protoc_middleman: $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf
|
||||
$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=. --php_out=. --js_out=import_style=commonjs,binary:. $(conformance_protoc_inputs)
|
||||
$(PROTOC) -I$(srcdir) -I$(top_srcdir) --cpp_out=. --java_out=. --ruby_out=. --python_out=. --php_out=. --js_out=import_style=commonjs,binary:google-protobuf $(well_known_type_protoc_inputs)
|
||||
## $(PROTOC) -I$(srcdir) -I$(top_srcdir) --java_out=lite:lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
|
||||
touch protoc_middleman
|
||||
|
||||
else
|
||||
|
@ -200,11 +253,11 @@ else
|
|||
# We have to cd to $(srcdir) before executing protoc because $(protoc_inputs) is
|
||||
# relative to srcdir, which may not be the same as the current directory when
|
||||
# building out-of-tree.
|
||||
protoc_middleman: $(top_srcdir)/src/protoc$(EXEEXT) $(conformance_protoc_inputs) $(well_known_type_protoc_inputs)
|
||||
oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd $(conformance_protoc_inputs) )
|
||||
oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --python_out=$$oldpwd $(well_known_type_protoc_inputs) )
|
||||
@mkdir -p lite
|
||||
oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --java_out=lite:$$oldpwd/lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) )
|
||||
protoc_middleman: $(top_srcdir)/src/protoc$(EXEEXT) $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) google-protobuf
|
||||
oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd --php_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd $(conformance_protoc_inputs) )
|
||||
oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --python_out=$$oldpwd --php_out=$$oldpwd --js_out=import_style=commonjs,binary:$$oldpwd/google-protobuf $(well_known_type_protoc_inputs) )
|
||||
## @mkdir -p lite
|
||||
## oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. -I$(top_srcdir)/src --java_out=lite:$$oldpwd/lite $(conformance_protoc_inputs) $(well_known_type_protoc_inputs) )
|
||||
touch protoc_middleman
|
||||
|
||||
endif
|
||||
|
@ -215,13 +268,13 @@ $(other_language_protoc_outputs): protoc_middleman
|
|||
|
||||
BUILT_SOURCES = $(protoc_outputs) $(other_language_protoc_outputs)
|
||||
|
||||
CLEANFILES = $(protoc_outputs) protoc_middleman javac_middleman conformance-java javac_middleman_lite conformance-java-lite conformance-csharp $(other_language_protoc_outputs)
|
||||
CLEANFILES = $(protoc_outputs) protoc_middleman javac_middleman conformance-java javac_middleman_lite conformance-java-lite conformance-csharp conformance-php conformance-php-c $(other_language_protoc_outputs)
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
Makefile.in
|
||||
|
||||
javac_middleman: ConformanceJava.java protoc_middleman $(other_language_protoc_outputs)
|
||||
jar=`ls ../java/util/target/*jar-with-dependencies.jar` && javac -classpath ../java/target/classes:$$jar ConformanceJava.java com/google/protobuf/conformance/Conformance.java
|
||||
jar=`ls ../java/util/target/*jar-with-dependencies.jar` && javac -classpath ../java/target/classes:$$jar ConformanceJava.java com/google/protobuf/conformance/Conformance.java com/google/protobuf_test_messages/proto3/TestMessagesProto3.java
|
||||
@touch javac_middleman
|
||||
|
||||
conformance-java: javac_middleman
|
||||
|
@ -246,36 +299,57 @@ conformance-java-lite: javac_middleman_lite
|
|||
conformance-csharp: $(other_language_protoc_outputs)
|
||||
@echo "Writing shortcut script conformance-csharp..."
|
||||
@echo '#! /bin/sh' > conformance-csharp
|
||||
@echo 'mono ../csharp/src/Google.Protobuf.Conformance/bin/Release/Google.Protobuf.Conformance.exe "$$@"' >> conformance-csharp
|
||||
@echo 'dotnet ../csharp/src/Google.Protobuf.Conformance/bin/Release/netcoreapp1.0/Google.Protobuf.Conformance.dll "$$@"' >> conformance-csharp
|
||||
@chmod +x conformance-csharp
|
||||
|
||||
conformance-php:
|
||||
@echo "Writing shortcut script conformance-php..."
|
||||
@echo '#! /bin/sh' > conformance-php
|
||||
@echo 'php ./conformance_php.php' >> conformance-php
|
||||
@chmod +x conformance-php
|
||||
|
||||
conformance-php-c:
|
||||
@echo "Writing shortcut script conformance-php-c..."
|
||||
@echo '#! /bin/sh' > conformance-php-c
|
||||
@echo 'php -dextension=../php/ext/google/protobuf/modules/protobuf.so ./conformance_php.php' >> conformance-php-c
|
||||
@chmod +x conformance-php-c
|
||||
|
||||
# Targets for actually running tests.
|
||||
test_cpp: protoc_middleman conformance-test-runner conformance-cpp
|
||||
./conformance-test-runner --failure_list failure_list_cpp.txt ./conformance-cpp
|
||||
./conformance-test-runner --enforce_recommended --failure_list failure_list_cpp.txt ./conformance-cpp
|
||||
|
||||
test_java: protoc_middleman conformance-test-runner conformance-java
|
||||
./conformance-test-runner --failure_list failure_list_java.txt ./conformance-java
|
||||
./conformance-test-runner --enforce_recommended --failure_list failure_list_java.txt ./conformance-java
|
||||
|
||||
test_java_lite: protoc_middleman conformance-test-runner conformance-java-lite
|
||||
./conformance-test-runner ./conformance-java-lite
|
||||
./conformance-test-runner --enforce_recommended ./conformance-java-lite
|
||||
|
||||
test_csharp: protoc_middleman conformance-test-runner conformance-csharp
|
||||
./conformance-test-runner --failure_list failure_list_csharp.txt ./conformance-csharp
|
||||
./conformance-test-runner --enforce_recommended --failure_list failure_list_csharp.txt ./conformance-csharp
|
||||
|
||||
test_ruby: protoc_middleman conformance-test-runner $(other_language_protoc_outputs)
|
||||
RUBYLIB=../ruby/lib:. ./conformance-test-runner --failure_list failure_list_ruby.txt ./conformance_ruby.rb
|
||||
RUBYLIB=../ruby/lib:. ./conformance-test-runner --enforce_recommended --failure_list failure_list_ruby.txt ./conformance_ruby.rb
|
||||
|
||||
test_php: protoc_middleman conformance-test-runner conformance-php $(other_language_protoc_outputs)
|
||||
./conformance-test-runner --enforce_recommended --failure_list failure_list_php.txt ./conformance-php
|
||||
|
||||
test_php_c: protoc_middleman conformance-test-runner conformance-php-c $(other_language_protoc_outputs)
|
||||
./conformance-test-runner --enforce_recommended --failure_list failure_list_php_c.txt ./conformance-php-c
|
||||
|
||||
# These depend on library paths being properly set up. The easiest way to
|
||||
# run them is to just use "tox" from the python dir.
|
||||
test_python: protoc_middleman conformance-test-runner
|
||||
./conformance-test-runner --failure_list failure_list_python.txt ./conformance_python.py
|
||||
./conformance-test-runner --enforce_recommended --failure_list failure_list_python.txt ./conformance_python.py
|
||||
|
||||
test_python_cpp: protoc_middleman conformance-test-runner
|
||||
./conformance-test-runner --failure_list failure_list_python_cpp.txt ./conformance_python.py
|
||||
./conformance-test-runner --enforce_recommended --failure_list failure_list_python_cpp.txt ./conformance_python.py
|
||||
|
||||
test_nodejs: protoc_middleman conformance-test-runner $(other_language_protoc_outputs)
|
||||
NODE_PATH=../js:. ./conformance-test-runner --enforce_recommended --failure_list failure_list_js.txt ./conformance_nodejs.js
|
||||
|
||||
if OBJC_CONFORMANCE_TEST
|
||||
|
||||
test_objc: protoc_middleman conformance-test-runner conformance-objc
|
||||
./conformance-test-runner --failure_list failure_list_objc.txt ./conformance-objc
|
||||
./conformance-test-runner --enforce_recommended --failure_list failure_list_objc.txt ./conformance-objc
|
||||
|
||||
endif
|
||||
|
|
|
@ -19,11 +19,39 @@ directory to build `protoc`, since all the tests depend on it.
|
|||
|
||||
$ make
|
||||
|
||||
Then to run the tests against the C++ implementation, run:
|
||||
Running the tests for C++
|
||||
-------------------------
|
||||
|
||||
To run the tests against the C++ implementation, run:
|
||||
|
||||
$ cd conformance && make test_cpp
|
||||
|
||||
More tests and languages will be added soon!
|
||||
Running the tests for JavaScript (Node.js)
|
||||
------------------------------------------
|
||||
|
||||
To run the JavaScript tests against Node.js, make sure you have "node"
|
||||
on your path and then run:
|
||||
|
||||
$ cd conformance && make test_nodejs
|
||||
|
||||
Running the tests for Ruby (MRI)
|
||||
--------------------------------
|
||||
|
||||
To run the Ruby tests against MRI, first build the C extension:
|
||||
|
||||
$ cd ruby && rake
|
||||
|
||||
Then run the tests like so:
|
||||
|
||||
$ cd conformance && make test_ruby
|
||||
|
||||
Running the tests for other languages
|
||||
-------------------------------------
|
||||
|
||||
Most of the languages in the Protobuf source tree are set up to run
|
||||
conformance tests. However some of them are more tricky to set up
|
||||
properly. See `tests.sh` in the base of the repository to see how
|
||||
Travis runs the tests.
|
||||
|
||||
Testing other Protocol Buffer implementations
|
||||
---------------------------------------------
|
||||
|
|
|
@ -32,13 +32,6 @@ syntax = "proto3";
|
|||
package conformance;
|
||||
option java_package = "com.google.protobuf.conformance";
|
||||
|
||||
import "google/protobuf/any.proto";
|
||||
import "google/protobuf/duration.proto";
|
||||
import "google/protobuf/field_mask.proto";
|
||||
import "google/protobuf/struct.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/protobuf/wrappers.proto";
|
||||
|
||||
// This defines the conformance testing protocol. This protocol exists between
|
||||
// the conformance test suite itself and the code being tested. For each test,
|
||||
// the suite will send a ConformanceRequest message and expect a
|
||||
|
@ -70,8 +63,13 @@ enum WireFormat {
|
|||
// 2. parse the protobuf or JSON payload in "payload" (which may fail)
|
||||
// 3. if the parse succeeded, serialize the message in the requested format.
|
||||
message ConformanceRequest {
|
||||
// The payload (whether protobuf of JSON) is always for a TestAllTypes proto
|
||||
// (see below).
|
||||
// The payload (whether protobuf of JSON) is always for a
|
||||
// protobuf_test_messages.proto3.TestAllTypes proto (as defined in
|
||||
// src/google/protobuf/proto3_test_messages.proto).
|
||||
//
|
||||
// TODO(haberman): if/when we expand the conformance tests to support proto2,
|
||||
// we will want to include a field that lets the payload/response be a
|
||||
// protobuf_test_messages.proto2.TestAllTypes message instead.
|
||||
oneof payload {
|
||||
bytes protobuf_payload = 1;
|
||||
string json_payload = 2;
|
||||
|
@ -114,160 +112,3 @@ message ConformanceResponse {
|
|||
string skipped = 5;
|
||||
}
|
||||
}
|
||||
|
||||
// This proto includes every type of field in both singular and repeated
|
||||
// forms.
|
||||
message TestAllTypes {
|
||||
message NestedMessage {
|
||||
int32 a = 1;
|
||||
TestAllTypes corecursive = 2;
|
||||
}
|
||||
|
||||
enum NestedEnum {
|
||||
FOO = 0;
|
||||
BAR = 1;
|
||||
BAZ = 2;
|
||||
NEG = -1; // Intentionally negative.
|
||||
}
|
||||
|
||||
// Singular
|
||||
int32 optional_int32 = 1;
|
||||
int64 optional_int64 = 2;
|
||||
uint32 optional_uint32 = 3;
|
||||
uint64 optional_uint64 = 4;
|
||||
sint32 optional_sint32 = 5;
|
||||
sint64 optional_sint64 = 6;
|
||||
fixed32 optional_fixed32 = 7;
|
||||
fixed64 optional_fixed64 = 8;
|
||||
sfixed32 optional_sfixed32 = 9;
|
||||
sfixed64 optional_sfixed64 = 10;
|
||||
float optional_float = 11;
|
||||
double optional_double = 12;
|
||||
bool optional_bool = 13;
|
||||
string optional_string = 14;
|
||||
bytes optional_bytes = 15;
|
||||
|
||||
NestedMessage optional_nested_message = 18;
|
||||
ForeignMessage optional_foreign_message = 19;
|
||||
|
||||
NestedEnum optional_nested_enum = 21;
|
||||
ForeignEnum optional_foreign_enum = 22;
|
||||
|
||||
string optional_string_piece = 24 [ctype=STRING_PIECE];
|
||||
string optional_cord = 25 [ctype=CORD];
|
||||
|
||||
TestAllTypes recursive_message = 27;
|
||||
|
||||
// Repeated
|
||||
repeated int32 repeated_int32 = 31;
|
||||
repeated int64 repeated_int64 = 32;
|
||||
repeated uint32 repeated_uint32 = 33;
|
||||
repeated uint64 repeated_uint64 = 34;
|
||||
repeated sint32 repeated_sint32 = 35;
|
||||
repeated sint64 repeated_sint64 = 36;
|
||||
repeated fixed32 repeated_fixed32 = 37;
|
||||
repeated fixed64 repeated_fixed64 = 38;
|
||||
repeated sfixed32 repeated_sfixed32 = 39;
|
||||
repeated sfixed64 repeated_sfixed64 = 40;
|
||||
repeated float repeated_float = 41;
|
||||
repeated double repeated_double = 42;
|
||||
repeated bool repeated_bool = 43;
|
||||
repeated string repeated_string = 44;
|
||||
repeated bytes repeated_bytes = 45;
|
||||
|
||||
repeated NestedMessage repeated_nested_message = 48;
|
||||
repeated ForeignMessage repeated_foreign_message = 49;
|
||||
|
||||
repeated NestedEnum repeated_nested_enum = 51;
|
||||
repeated ForeignEnum repeated_foreign_enum = 52;
|
||||
|
||||
repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];
|
||||
repeated string repeated_cord = 55 [ctype=CORD];
|
||||
|
||||
// Map
|
||||
map < int32, int32> map_int32_int32 = 56;
|
||||
map < int64, int64> map_int64_int64 = 57;
|
||||
map < uint32, uint32> map_uint32_uint32 = 58;
|
||||
map < uint64, uint64> map_uint64_uint64 = 59;
|
||||
map < sint32, sint32> map_sint32_sint32 = 60;
|
||||
map < sint64, sint64> map_sint64_sint64 = 61;
|
||||
map < fixed32, fixed32> map_fixed32_fixed32 = 62;
|
||||
map < fixed64, fixed64> map_fixed64_fixed64 = 63;
|
||||
map <sfixed32, sfixed32> map_sfixed32_sfixed32 = 64;
|
||||
map <sfixed64, sfixed64> map_sfixed64_sfixed64 = 65;
|
||||
map < int32, float> map_int32_float = 66;
|
||||
map < int32, double> map_int32_double = 67;
|
||||
map < bool, bool> map_bool_bool = 68;
|
||||
map < string, string> map_string_string = 69;
|
||||
map < string, bytes> map_string_bytes = 70;
|
||||
map < string, NestedMessage> map_string_nested_message = 71;
|
||||
map < string, ForeignMessage> map_string_foreign_message = 72;
|
||||
map < string, NestedEnum> map_string_nested_enum = 73;
|
||||
map < string, ForeignEnum> map_string_foreign_enum = 74;
|
||||
|
||||
oneof oneof_field {
|
||||
uint32 oneof_uint32 = 111;
|
||||
NestedMessage oneof_nested_message = 112;
|
||||
string oneof_string = 113;
|
||||
bytes oneof_bytes = 114;
|
||||
}
|
||||
|
||||
// Well-known types
|
||||
google.protobuf.BoolValue optional_bool_wrapper = 201;
|
||||
google.protobuf.Int32Value optional_int32_wrapper = 202;
|
||||
google.protobuf.Int64Value optional_int64_wrapper = 203;
|
||||
google.protobuf.UInt32Value optional_uint32_wrapper = 204;
|
||||
google.protobuf.UInt64Value optional_uint64_wrapper = 205;
|
||||
google.protobuf.FloatValue optional_float_wrapper = 206;
|
||||
google.protobuf.DoubleValue optional_double_wrapper = 207;
|
||||
google.protobuf.StringValue optional_string_wrapper = 208;
|
||||
google.protobuf.BytesValue optional_bytes_wrapper = 209;
|
||||
|
||||
repeated google.protobuf.BoolValue repeated_bool_wrapper = 211;
|
||||
repeated google.protobuf.Int32Value repeated_int32_wrapper = 212;
|
||||
repeated google.protobuf.Int64Value repeated_int64_wrapper = 213;
|
||||
repeated google.protobuf.UInt32Value repeated_uint32_wrapper = 214;
|
||||
repeated google.protobuf.UInt64Value repeated_uint64_wrapper = 215;
|
||||
repeated google.protobuf.FloatValue repeated_float_wrapper = 216;
|
||||
repeated google.protobuf.DoubleValue repeated_double_wrapper = 217;
|
||||
repeated google.protobuf.StringValue repeated_string_wrapper = 218;
|
||||
repeated google.protobuf.BytesValue repeated_bytes_wrapper = 219;
|
||||
|
||||
google.protobuf.Duration optional_duration = 301;
|
||||
google.protobuf.Timestamp optional_timestamp = 302;
|
||||
google.protobuf.FieldMask optional_field_mask = 303;
|
||||
google.protobuf.Struct optional_struct = 304;
|
||||
google.protobuf.Any optional_any = 305;
|
||||
google.protobuf.Value optional_value = 306;
|
||||
|
||||
repeated google.protobuf.Duration repeated_duration = 311;
|
||||
repeated google.protobuf.Timestamp repeated_timestamp = 312;
|
||||
repeated google.protobuf.FieldMask repeated_fieldmask = 313;
|
||||
repeated google.protobuf.Struct repeated_struct = 324;
|
||||
repeated google.protobuf.Any repeated_any = 315;
|
||||
repeated google.protobuf.Value repeated_value = 316;
|
||||
|
||||
// Test field-name-to-JSON-name convention.
|
||||
int32 fieldname1 = 401;
|
||||
int32 field_name2 = 402;
|
||||
int32 _field_name3 = 403;
|
||||
int32 field__name4_ = 404;
|
||||
int32 field0name5 = 405;
|
||||
int32 field_0_name6 = 406;
|
||||
int32 fieldName7 = 407;
|
||||
int32 FieldName8 = 408;
|
||||
int32 field_Name9 = 409;
|
||||
int32 Field_Name10 = 410;
|
||||
int32 FIELD_NAME11 = 411;
|
||||
int32 FIELD_name12 = 412;
|
||||
}
|
||||
|
||||
message ForeignMessage {
|
||||
int32 c = 1;
|
||||
}
|
||||
|
||||
enum ForeignEnum {
|
||||
FOREIGN_FOO = 0;
|
||||
FOREIGN_BAR = 1;
|
||||
FOREIGN_BAZ = 2;
|
||||
}
|
||||
|
|
|
@ -33,12 +33,12 @@
|
|||
#include <unistd.h>
|
||||
|
||||
#include "conformance.pb.h"
|
||||
#include <google/protobuf/test_messages_proto3.pb.h>
|
||||
#include <google/protobuf/util/json_util.h>
|
||||
#include <google/protobuf/util/type_resolver_util.h>
|
||||
|
||||
using conformance::ConformanceRequest;
|
||||
using conformance::ConformanceResponse;
|
||||
using conformance::TestAllTypes;
|
||||
using google::protobuf::Descriptor;
|
||||
using google::protobuf::DescriptorPool;
|
||||
using google::protobuf::internal::scoped_ptr;
|
||||
|
@ -47,6 +47,7 @@ using google::protobuf::util::JsonToBinaryString;
|
|||
using google::protobuf::util::NewTypeResolverForDescriptorPool;
|
||||
using google::protobuf::util::Status;
|
||||
using google::protobuf::util::TypeResolver;
|
||||
using protobuf_test_messages::proto3::TestAllTypes;
|
||||
using std::string;
|
||||
|
||||
static const char kTypeUrlPrefix[] = "type.googleapis.com";
|
||||
|
|
168
conformance/conformance_nodejs.js
Executable file
168
conformance/conformance_nodejs.js
Executable file
|
@ -0,0 +1,168 @@
|
|||
#!/usr/bin/env node
|
||||
|
||||
/*
|
||||
* Protocol Buffers - Google's data interchange format
|
||||
* Copyright 2008 Google Inc. All rights reserved.
|
||||
* https://developers.google.com/protocol-buffers/
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following disclaimer
|
||||
* in the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Google Inc. nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
var conformance = require('conformance_pb');
|
||||
var test_messages_proto3 = require('google/protobuf/test_messages_proto3_pb');
|
||||
var fs = require('fs');
|
||||
|
||||
var testCount = 0;
|
||||
|
||||
function doTest(request) {
|
||||
var testMessage;
|
||||
var response = new conformance.ConformanceResponse();
|
||||
|
||||
try {
|
||||
if (request.getRequestedOutputFormat() === conformance.WireFormat.JSON) {
|
||||
response.setSkipped("JSON not supported.");
|
||||
return response;
|
||||
}
|
||||
|
||||
switch (request.getPayloadCase()) {
|
||||
case conformance.ConformanceRequest.PayloadCase.PROTOBUF_PAYLOAD:
|
||||
try {
|
||||
testMessage = test_messages_proto3.TestAllTypes.deserializeBinary(
|
||||
request.getProtobufPayload());
|
||||
} catch (err) {
|
||||
response.setParseError(err.toString());
|
||||
return response;
|
||||
}
|
||||
|
||||
case conformance.ConformanceRequest.PayloadCase.JSON_PAYLOAD:
|
||||
response.setSkipped("JSON not supported.");
|
||||
return response;
|
||||
|
||||
case conformance.ConformanceRequest.PayloadCase.PAYLOAD_NOT_SET:
|
||||
response.setRuntimeError("Request didn't have payload");
|
||||
return response;
|
||||
}
|
||||
|
||||
switch (request.getRequestedOutputFormat()) {
|
||||
case conformance.WireFormat.UNSPECIFIED:
|
||||
response.setRuntimeError("Unspecified output format");
|
||||
return response;
|
||||
|
||||
case conformance.WireFormat.PROTOBUF:
|
||||
response.setProtobufPayload(testMessage.serializeBinary());
|
||||
|
||||
case conformance.WireFormat.JSON:
|
||||
response.setSkipped("JSON not supported.");
|
||||
return response;
|
||||
|
||||
default:
|
||||
throw "Request didn't have requested output format";
|
||||
}
|
||||
} catch (err) {
|
||||
response.setRuntimeError(err.toString());
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
function onEof(totalRead) {
|
||||
if (totalRead == 0) {
|
||||
return undefined;
|
||||
} else {
|
||||
throw "conformance_nodejs: premature EOF on stdin.";
|
||||
}
|
||||
}
|
||||
|
||||
// Utility function to read a buffer of N bytes.
|
||||
function readBuffer(bytes) {
|
||||
var buf = new Buffer(bytes);
|
||||
var totalRead = 0;
|
||||
while (totalRead < bytes) {
|
||||
var read = 0;
|
||||
try {
|
||||
read = fs.readSync(process.stdin.fd, buf, totalRead, bytes - totalRead);
|
||||
} catch (e) {
|
||||
if (e.code == 'EOF') {
|
||||
return onEof(totalRead)
|
||||
} else if (e.code == 'EAGAIN') {
|
||||
} else {
|
||||
throw "conformance_nodejs: Error reading from stdin." + e;
|
||||
}
|
||||
}
|
||||
|
||||
totalRead += read;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
function writeBuffer(buffer) {
|
||||
var totalWritten = 0;
|
||||
while (totalWritten < buffer.length) {
|
||||
totalWritten += fs.writeSync(
|
||||
process.stdout.fd, buffer, totalWritten, buffer.length - totalWritten);
|
||||
}
|
||||
}
|
||||
|
||||
// Returns true if the test ran successfully, false on legitimate EOF.
|
||||
// If EOF is encountered in an unexpected place, raises IOError.
|
||||
function doTestIo() {
|
||||
var lengthBuf = readBuffer(4);
|
||||
if (!lengthBuf) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var length = lengthBuf.readInt32LE(0);
|
||||
var serializedRequest = readBuffer(length);
|
||||
if (!serializedRequest) {
|
||||
throw "conformance_nodejs: Failed to read request.";
|
||||
}
|
||||
|
||||
serializedRequest = new Uint8Array(serializedRequest);
|
||||
var request =
|
||||
conformance.ConformanceRequest.deserializeBinary(serializedRequest);
|
||||
var response = doTest(request);
|
||||
|
||||
var serializedResponse = response.serializeBinary();
|
||||
|
||||
lengthBuf = new Buffer(4);
|
||||
lengthBuf.writeInt32LE(serializedResponse.length, 0);
|
||||
writeBuffer(lengthBuf);
|
||||
writeBuffer(new Buffer(serializedResponse));
|
||||
|
||||
testCount += 1
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
if (!doTestIo()) {
|
||||
console.error('conformance_nodejs: received EOF from test runner ' +
|
||||
"after " + testCount + " tests, exiting")
|
||||
break;
|
||||
}
|
||||
}
|
|
@ -31,6 +31,7 @@
|
|||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "Conformance.pbobjc.h"
|
||||
#import "google/protobuf/TestMessagesProto3.pbobjc.h"
|
||||
|
||||
static void Die(NSString *format, ...) __dead2;
|
||||
|
||||
|
|
112
conformance/conformance_php.php
Executable file
112
conformance/conformance_php.php
Executable file
|
@ -0,0 +1,112 @@
|
|||
<?php
|
||||
|
||||
require_once("Conformance/WireFormat.php");
|
||||
require_once("Conformance/ConformanceResponse.php");
|
||||
require_once("Conformance/ConformanceRequest.php");
|
||||
require_once("Google/Protobuf/Any.php");
|
||||
require_once("Google/Protobuf/Duration.php");
|
||||
require_once("Google/Protobuf/FieldMask.php");
|
||||
require_once("Google/Protobuf/Struct.php");
|
||||
require_once("Google/Protobuf/Value.php");
|
||||
require_once("Google/Protobuf/ListValue.php");
|
||||
require_once("Google/Protobuf/NullValue.php");
|
||||
require_once("Google/Protobuf/Timestamp.php");
|
||||
require_once("Google/Protobuf/DoubleValue.php");
|
||||
require_once("Google/Protobuf/BytesValue.php");
|
||||
require_once("Google/Protobuf/FloatValue.php");
|
||||
require_once("Google/Protobuf/Int64Value.php");
|
||||
require_once("Google/Protobuf/UInt32Value.php");
|
||||
require_once("Google/Protobuf/BoolValue.php");
|
||||
require_once("Google/Protobuf/DoubleValue.php");
|
||||
require_once("Google/Protobuf/Int32Value.php");
|
||||
require_once("Google/Protobuf/StringValue.php");
|
||||
require_once("Google/Protobuf/UInt64Value.php");
|
||||
require_once("Protobuf_test_messages/Proto3/ForeignMessage.php");
|
||||
require_once("Protobuf_test_messages/Proto3/ForeignEnum.php");
|
||||
require_once("Protobuf_test_messages/Proto3/TestAllTypes.php");
|
||||
require_once("Protobuf_test_messages/Proto3/TestAllTypes_NestedMessage.php");
|
||||
require_once("Protobuf_test_messages/Proto3/TestAllTypes_NestedEnum.php");
|
||||
|
||||
require_once("GPBMetadata/Conformance.php");
|
||||
require_once("GPBMetadata/Google/Protobuf/Any.php");
|
||||
require_once("GPBMetadata/Google/Protobuf/Duration.php");
|
||||
require_once("GPBMetadata/Google/Protobuf/FieldMask.php");
|
||||
require_once("GPBMetadata/Google/Protobuf/Struct.php");
|
||||
require_once("GPBMetadata/Google/Protobuf/Timestamp.php");
|
||||
require_once("GPBMetadata/Google/Protobuf/Wrappers.php");
|
||||
require_once("GPBMetadata/Google/Protobuf/TestMessagesProto3.php");
|
||||
|
||||
use \Conformance\WireFormat;
|
||||
|
||||
$test_count = 0;
|
||||
|
||||
function doTest($request)
|
||||
{
|
||||
$test_message = new \Protobuf_test_messages\Proto3\TestAllTypes();
|
||||
$response = new \Conformance\ConformanceResponse();
|
||||
if ($request->getPayload() == "protobuf_payload") {
|
||||
try {
|
||||
$test_message->mergeFromString($request->getProtobufPayload());
|
||||
} catch (Exception $e) {
|
||||
$response->setParseError($e->getMessage());
|
||||
return $response;
|
||||
}
|
||||
} elseif ($request->getPayload() == "json_payload") {
|
||||
try {
|
||||
$test_message->jsonDecode($request->getJsonPayload());
|
||||
} catch (Exception $e) {
|
||||
$response->setParseError($e->getMessage());
|
||||
return $response;
|
||||
}
|
||||
} else {
|
||||
trigger_error("Request didn't have payload.", E_USER_ERROR);
|
||||
}
|
||||
|
||||
if ($request->getRequestedOutputFormat() == WireFormat::UNSPECIFIED) {
|
||||
trigger_error("Unspecified output format.", E_USER_ERROR);
|
||||
} elseif ($request->getRequestedOutputFormat() == WireFormat::PROTOBUF) {
|
||||
$response->setProtobufPayload($test_message->serializeToString());
|
||||
} elseif ($request->getRequestedOutputFormat() == WireFormat::JSON) {
|
||||
$response->setJsonPayload($test_message->jsonEncode());
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
function doTestIO()
|
||||
{
|
||||
$length_bytes = fread(STDIN, 4);
|
||||
if (strlen($length_bytes) == 0) {
|
||||
return false; # EOF
|
||||
} elseif (strlen($length_bytes) != 4) {
|
||||
trigger_error("I/O error", E_USER_ERROR);
|
||||
}
|
||||
|
||||
$length = unpack("V", $length_bytes)[1];
|
||||
$serialized_request = fread(STDIN, $length);
|
||||
if (strlen($serialized_request) != $length) {
|
||||
trigger_error("I/O error", E_USER_ERROR);
|
||||
}
|
||||
|
||||
$request = new \Conformance\ConformanceRequest();
|
||||
$request->mergeFromString($serialized_request);
|
||||
|
||||
$response = doTest($request);
|
||||
|
||||
$serialized_response = $response->serializeToString();
|
||||
fwrite(STDOUT, pack("V", strlen($serialized_response)));
|
||||
fwrite(STDOUT, $serialized_response);
|
||||
|
||||
$GLOBALS['test_count'] += 1;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
while(true){
|
||||
if (!doTestIO()) {
|
||||
fprintf(STDERR,
|
||||
"conformance_php: received EOF from test runner " +
|
||||
"after %d tests, exiting\n", $test_count);
|
||||
exit;
|
||||
}
|
||||
}
|
|
@ -38,8 +38,9 @@ See conformance.proto for more information.
|
|||
import struct
|
||||
import sys
|
||||
import os
|
||||
from google.protobuf import message
|
||||
from google.protobuf import json_format
|
||||
from google.protobuf import message
|
||||
from google.protobuf import test_messages_proto3_pb2
|
||||
import conformance_pb2
|
||||
|
||||
sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0)
|
||||
|
@ -52,9 +53,9 @@ class ProtocolError(Exception):
|
|||
pass
|
||||
|
||||
def do_test(request):
|
||||
test_message = conformance_pb2.TestAllTypes()
|
||||
test_message = test_messages_proto3_pb2.TestAllTypes()
|
||||
response = conformance_pb2.ConformanceResponse()
|
||||
test_message = conformance_pb2.TestAllTypes()
|
||||
test_message = test_messages_proto3_pb2.TestAllTypes()
|
||||
|
||||
try:
|
||||
if request.WhichOneof('payload') == 'protobuf_payload':
|
||||
|
@ -67,7 +68,7 @@ def do_test(request):
|
|||
elif request.WhichOneof('payload') == 'json_payload':
|
||||
try:
|
||||
json_format.Parse(request.json_payload, test_message)
|
||||
except json_format.ParseError as e:
|
||||
except Exception as e:
|
||||
response.parse_error = str(e)
|
||||
return response
|
||||
|
||||
|
@ -81,7 +82,11 @@ def do_test(request):
|
|||
response.protobuf_payload = test_message.SerializeToString()
|
||||
|
||||
elif request.requested_output_format == conformance_pb2.JSON:
|
||||
response.json_payload = json_format.MessageToJson(test_message)
|
||||
try:
|
||||
response.json_payload = json_format.MessageToJson(test_message)
|
||||
except Exception as e:
|
||||
response.serialize_error = str(e)
|
||||
return response
|
||||
|
||||
except Exception as e:
|
||||
response.runtime_error = str(e)
|
||||
|
|
|
@ -30,21 +30,22 @@
|
|||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
require 'conformance'
|
||||
require 'conformance_pb'
|
||||
require 'google/protobuf/test_messages_proto3_pb'
|
||||
|
||||
$test_count = 0
|
||||
$verbose = false
|
||||
|
||||
def do_test(request)
|
||||
test_message = Conformance::TestAllTypes.new
|
||||
test_message = ProtobufTestMessages::Proto3::TestAllTypes.new
|
||||
response = Conformance::ConformanceResponse.new
|
||||
|
||||
begin
|
||||
case request.payload
|
||||
when :protobuf_payload
|
||||
begin
|
||||
test_message =
|
||||
Conformance::TestAllTypes.decode(request.protobuf_payload)
|
||||
test_message = ProtobufTestMessages::Proto3::TestAllTypes.decode(
|
||||
request.protobuf_payload)
|
||||
rescue Google::Protobuf::ParseError => err
|
||||
response.parse_error = err.message.encode('utf-8')
|
||||
return response
|
||||
|
@ -52,7 +53,8 @@ def do_test(request)
|
|||
|
||||
when :json_payload
|
||||
begin
|
||||
test_message = Conformance::TestAllTypes.decode_json(request.json_payload)
|
||||
test_message = ProtobufTestMessages::Proto3::TestAllTypes.decode_json(
|
||||
request.json_payload)
|
||||
rescue Google::Protobuf::ParseError => err
|
||||
response.parse_error = err.message.encode('utf-8')
|
||||
return response
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -49,9 +49,14 @@
|
|||
namespace conformance {
|
||||
class ConformanceRequest;
|
||||
class ConformanceResponse;
|
||||
class TestAllTypes;
|
||||
} // namespace conformance
|
||||
|
||||
namespace protobuf_test_messages {
|
||||
namespace proto3 {
|
||||
class TestAllTypes;
|
||||
} // namespace proto3
|
||||
} // namespace protobuf_test_messages
|
||||
|
||||
namespace google {
|
||||
namespace protobuf {
|
||||
|
||||
|
@ -91,7 +96,7 @@ class ConformanceTestRunner {
|
|||
//
|
||||
class ConformanceTestSuite {
|
||||
public:
|
||||
ConformanceTestSuite() : verbose_(false) {}
|
||||
ConformanceTestSuite() : verbose_(false), enforce_recommended_(false) {}
|
||||
|
||||
void SetVerbose(bool verbose) { verbose_ = verbose; }
|
||||
|
||||
|
@ -104,6 +109,18 @@ class ConformanceTestSuite {
|
|||
void SetFailureList(const std::string& filename,
|
||||
const std::vector<std::string>& failure_list);
|
||||
|
||||
// Whether to require the testee to pass RECOMMENDED tests. By default failing
|
||||
// a RECOMMENDED test case will not fail the entire suite but will only
|
||||
// generated a warning. If this flag is set to true, RECOMMENDED tests will
|
||||
// be treated the same way as REQUIRED tests and failing a RECOMMENDED test
|
||||
// case will cause the entire test suite to fail as well. An implementation
|
||||
// can enable this if it wants to be strictly conforming to protobuf spec.
|
||||
// See the comments about ConformanceLevel below to learn more about the
|
||||
// difference between REQUIRED and RECOMMENDED test cases.
|
||||
void SetEnforceRecommended(bool value) {
|
||||
enforce_recommended_ = value;
|
||||
}
|
||||
|
||||
// Run all the conformance tests against the given test runner.
|
||||
// Test output will be stored in "output".
|
||||
//
|
||||
|
@ -113,8 +130,27 @@ class ConformanceTestSuite {
|
|||
bool RunSuite(ConformanceTestRunner* runner, std::string* output);
|
||||
|
||||
private:
|
||||
// Test cases are classified into a few categories:
|
||||
// REQUIRED: the test case must be passed for an implementation to be
|
||||
// interoperable with other implementations. For example, a
|
||||
// parser implementaiton must accept both packed and unpacked
|
||||
// form of repeated primitive fields.
|
||||
// RECOMMENDED: the test case is not required for the implementation to
|
||||
// be interoperable with other implementations, but is
|
||||
// recommended for best performance and compatibility. For
|
||||
// example, a proto3 serializer should serialize repeated
|
||||
// primitive fields in packed form, but an implementation
|
||||
// failing to do so will still be able to communicate with
|
||||
// other implementations.
|
||||
enum ConformanceLevel {
|
||||
REQUIRED = 0,
|
||||
RECOMMENDED = 1,
|
||||
};
|
||||
string ConformanceLevelToString(ConformanceLevel level);
|
||||
|
||||
void ReportSuccess(const std::string& test_name);
|
||||
void ReportFailure(const string& test_name,
|
||||
ConformanceLevel level,
|
||||
const conformance::ConformanceRequest& request,
|
||||
const conformance::ConformanceResponse& response,
|
||||
const char* fmt, ...);
|
||||
|
@ -124,35 +160,58 @@ class ConformanceTestSuite {
|
|||
void RunTest(const std::string& test_name,
|
||||
const conformance::ConformanceRequest& request,
|
||||
conformance::ConformanceResponse* response);
|
||||
void RunValidInputTest(const string& test_name, const string& input,
|
||||
void RunValidInputTest(const string& test_name,
|
||||
ConformanceLevel level,
|
||||
const string& input,
|
||||
conformance::WireFormat input_format,
|
||||
const string& equivalent_text_format,
|
||||
conformance::WireFormat requested_output);
|
||||
void RunValidJsonTest(const string& test_name, const string& input_json,
|
||||
void RunValidJsonTest(const string& test_name,
|
||||
ConformanceLevel level,
|
||||
const string& input_json,
|
||||
const string& equivalent_text_format);
|
||||
void RunValidJsonTestWithProtobufInput(const string& test_name,
|
||||
const conformance::TestAllTypes& input,
|
||||
const string& equivalent_text_format);
|
||||
void RunValidJsonTestWithProtobufInput(
|
||||
const string& test_name,
|
||||
ConformanceLevel level,
|
||||
const protobuf_test_messages::proto3::TestAllTypes& input,
|
||||
const string& equivalent_text_format);
|
||||
void RunValidProtobufTest(const string& test_name, ConformanceLevel level,
|
||||
const string& input_protobuf,
|
||||
const string& equivalent_text_format);
|
||||
void RunValidProtobufTestWithMessage(
|
||||
const string& test_name, ConformanceLevel level,
|
||||
const protobuf_test_messages::proto3::TestAllTypes& input,
|
||||
const string& equivalent_text_format);
|
||||
|
||||
typedef std::function<bool(const Json::Value&)> Validator;
|
||||
void RunValidJsonTestWithValidator(const string& test_name,
|
||||
ConformanceLevel level,
|
||||
const string& input_json,
|
||||
const Validator& validator);
|
||||
void ExpectParseFailureForJson(const string& test_name,
|
||||
ConformanceLevel level,
|
||||
const string& input_json);
|
||||
void ExpectSerializeFailureForJson(const string& test_name,
|
||||
ConformanceLevel level,
|
||||
const string& text_format);
|
||||
void ExpectParseFailureForProto(const std::string& proto,
|
||||
const std::string& test_name);
|
||||
const std::string& test_name,
|
||||
ConformanceLevel level);
|
||||
void ExpectHardParseFailureForProto(const std::string& proto,
|
||||
const std::string& test_name);
|
||||
const std::string& test_name,
|
||||
ConformanceLevel level);
|
||||
void TestPrematureEOFForType(google::protobuf::FieldDescriptor::Type type);
|
||||
void TestIllegalTags();
|
||||
void TestValidDataForType(
|
||||
google::protobuf::FieldDescriptor::Type,
|
||||
std::vector<std::pair<std::string, std::string>> values);
|
||||
bool CheckSetEmpty(const set<string>& set_to_check,
|
||||
const std::string& write_to_file, const std::string& msg);
|
||||
ConformanceTestRunner* runner_;
|
||||
int successes_;
|
||||
int expected_failures_;
|
||||
bool verbose_;
|
||||
bool enforce_recommended_;
|
||||
std::string output_;
|
||||
std::string failure_list_filename_;
|
||||
|
||||
|
|
|
@ -251,6 +251,16 @@ void UsageError() {
|
|||
" should contain one test name per\n");
|
||||
fprintf(stderr,
|
||||
" line. Use '#' for comments.\n");
|
||||
fprintf(stderr,
|
||||
" --enforce_recommended Enforce that recommended test\n");
|
||||
fprintf(stderr,
|
||||
" cases are also passing. Specify\n");
|
||||
fprintf(stderr,
|
||||
" this flag if you want to be\n");
|
||||
fprintf(stderr,
|
||||
" strictly conforming to protobuf\n");
|
||||
fprintf(stderr,
|
||||
" spec.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
@ -290,6 +300,8 @@ int main(int argc, char *argv[]) {
|
|||
ParseFailureList(argv[arg], &failure_list);
|
||||
} else if (strcmp(argv[arg], "--verbose") == 0) {
|
||||
suite.SetVerbose(true);
|
||||
} else if (strcmp(argv[arg], "--enforce_recommended") == 0) {
|
||||
suite.SetEnforceRecommended(true);
|
||||
} else if (argv[arg][0] == '-') {
|
||||
fprintf(stderr, "Unknown option: %s\n", argv[arg]);
|
||||
UsageError();
|
||||
|
|
|
@ -7,42 +7,38 @@
|
|||
# TODO(haberman): insert links to corresponding bugs tracking the issue.
|
||||
# Should we use GitHub issues or the Google-internal bug tracker?
|
||||
|
||||
FieldMaskNumbersDontRoundTrip.JsonOutput
|
||||
FieldMaskPathsDontRoundTrip.JsonOutput
|
||||
FieldMaskTooManyUnderscore.JsonOutput
|
||||
JsonInput.AnyUnorderedTypeTag.JsonOutput
|
||||
JsonInput.AnyUnorderedTypeTag.ProtobufOutput
|
||||
JsonInput.BoolFieldDoubleQuotedFalse
|
||||
JsonInput.BoolFieldDoubleQuotedTrue
|
||||
JsonInput.BytesFieldNoPadding
|
||||
JsonInput.DoubleFieldTooSmall
|
||||
JsonInput.DurationHasZeroFractionalDigit.Validator
|
||||
JsonInput.EnumFieldUnknownValue.Validator
|
||||
JsonInput.FieldMaskInvalidCharacter
|
||||
JsonInput.FieldNameDuplicate
|
||||
JsonInput.FieldNameDuplicateDifferentCasing1
|
||||
JsonInput.FieldNameDuplicateDifferentCasing2
|
||||
JsonInput.FieldNameInLowerCamelCase.Validator
|
||||
JsonInput.FieldNameInSnakeCase.JsonOutput
|
||||
JsonInput.FieldNameInSnakeCase.ProtobufOutput
|
||||
JsonInput.FieldNameNotQuoted
|
||||
JsonInput.MapFieldValueIsNull
|
||||
JsonInput.RepeatedFieldMessageElementIsNull
|
||||
JsonInput.RepeatedFieldPrimitiveElementIsNull
|
||||
JsonInput.RepeatedFieldTrailingComma
|
||||
JsonInput.StringFieldUppercaseEscapeLetter
|
||||
JsonInput.TrailingCommaInAnObject
|
||||
JsonInput.WrapperTypesWithNullValue.JsonOutput
|
||||
JsonInput.WrapperTypesWithNullValue.ProtobufOutput
|
||||
ProtobufInput.PrematureEofBeforeKnownRepeatedValue.MESSAGE
|
||||
ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
|
||||
ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
|
||||
ProtobufInput.PrematureEofInPackedField.BOOL
|
||||
ProtobufInput.PrematureEofInPackedField.ENUM
|
||||
ProtobufInput.PrematureEofInPackedField.INT32
|
||||
ProtobufInput.PrematureEofInPackedField.INT64
|
||||
ProtobufInput.PrematureEofInPackedField.SINT32
|
||||
ProtobufInput.PrematureEofInPackedField.SINT64
|
||||
ProtobufInput.PrematureEofInPackedField.UINT32
|
||||
ProtobufInput.PrematureEofInPackedField.UINT64
|
||||
ProtobufInput.PrematureEofInsideKnownRepeatedValue.MESSAGE
|
||||
Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
|
||||
Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
|
||||
Recommended.FieldMaskTooManyUnderscore.JsonOutput
|
||||
Recommended.JsonInput.BoolFieldDoubleQuotedFalse
|
||||
Recommended.JsonInput.BoolFieldDoubleQuotedTrue
|
||||
Recommended.JsonInput.FieldMaskInvalidCharacter
|
||||
Recommended.JsonInput.FieldNameDuplicate
|
||||
Recommended.JsonInput.FieldNameDuplicateDifferentCasing1
|
||||
Recommended.JsonInput.FieldNameDuplicateDifferentCasing2
|
||||
Recommended.JsonInput.FieldNameNotQuoted
|
||||
Recommended.JsonInput.MapFieldValueIsNull
|
||||
Recommended.JsonInput.RepeatedFieldMessageElementIsNull
|
||||
Recommended.JsonInput.RepeatedFieldPrimitiveElementIsNull
|
||||
Recommended.JsonInput.RepeatedFieldTrailingComma
|
||||
Recommended.JsonInput.RepeatedFieldTrailingCommaWithNewlines
|
||||
Recommended.JsonInput.RepeatedFieldTrailingCommaWithSpace
|
||||
Recommended.JsonInput.RepeatedFieldTrailingCommaWithSpaceCommaSpace
|
||||
Recommended.JsonInput.StringFieldSingleQuoteBoth
|
||||
Recommended.JsonInput.StringFieldSingleQuoteKey
|
||||
Recommended.JsonInput.StringFieldSingleQuoteValue
|
||||
Recommended.JsonInput.StringFieldUppercaseEscapeLetter
|
||||
Recommended.JsonInput.TrailingCommaInAnObject
|
||||
Recommended.JsonInput.TrailingCommaInAnObjectWithNewlines
|
||||
Recommended.JsonInput.TrailingCommaInAnObjectWithSpace
|
||||
Recommended.JsonInput.TrailingCommaInAnObjectWithSpaceCommaSpace
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInPackedField.BOOL
|
||||
Required.ProtobufInput.PrematureEofInPackedField.ENUM
|
||||
Required.ProtobufInput.PrematureEofInPackedField.INT32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.INT64
|
||||
Required.ProtobufInput.PrematureEofInPackedField.SINT32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.SINT64
|
||||
Required.ProtobufInput.PrematureEofInPackedField.UINT32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.UINT64
|
||||
|
|
|
@ -1,11 +1,4 @@
|
|||
JsonInput.FieldNameInLowerCamelCase.Validator
|
||||
JsonInput.FieldNameInSnakeCase.JsonOutput
|
||||
JsonInput.FieldNameInSnakeCase.ProtobufOutput
|
||||
JsonInput.FieldNameWithMixedCases.JsonOutput
|
||||
JsonInput.FieldNameWithMixedCases.ProtobufOutput
|
||||
JsonInput.FieldNameWithMixedCases.Validator
|
||||
JsonInput.Int64FieldMaxValueNotQuoted.JsonOutput
|
||||
JsonInput.Int64FieldMaxValueNotQuoted.ProtobufOutput
|
||||
JsonInput.OriginalProtoFieldName.JsonOutput
|
||||
JsonInput.Uint64FieldMaxValueNotQuoted.JsonOutput
|
||||
JsonInput.Uint64FieldMaxValueNotQuoted.ProtobufOutput
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_0
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_1
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_2
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_3
|
||||
|
|
|
@ -4,42 +4,42 @@
|
|||
# By listing them here we can keep tabs on which ones are failing and be sure
|
||||
# that we don't introduce regressions in other tests.
|
||||
|
||||
FieldMaskNumbersDontRoundTrip.JsonOutput
|
||||
FieldMaskPathsDontRoundTrip.JsonOutput
|
||||
FieldMaskTooManyUnderscore.JsonOutput
|
||||
JsonInput.AnyWithFieldMask.ProtobufOutput
|
||||
JsonInput.BoolFieldAllCapitalFalse
|
||||
JsonInput.BoolFieldAllCapitalTrue
|
||||
JsonInput.BoolFieldCamelCaseFalse
|
||||
JsonInput.BoolFieldCamelCaseTrue
|
||||
JsonInput.BoolFieldDoubleQuotedFalse
|
||||
JsonInput.BoolFieldDoubleQuotedTrue
|
||||
JsonInput.BoolMapFieldKeyNotQuoted
|
||||
JsonInput.DoubleFieldInfinityNotQuoted
|
||||
JsonInput.DoubleFieldNanNotQuoted
|
||||
JsonInput.DoubleFieldNegativeInfinityNotQuoted
|
||||
JsonInput.EnumFieldNotQuoted
|
||||
JsonInput.FieldMask.ProtobufOutput
|
||||
JsonInput.FieldMaskInvalidCharacter
|
||||
JsonInput.FieldNameDuplicate
|
||||
JsonInput.FieldNameInSnakeCase.JsonOutput
|
||||
JsonInput.FieldNameNotQuoted
|
||||
JsonInput.FloatFieldInfinityNotQuoted
|
||||
JsonInput.FloatFieldNanNotQuoted
|
||||
JsonInput.FloatFieldNegativeInfinityNotQuoted
|
||||
JsonInput.Int32FieldLeadingZero
|
||||
JsonInput.Int32FieldNegativeWithLeadingZero
|
||||
JsonInput.Int32FieldPlusSign
|
||||
JsonInput.Int32MapFieldKeyNotQuoted
|
||||
JsonInput.Int64MapFieldKeyNotQuoted
|
||||
JsonInput.JsonWithComments
|
||||
JsonInput.OriginalProtoFieldName.JsonOutput
|
||||
JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotBool
|
||||
JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
|
||||
JsonInput.StringFieldNotAString
|
||||
JsonInput.StringFieldSurrogateInWrongOrder
|
||||
JsonInput.StringFieldUnpairedHighSurrogate
|
||||
JsonInput.StringFieldUnpairedLowSurrogate
|
||||
JsonInput.StringFieldUppercaseEscapeLetter
|
||||
JsonInput.Uint32MapFieldKeyNotQuoted
|
||||
JsonInput.Uint64MapFieldKeyNotQuoted
|
||||
Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
|
||||
Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
|
||||
Recommended.FieldMaskTooManyUnderscore.JsonOutput
|
||||
Recommended.JsonInput.BoolFieldAllCapitalFalse
|
||||
Recommended.JsonInput.BoolFieldAllCapitalTrue
|
||||
Recommended.JsonInput.BoolFieldCamelCaseFalse
|
||||
Recommended.JsonInput.BoolFieldCamelCaseTrue
|
||||
Recommended.JsonInput.BoolFieldDoubleQuotedFalse
|
||||
Recommended.JsonInput.BoolFieldDoubleQuotedTrue
|
||||
Recommended.JsonInput.BoolMapFieldKeyNotQuoted
|
||||
Recommended.JsonInput.DoubleFieldInfinityNotQuoted
|
||||
Recommended.JsonInput.DoubleFieldNanNotQuoted
|
||||
Recommended.JsonInput.DoubleFieldNegativeInfinityNotQuoted
|
||||
Recommended.JsonInput.FieldMaskInvalidCharacter
|
||||
Recommended.JsonInput.FieldNameDuplicate
|
||||
Recommended.JsonInput.FieldNameNotQuoted
|
||||
Recommended.JsonInput.FloatFieldInfinityNotQuoted
|
||||
Recommended.JsonInput.FloatFieldNanNotQuoted
|
||||
Recommended.JsonInput.FloatFieldNegativeInfinityNotQuoted
|
||||
Recommended.JsonInput.Int32MapFieldKeyNotQuoted
|
||||
Recommended.JsonInput.Int64MapFieldKeyNotQuoted
|
||||
Recommended.JsonInput.JsonWithComments
|
||||
Recommended.JsonInput.StringFieldSingleQuoteBoth
|
||||
Recommended.JsonInput.StringFieldSingleQuoteKey
|
||||
Recommended.JsonInput.StringFieldSingleQuoteValue
|
||||
Recommended.JsonInput.StringFieldSurrogateInWrongOrder
|
||||
Recommended.JsonInput.StringFieldUnpairedHighSurrogate
|
||||
Recommended.JsonInput.StringFieldUnpairedLowSurrogate
|
||||
Recommended.JsonInput.Uint32MapFieldKeyNotQuoted
|
||||
Recommended.JsonInput.Uint64MapFieldKeyNotQuoted
|
||||
Required.JsonInput.EnumFieldNotQuoted
|
||||
Required.JsonInput.Int32FieldLeadingZero
|
||||
Required.JsonInput.Int32FieldNegativeWithLeadingZero
|
||||
Required.JsonInput.Int32FieldPlusSign
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotBool
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
|
||||
Required.JsonInput.StringFieldNotAString
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
|
||||
|
|
15
conformance/failure_list_js.txt
Normal file
15
conformance/failure_list_js.txt
Normal file
|
@ -0,0 +1,15 @@
|
|||
Required.ProtobufInput.RepeatedScalarSelectsLast.INT32.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.UINT32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.BOOL.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.DOUBLE.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.FIXED32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.FIXED64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.FLOAT.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.INT32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.INT64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SFIXED32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SFIXED64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SINT32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SINT64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.UINT32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.UINT64.ProtobufOutput
|
|
@ -1,4 +1,6 @@
|
|||
# No tests currently failing.
|
||||
#
|
||||
# json input or output tests are skipped (in conformance_objc.m) as mobile
|
||||
# platforms don't support json wire format to avoid code bloat.
|
||||
# JSON input or output tests are skipped (in conformance_objc.m) as mobile
|
||||
# platforms don't support JSON wire format to avoid code bloat.
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_0
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_1
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_2
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_3
|
||||
|
|
611
conformance/failure_list_php.txt
Normal file
611
conformance/failure_list_php.txt
Normal file
|
@ -0,0 +1,611 @@
|
|||
Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
|
||||
Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
|
||||
Recommended.FieldMaskTooManyUnderscore.JsonOutput
|
||||
Recommended.JsonInput.BoolFieldAllCapitalFalse
|
||||
Recommended.JsonInput.BoolFieldAllCapitalTrue
|
||||
Recommended.JsonInput.BoolFieldCamelCaseFalse
|
||||
Recommended.JsonInput.BoolFieldCamelCaseTrue
|
||||
Recommended.JsonInput.BoolFieldDoubleQuotedFalse
|
||||
Recommended.JsonInput.BoolFieldDoubleQuotedTrue
|
||||
Recommended.JsonInput.BoolFieldIntegerOne
|
||||
Recommended.JsonInput.BoolFieldIntegerZero
|
||||
Recommended.JsonInput.BoolMapFieldKeyNotQuoted
|
||||
Recommended.JsonInput.DoubleFieldInfinityNotQuoted
|
||||
Recommended.JsonInput.DoubleFieldNanNotQuoted
|
||||
Recommended.JsonInput.DoubleFieldNegativeInfinityNotQuoted
|
||||
Recommended.JsonInput.DurationHas3FractionalDigits.Validator
|
||||
Recommended.JsonInput.DurationHas6FractionalDigits.Validator
|
||||
Recommended.JsonInput.DurationHas9FractionalDigits.Validator
|
||||
Recommended.JsonInput.DurationHasZeroFractionalDigit.Validator
|
||||
Recommended.JsonInput.FieldMaskInvalidCharacter
|
||||
Recommended.JsonInput.FieldNameDuplicate
|
||||
Recommended.JsonInput.FieldNameDuplicateDifferentCasing1
|
||||
Recommended.JsonInput.FieldNameDuplicateDifferentCasing2
|
||||
Recommended.JsonInput.FieldNameNotQuoted
|
||||
Recommended.JsonInput.FieldNameWithDoubleUnderscores.JsonOutput
|
||||
Recommended.JsonInput.FieldNameWithDoubleUnderscores.ProtobufOutput
|
||||
Recommended.JsonInput.FieldNameWithDoubleUnderscores.Validator
|
||||
Recommended.JsonInput.FloatFieldInfinityNotQuoted
|
||||
Recommended.JsonInput.FloatFieldNanNotQuoted
|
||||
Recommended.JsonInput.FloatFieldNegativeInfinityNotQuoted
|
||||
Recommended.JsonInput.Int32MapFieldKeyNotQuoted
|
||||
Recommended.JsonInput.Int64FieldBeString.Validator
|
||||
Recommended.JsonInput.Int64MapFieldKeyNotQuoted
|
||||
Recommended.JsonInput.JsonWithComments
|
||||
Recommended.JsonInput.MapFieldKeyIsNull
|
||||
Recommended.JsonInput.MapFieldValueIsNull
|
||||
Recommended.JsonInput.MissingCommaMultiline
|
||||
Recommended.JsonInput.MissingCommaOneLine
|
||||
Recommended.JsonInput.MultilineNoSpaces.JsonOutput
|
||||
Recommended.JsonInput.MultilineNoSpaces.ProtobufOutput
|
||||
Recommended.JsonInput.MultilineWithSpaces.JsonOutput
|
||||
Recommended.JsonInput.MultilineWithSpaces.ProtobufOutput
|
||||
Recommended.JsonInput.OneLineNoSpaces.JsonOutput
|
||||
Recommended.JsonInput.OneLineNoSpaces.ProtobufOutput
|
||||
Recommended.JsonInput.OneLineWithSpaces.JsonOutput
|
||||
Recommended.JsonInput.OneLineWithSpaces.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroBool.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroBool.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroBytes.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroBytes.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroDouble.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroDouble.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroEnum.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroEnum.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroFloat.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroFloat.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroMessage.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroMessage.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroString.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroString.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroUint32.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroUint32.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroUint64.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroUint64.ProtobufOutput
|
||||
Recommended.JsonInput.RepeatedFieldMessageElementIsNull
|
||||
Recommended.JsonInput.RepeatedFieldPrimitiveElementIsNull
|
||||
Recommended.JsonInput.RepeatedFieldTrailingComma
|
||||
Recommended.JsonInput.RepeatedFieldTrailingCommaWithNewlines
|
||||
Recommended.JsonInput.RepeatedFieldTrailingCommaWithSpace
|
||||
Recommended.JsonInput.RepeatedFieldTrailingCommaWithSpaceCommaSpace
|
||||
Recommended.JsonInput.StringEndsWithEscapeChar
|
||||
Recommended.JsonInput.StringFieldInvalidEscape
|
||||
Recommended.JsonInput.StringFieldSingleQuoteBoth
|
||||
Recommended.JsonInput.StringFieldSingleQuoteKey
|
||||
Recommended.JsonInput.StringFieldSingleQuoteValue
|
||||
Recommended.JsonInput.StringFieldSurrogateInWrongOrder
|
||||
Recommended.JsonInput.StringFieldUnpairedHighSurrogate
|
||||
Recommended.JsonInput.StringFieldUnpairedLowSurrogate
|
||||
Recommended.JsonInput.StringFieldUnterminatedEscape
|
||||
Recommended.JsonInput.StringFieldUppercaseEscapeLetter
|
||||
Recommended.JsonInput.TimestampHas3FractionalDigits.Validator
|
||||
Recommended.JsonInput.TimestampHas6FractionalDigits.Validator
|
||||
Recommended.JsonInput.TimestampHas9FractionalDigits.Validator
|
||||
Recommended.JsonInput.TimestampHasZeroFractionalDigit.Validator
|
||||
Recommended.JsonInput.TimestampZeroNormalized.Validator
|
||||
Recommended.JsonInput.TrailingCommaInAnObject
|
||||
Recommended.JsonInput.TrailingCommaInAnObjectWithNewlines
|
||||
Recommended.JsonInput.TrailingCommaInAnObjectWithSpace
|
||||
Recommended.JsonInput.TrailingCommaInAnObjectWithSpaceCommaSpace
|
||||
Recommended.JsonInput.Uint32MapFieldKeyNotQuoted
|
||||
Recommended.JsonInput.Uint64FieldBeString.Validator
|
||||
Recommended.JsonInput.Uint64MapFieldKeyNotQuoted
|
||||
Recommended.ProtobufInput.OneofZeroBool.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroBool.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroBytes.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroBytes.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroDouble.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroDouble.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroEnum.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroEnum.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroFloat.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroFloat.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroMessage.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroMessage.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroString.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroString.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroUint32.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroUint32.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroUint64.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroUint64.ProtobufOutput
|
||||
Required.DurationProtoInputTooLarge.JsonOutput
|
||||
Required.DurationProtoInputTooSmall.JsonOutput
|
||||
Required.JsonInput.AllFieldAcceptNull.JsonOutput
|
||||
Required.JsonInput.AllFieldAcceptNull.ProtobufOutput
|
||||
Required.JsonInput.Any.JsonOutput
|
||||
Required.JsonInput.Any.ProtobufOutput
|
||||
Required.JsonInput.AnyNested.JsonOutput
|
||||
Required.JsonInput.AnyNested.ProtobufOutput
|
||||
Required.JsonInput.AnyUnorderedTypeTag.JsonOutput
|
||||
Required.JsonInput.AnyUnorderedTypeTag.ProtobufOutput
|
||||
Required.JsonInput.AnyWithDuration.JsonOutput
|
||||
Required.JsonInput.AnyWithDuration.ProtobufOutput
|
||||
Required.JsonInput.AnyWithFieldMask.JsonOutput
|
||||
Required.JsonInput.AnyWithFieldMask.ProtobufOutput
|
||||
Required.JsonInput.AnyWithInt32ValueWrapper.JsonOutput
|
||||
Required.JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
|
||||
Required.JsonInput.AnyWithStruct.JsonOutput
|
||||
Required.JsonInput.AnyWithStruct.ProtobufOutput
|
||||
Required.JsonInput.AnyWithTimestamp.JsonOutput
|
||||
Required.JsonInput.AnyWithTimestamp.ProtobufOutput
|
||||
Required.JsonInput.AnyWithValueForInteger.JsonOutput
|
||||
Required.JsonInput.AnyWithValueForInteger.ProtobufOutput
|
||||
Required.JsonInput.AnyWithValueForJsonObject.JsonOutput
|
||||
Required.JsonInput.AnyWithValueForJsonObject.ProtobufOutput
|
||||
Required.JsonInput.BoolFieldFalse.JsonOutput
|
||||
Required.JsonInput.BoolFieldFalse.ProtobufOutput
|
||||
Required.JsonInput.BoolFieldTrue.JsonOutput
|
||||
Required.JsonInput.BoolFieldTrue.ProtobufOutput
|
||||
Required.JsonInput.BoolMapEscapedKey.JsonOutput
|
||||
Required.JsonInput.BoolMapEscapedKey.ProtobufOutput
|
||||
Required.JsonInput.BoolMapField.JsonOutput
|
||||
Required.JsonInput.BoolMapField.ProtobufOutput
|
||||
Required.JsonInput.BytesField.JsonOutput
|
||||
Required.JsonInput.BytesField.ProtobufOutput
|
||||
Required.JsonInput.BytesFieldInvalidBase64Characters
|
||||
Required.JsonInput.BytesRepeatedField.JsonOutput
|
||||
Required.JsonInput.BytesRepeatedField.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldInfinity.JsonOutput
|
||||
Required.JsonInput.DoubleFieldInfinity.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMaxPositiveValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMaxPositiveValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMinNegativeValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMinNegativeValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMinPositiveValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldNan.JsonOutput
|
||||
Required.JsonInput.DoubleFieldNan.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldNegativeInfinity.JsonOutput
|
||||
Required.JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldQuotedValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldQuotedValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldTooLarge
|
||||
Required.JsonInput.DoubleFieldTooSmall
|
||||
Required.JsonInput.DurationJsonInputTooLarge
|
||||
Required.JsonInput.DurationJsonInputTooSmall
|
||||
Required.JsonInput.DurationMaxValue.JsonOutput
|
||||
Required.JsonInput.DurationMaxValue.ProtobufOutput
|
||||
Required.JsonInput.DurationMinValue.JsonOutput
|
||||
Required.JsonInput.DurationMinValue.ProtobufOutput
|
||||
Required.JsonInput.DurationMissingS
|
||||
Required.JsonInput.DurationRepeatedValue.JsonOutput
|
||||
Required.JsonInput.DurationRepeatedValue.ProtobufOutput
|
||||
Required.JsonInput.EnumField.JsonOutput
|
||||
Required.JsonInput.EnumField.ProtobufOutput
|
||||
Required.JsonInput.EnumFieldNotQuoted
|
||||
Required.JsonInput.EnumFieldNumericValueNonZero.JsonOutput
|
||||
Required.JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
|
||||
Required.JsonInput.EnumFieldNumericValueZero.JsonOutput
|
||||
Required.JsonInput.EnumFieldNumericValueZero.ProtobufOutput
|
||||
Required.JsonInput.EnumFieldUnknownValue.Validator
|
||||
Required.JsonInput.EnumRepeatedField.JsonOutput
|
||||
Required.JsonInput.EnumRepeatedField.ProtobufOutput
|
||||
Required.JsonInput.FieldMask.JsonOutput
|
||||
Required.JsonInput.FieldMask.ProtobufOutput
|
||||
Required.JsonInput.FieldNameEscaped.JsonOutput
|
||||
Required.JsonInput.FieldNameEscaped.ProtobufOutput
|
||||
Required.JsonInput.FieldNameInLowerCamelCase.Validator
|
||||
Required.JsonInput.FieldNameInSnakeCase.JsonOutput
|
||||
Required.JsonInput.FieldNameInSnakeCase.ProtobufOutput
|
||||
Required.JsonInput.FieldNameWithMixedCases.JsonOutput
|
||||
Required.JsonInput.FieldNameWithMixedCases.ProtobufOutput
|
||||
Required.JsonInput.FieldNameWithMixedCases.Validator
|
||||
Required.JsonInput.FieldNameWithNumbers.JsonOutput
|
||||
Required.JsonInput.FieldNameWithNumbers.ProtobufOutput
|
||||
Required.JsonInput.FieldNameWithNumbers.Validator
|
||||
Required.JsonInput.FloatFieldInfinity.JsonOutput
|
||||
Required.JsonInput.FloatFieldInfinity.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldMaxNegativeValue.JsonOutput
|
||||
Required.JsonInput.FloatFieldMaxNegativeValue.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldMaxPositiveValue.JsonOutput
|
||||
Required.JsonInput.FloatFieldMaxPositiveValue.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldMinNegativeValue.JsonOutput
|
||||
Required.JsonInput.FloatFieldMinNegativeValue.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldMinPositiveValue.JsonOutput
|
||||
Required.JsonInput.FloatFieldMinPositiveValue.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldNan.JsonOutput
|
||||
Required.JsonInput.FloatFieldNan.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldNegativeInfinity.JsonOutput
|
||||
Required.JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldQuotedValue.JsonOutput
|
||||
Required.JsonInput.FloatFieldQuotedValue.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldTooLarge
|
||||
Required.JsonInput.FloatFieldTooSmall
|
||||
Required.JsonInput.HelloWorld.JsonOutput
|
||||
Required.JsonInput.HelloWorld.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldExponentialFormat.JsonOutput
|
||||
Required.JsonInput.Int32FieldExponentialFormat.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldFloatTrailingZero.JsonOutput
|
||||
Required.JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldLeadingSpace
|
||||
Required.JsonInput.Int32FieldLeadingZero
|
||||
Required.JsonInput.Int32FieldMaxFloatValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldMaxValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldMaxValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldMinFloatValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldMinFloatValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldMinValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldMinValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldNegativeWithLeadingZero
|
||||
Required.JsonInput.Int32FieldNotInteger
|
||||
Required.JsonInput.Int32FieldNotNumber
|
||||
Required.JsonInput.Int32FieldPlusSign
|
||||
Required.JsonInput.Int32FieldStringValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldStringValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldStringValueEscaped.JsonOutput
|
||||
Required.JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldTooLarge
|
||||
Required.JsonInput.Int32FieldTooSmall
|
||||
Required.JsonInput.Int32FieldTrailingSpace
|
||||
Required.JsonInput.Int32MapEscapedKey.JsonOutput
|
||||
Required.JsonInput.Int32MapEscapedKey.ProtobufOutput
|
||||
Required.JsonInput.Int32MapField.JsonOutput
|
||||
Required.JsonInput.Int32MapField.ProtobufOutput
|
||||
Required.JsonInput.Int64FieldMaxValue.JsonOutput
|
||||
Required.JsonInput.Int64FieldMaxValue.ProtobufOutput
|
||||
Required.JsonInput.Int64FieldMaxValueNotQuoted.JsonOutput
|
||||
Required.JsonInput.Int64FieldMaxValueNotQuoted.ProtobufOutput
|
||||
Required.JsonInput.Int64FieldMinValue.JsonOutput
|
||||
Required.JsonInput.Int64FieldMinValue.ProtobufOutput
|
||||
Required.JsonInput.Int64FieldMinValueNotQuoted.JsonOutput
|
||||
Required.JsonInput.Int64FieldMinValueNotQuoted.ProtobufOutput
|
||||
Required.JsonInput.Int64FieldNotInteger
|
||||
Required.JsonInput.Int64FieldNotNumber
|
||||
Required.JsonInput.Int64FieldTooLarge
|
||||
Required.JsonInput.Int64FieldTooSmall
|
||||
Required.JsonInput.Int64MapEscapedKey.JsonOutput
|
||||
Required.JsonInput.Int64MapEscapedKey.ProtobufOutput
|
||||
Required.JsonInput.Int64MapField.JsonOutput
|
||||
Required.JsonInput.Int64MapField.ProtobufOutput
|
||||
Required.JsonInput.MessageField.JsonOutput
|
||||
Required.JsonInput.MessageField.ProtobufOutput
|
||||
Required.JsonInput.MessageMapField.JsonOutput
|
||||
Required.JsonInput.MessageMapField.ProtobufOutput
|
||||
Required.JsonInput.MessageRepeatedField.JsonOutput
|
||||
Required.JsonInput.MessageRepeatedField.ProtobufOutput
|
||||
Required.JsonInput.OneofFieldDuplicate
|
||||
Required.JsonInput.OptionalBoolWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalBoolWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalBytesWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalBytesWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalDoubleWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalDoubleWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalFloatWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalFloatWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalInt32Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalInt32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalInt64Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalInt64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalStringWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalStringWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalUint32Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalUint32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalUint64Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalUint64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalWrapperTypesWithNonDefaultValue.JsonOutput
|
||||
Required.JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
|
||||
Required.JsonInput.OriginalProtoFieldName.JsonOutput
|
||||
Required.JsonInput.OriginalProtoFieldName.ProtobufOutput
|
||||
Required.JsonInput.PrimitiveRepeatedField.JsonOutput
|
||||
Required.JsonInput.PrimitiveRepeatedField.ProtobufOutput
|
||||
Required.JsonInput.RepeatedBoolWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedBoolWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedBytesWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedBytesWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedDoubleWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedDoubleWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotMessage
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotString
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotBool
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotInt
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotString
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotBool
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotMessage
|
||||
Required.JsonInput.RepeatedFloatWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedFloatWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedInt32Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedInt32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedInt64Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedInt64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedStringWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedStringWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedUint32Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedUint32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedUint64Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedUint64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.StringField.JsonOutput
|
||||
Required.JsonInput.StringField.ProtobufOutput
|
||||
Required.JsonInput.StringFieldEscape.JsonOutput
|
||||
Required.JsonInput.StringFieldEscape.ProtobufOutput
|
||||
Required.JsonInput.StringFieldNotAString
|
||||
Required.JsonInput.StringFieldSurrogatePair.JsonOutput
|
||||
Required.JsonInput.StringFieldSurrogatePair.ProtobufOutput
|
||||
Required.JsonInput.StringFieldUnicode.JsonOutput
|
||||
Required.JsonInput.StringFieldUnicode.ProtobufOutput
|
||||
Required.JsonInput.StringFieldUnicodeEscape.JsonOutput
|
||||
Required.JsonInput.StringFieldUnicodeEscape.ProtobufOutput
|
||||
Required.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.JsonOutput
|
||||
Required.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.ProtobufOutput
|
||||
Required.JsonInput.StringRepeatedField.JsonOutput
|
||||
Required.JsonInput.StringRepeatedField.ProtobufOutput
|
||||
Required.JsonInput.Struct.JsonOutput
|
||||
Required.JsonInput.Struct.ProtobufOutput
|
||||
Required.JsonInput.TimestampJsonInputLowercaseT
|
||||
Required.JsonInput.TimestampJsonInputLowercaseZ
|
||||
Required.JsonInput.TimestampJsonInputMissingT
|
||||
Required.JsonInput.TimestampJsonInputMissingZ
|
||||
Required.JsonInput.TimestampJsonInputTooLarge
|
||||
Required.JsonInput.TimestampJsonInputTooSmall
|
||||
Required.JsonInput.TimestampMaxValue.JsonOutput
|
||||
Required.JsonInput.TimestampMaxValue.ProtobufOutput
|
||||
Required.JsonInput.TimestampMinValue.JsonOutput
|
||||
Required.JsonInput.TimestampMinValue.ProtobufOutput
|
||||
Required.JsonInput.TimestampRepeatedValue.JsonOutput
|
||||
Required.JsonInput.TimestampRepeatedValue.ProtobufOutput
|
||||
Required.JsonInput.TimestampWithNegativeOffset.JsonOutput
|
||||
Required.JsonInput.TimestampWithNegativeOffset.ProtobufOutput
|
||||
Required.JsonInput.TimestampWithPositiveOffset.JsonOutput
|
||||
Required.JsonInput.TimestampWithPositiveOffset.ProtobufOutput
|
||||
Required.JsonInput.Uint32FieldMaxFloatValue.JsonOutput
|
||||
Required.JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
|
||||
Required.JsonInput.Uint32FieldMaxValue.JsonOutput
|
||||
Required.JsonInput.Uint32FieldMaxValue.ProtobufOutput
|
||||
Required.JsonInput.Uint32FieldNotInteger
|
||||
Required.JsonInput.Uint32FieldNotNumber
|
||||
Required.JsonInput.Uint32FieldTooLarge
|
||||
Required.JsonInput.Uint32MapField.JsonOutput
|
||||
Required.JsonInput.Uint32MapField.ProtobufOutput
|
||||
Required.JsonInput.Uint64FieldMaxValue.JsonOutput
|
||||
Required.JsonInput.Uint64FieldMaxValue.ProtobufOutput
|
||||
Required.JsonInput.Uint64FieldMaxValueNotQuoted.JsonOutput
|
||||
Required.JsonInput.Uint64FieldMaxValueNotQuoted.ProtobufOutput
|
||||
Required.JsonInput.Uint64FieldNotInteger
|
||||
Required.JsonInput.Uint64FieldNotNumber
|
||||
Required.JsonInput.Uint64FieldTooLarge
|
||||
Required.JsonInput.Uint64MapField.JsonOutput
|
||||
Required.JsonInput.Uint64MapField.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptBool.JsonOutput
|
||||
Required.JsonInput.ValueAcceptBool.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptFloat.JsonOutput
|
||||
Required.JsonInput.ValueAcceptFloat.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptInteger.JsonOutput
|
||||
Required.JsonInput.ValueAcceptInteger.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptList.JsonOutput
|
||||
Required.JsonInput.ValueAcceptList.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptNull.JsonOutput
|
||||
Required.JsonInput.ValueAcceptNull.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptObject.JsonOutput
|
||||
Required.JsonInput.ValueAcceptObject.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptString.JsonOutput
|
||||
Required.JsonInput.ValueAcceptString.ProtobufOutput
|
||||
Required.JsonInput.WrapperTypesWithNullValue.JsonOutput
|
||||
Required.JsonInput.WrapperTypesWithNullValue.ProtobufOutput
|
||||
Required.ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
|
||||
Required.ProtobufInput.DoubleFieldNormalizeSignalingNan.JsonOutput
|
||||
Required.ProtobufInput.FloatFieldNormalizeQuietNan.JsonOutput
|
||||
Required.ProtobufInput.FloatFieldNormalizeSignalingNan.JsonOutput
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.BOOL
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.BYTES
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.DOUBLE
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.ENUM
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.FIXED32
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.FIXED64
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.FLOAT
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.INT32
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.INT64
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.SFIXED32
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.SFIXED64
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.SINT32
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.SINT64
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.STRING
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.UINT32
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownNonRepeatedValue.UINT64
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.BOOL
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.BYTES
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.DOUBLE
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.ENUM
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.FIXED32
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.FIXED64
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.FLOAT
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.INT32
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.INT64
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.SFIXED32
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.SFIXED64
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.SINT32
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.SINT64
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.STRING
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.UINT32
|
||||
Required.ProtobufInput.PrematureEofBeforeKnownRepeatedValue.UINT64
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.BOOL
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.BYTES
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.DOUBLE
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.ENUM
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.FIXED32
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.FIXED64
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.FLOAT
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.INT32
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.INT64
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED32
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.SFIXED64
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.SINT32
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.SINT64
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.STRING
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.UINT32
|
||||
Required.ProtobufInput.PrematureEofBeforeUnknownValue.UINT64
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.BYTES
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.STRING
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.BYTES
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.STRING
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.BYTES
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForUnknownValue.STRING
|
||||
Required.ProtobufInput.PrematureEofInPackedField.BOOL
|
||||
Required.ProtobufInput.PrematureEofInPackedField.DOUBLE
|
||||
Required.ProtobufInput.PrematureEofInPackedField.ENUM
|
||||
Required.ProtobufInput.PrematureEofInPackedField.FIXED32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.FIXED64
|
||||
Required.ProtobufInput.PrematureEofInPackedField.FLOAT
|
||||
Required.ProtobufInput.PrematureEofInPackedField.INT32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.INT64
|
||||
Required.ProtobufInput.PrematureEofInPackedField.SFIXED32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.SFIXED64
|
||||
Required.ProtobufInput.PrematureEofInPackedField.SINT32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.SINT64
|
||||
Required.ProtobufInput.PrematureEofInPackedField.UINT32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.UINT64
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.BOOL
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.DOUBLE
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.ENUM
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.FIXED32
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.FIXED64
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.FLOAT
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.INT32
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.INT64
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.SFIXED32
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.SFIXED64
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.SINT32
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.SINT64
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.UINT32
|
||||
Required.ProtobufInput.PrematureEofInPackedFieldValue.UINT64
|
||||
Required.ProtobufInput.PrematureEofInSubmessageValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.BOOL
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.BYTES
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.DOUBLE
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.ENUM
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.FIXED32
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.FIXED64
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.FLOAT
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.INT32
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.INT64
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.SFIXED32
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.SFIXED64
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.SINT32
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.SINT64
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.STRING
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.UINT32
|
||||
Required.ProtobufInput.PrematureEofInsideKnownNonRepeatedValue.UINT64
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.BOOL
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.BYTES
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.DOUBLE
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.ENUM
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.FIXED32
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.FIXED64
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.FLOAT
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.INT32
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.INT64
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.SFIXED32
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.SFIXED64
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.SINT32
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.SINT64
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.STRING
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.UINT32
|
||||
Required.ProtobufInput.PrematureEofInsideKnownRepeatedValue.UINT64
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.BOOL
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.BYTES
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.DOUBLE
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.ENUM
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.FIXED32
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.FIXED64
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.FLOAT
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.INT32
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.INT64
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.SFIXED32
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.SFIXED64
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.SINT32
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.SINT64
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.STRING
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.UINT32
|
||||
Required.ProtobufInput.PrematureEofInsideUnknownValue.UINT64
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.BOOL.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.BOOL.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.DOUBLE.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.DOUBLE.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.FIXED32.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.FIXED32.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.FLOAT.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.FLOAT.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.INT32.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.INT32.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.INT64.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.INT64.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.SFIXED32.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.SFIXED32.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.SFIXED64.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.SFIXED64.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.SINT32.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.SINT32.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.SINT64.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.SINT64.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.UINT32.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.UINT32.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.UINT64.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.BOOL.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.BOOL.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.DOUBLE.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.DOUBLE.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.FIXED32.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.FIXED32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.FIXED64.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.FIXED64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.FLOAT.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.FLOAT.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.INT32.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.INT32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.INT64.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.INT64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SFIXED32.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SFIXED32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SFIXED64.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SFIXED64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SINT32.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SINT32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SINT64.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.SINT64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.UINT32.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.UINT32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.UINT64.JsonOutput
|
||||
Required.ProtobufInput.ValidDataRepeated.UINT64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.BOOL.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.BOOL.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.DOUBLE.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.DOUBLE.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.FIXED32.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.FIXED32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.FIXED64.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.FIXED64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.FLOAT.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.FLOAT.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.INT32.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.INT32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.INT64.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.INT64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.SFIXED32.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.SFIXED32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.SFIXED64.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.SFIXED64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.SINT32.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.SINT32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.SINT64.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.SINT64.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.UINT32.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.UINT32.ProtobufOutput
|
||||
Required.ProtobufInput.ValidDataScalar.UINT64.JsonOutput
|
||||
Required.ProtobufInput.ValidDataScalar.UINT64.ProtobufOutput
|
||||
Required.TimestampProtoInputTooLarge.JsonOutput
|
||||
Required.TimestampProtoInputTooSmall.JsonOutput
|
227
conformance/failure_list_php_c.txt
Normal file
227
conformance/failure_list_php_c.txt
Normal file
|
@ -0,0 +1,227 @@
|
|||
Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
|
||||
Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
|
||||
Recommended.FieldMaskTooManyUnderscore.JsonOutput
|
||||
Recommended.JsonInput.BoolFieldIntegerOne
|
||||
Recommended.JsonInput.BoolFieldIntegerZero
|
||||
Recommended.JsonInput.DurationHas3FractionalDigits.Validator
|
||||
Recommended.JsonInput.DurationHas6FractionalDigits.Validator
|
||||
Recommended.JsonInput.DurationHas9FractionalDigits.Validator
|
||||
Recommended.JsonInput.DurationHasZeroFractionalDigit.Validator
|
||||
Recommended.JsonInput.Int64FieldBeString.Validator
|
||||
Recommended.JsonInput.MapFieldValueIsNull
|
||||
Recommended.JsonInput.OneofZeroBool.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroBool.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroBytes.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroBytes.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroDouble.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroDouble.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroEnum.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroEnum.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroFloat.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroFloat.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroString.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroString.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroUint32.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroUint32.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroUint64.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroUint64.ProtobufOutput
|
||||
Recommended.JsonInput.RepeatedFieldMessageElementIsNull
|
||||
Recommended.JsonInput.RepeatedFieldPrimitiveElementIsNull
|
||||
Recommended.JsonInput.StringEndsWithEscapeChar
|
||||
Recommended.JsonInput.StringFieldSurrogateInWrongOrder
|
||||
Recommended.JsonInput.StringFieldUnpairedHighSurrogate
|
||||
Recommended.JsonInput.StringFieldUnpairedLowSurrogate
|
||||
Recommended.JsonInput.TimestampHas3FractionalDigits.Validator
|
||||
Recommended.JsonInput.TimestampHas6FractionalDigits.Validator
|
||||
Recommended.JsonInput.TimestampHas9FractionalDigits.Validator
|
||||
Recommended.JsonInput.TimestampHasZeroFractionalDigit.Validator
|
||||
Recommended.JsonInput.TimestampZeroNormalized.Validator
|
||||
Recommended.JsonInput.Uint64FieldBeString.Validator
|
||||
Recommended.ProtobufInput.OneofZeroBool.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroBool.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroBytes.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroBytes.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroDouble.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroDouble.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroEnum.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroEnum.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroFloat.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroFloat.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroString.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroString.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroUint32.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroUint32.ProtobufOutput
|
||||
Recommended.ProtobufInput.OneofZeroUint64.JsonOutput
|
||||
Recommended.ProtobufInput.OneofZeroUint64.ProtobufOutput
|
||||
Required.DurationProtoInputTooLarge.JsonOutput
|
||||
Required.DurationProtoInputTooSmall.JsonOutput
|
||||
Required.JsonInput.AllFieldAcceptNull.ProtobufOutput
|
||||
Required.JsonInput.Any.JsonOutput
|
||||
Required.JsonInput.Any.ProtobufOutput
|
||||
Required.JsonInput.AnyNested.JsonOutput
|
||||
Required.JsonInput.AnyNested.ProtobufOutput
|
||||
Required.JsonInput.AnyUnorderedTypeTag.JsonOutput
|
||||
Required.JsonInput.AnyUnorderedTypeTag.ProtobufOutput
|
||||
Required.JsonInput.AnyWithDuration.JsonOutput
|
||||
Required.JsonInput.AnyWithDuration.ProtobufOutput
|
||||
Required.JsonInput.AnyWithFieldMask.JsonOutput
|
||||
Required.JsonInput.AnyWithFieldMask.ProtobufOutput
|
||||
Required.JsonInput.AnyWithInt32ValueWrapper.JsonOutput
|
||||
Required.JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
|
||||
Required.JsonInput.AnyWithStruct.JsonOutput
|
||||
Required.JsonInput.AnyWithStruct.ProtobufOutput
|
||||
Required.JsonInput.AnyWithTimestamp.JsonOutput
|
||||
Required.JsonInput.AnyWithTimestamp.ProtobufOutput
|
||||
Required.JsonInput.AnyWithValueForInteger.JsonOutput
|
||||
Required.JsonInput.AnyWithValueForInteger.ProtobufOutput
|
||||
Required.JsonInput.AnyWithValueForJsonObject.JsonOutput
|
||||
Required.JsonInput.AnyWithValueForJsonObject.ProtobufOutput
|
||||
Required.JsonInput.BoolFieldFalse.ProtobufOutput
|
||||
Required.JsonInput.BoolMapField.JsonOutput
|
||||
Required.JsonInput.DoubleFieldInfinity.JsonOutput
|
||||
Required.JsonInput.DoubleFieldInfinity.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMaxPositiveValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMaxPositiveValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMinNegativeValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMinNegativeValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMinPositiveValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldNan.JsonOutput
|
||||
Required.JsonInput.DoubleFieldNan.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldNegativeInfinity.JsonOutput
|
||||
Required.JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldQuotedValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldQuotedValue.ProtobufOutput
|
||||
Required.JsonInput.DurationMaxValue.JsonOutput
|
||||
Required.JsonInput.DurationMaxValue.ProtobufOutput
|
||||
Required.JsonInput.DurationMinValue.JsonOutput
|
||||
Required.JsonInput.DurationMinValue.ProtobufOutput
|
||||
Required.JsonInput.DurationRepeatedValue.JsonOutput
|
||||
Required.JsonInput.DurationRepeatedValue.ProtobufOutput
|
||||
Required.JsonInput.EnumField.ProtobufOutput
|
||||
Required.JsonInput.EnumFieldNumericValueNonZero.JsonOutput
|
||||
Required.JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
|
||||
Required.JsonInput.EnumFieldNumericValueZero.JsonOutput
|
||||
Required.JsonInput.EnumFieldNumericValueZero.ProtobufOutput
|
||||
Required.JsonInput.EnumFieldUnknownValue.Validator
|
||||
Required.JsonInput.FieldMask.JsonOutput
|
||||
Required.JsonInput.FieldMask.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldInfinity.JsonOutput
|
||||
Required.JsonInput.FloatFieldInfinity.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldNan.JsonOutput
|
||||
Required.JsonInput.FloatFieldNan.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldNegativeInfinity.JsonOutput
|
||||
Required.JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldQuotedValue.JsonOutput
|
||||
Required.JsonInput.FloatFieldQuotedValue.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldTooLarge
|
||||
Required.JsonInput.FloatFieldTooSmall
|
||||
Required.JsonInput.Int32FieldExponentialFormat.JsonOutput
|
||||
Required.JsonInput.Int32FieldExponentialFormat.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldFloatTrailingZero.JsonOutput
|
||||
Required.JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldMaxFloatValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldMinFloatValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldMinFloatValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldStringValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldStringValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldStringValueEscaped.JsonOutput
|
||||
Required.JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
|
||||
Required.JsonInput.Int64FieldMaxValue.JsonOutput
|
||||
Required.JsonInput.Int64FieldMaxValue.ProtobufOutput
|
||||
Required.JsonInput.Int64FieldMinValue.JsonOutput
|
||||
Required.JsonInput.Int64FieldMinValue.ProtobufOutput
|
||||
Required.JsonInput.MessageField.JsonOutput
|
||||
Required.JsonInput.MessageField.ProtobufOutput
|
||||
Required.JsonInput.OptionalBoolWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalBoolWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalBytesWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalBytesWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalDoubleWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalDoubleWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalFloatWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalFloatWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalInt32Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalInt32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalInt64Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalInt64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalStringWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalStringWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalUint32Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalUint32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalUint64Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalUint64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalWrapperTypesWithNonDefaultValue.JsonOutput
|
||||
Required.JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
|
||||
Required.JsonInput.RepeatedBoolWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedBoolWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedBytesWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedBytesWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedDoubleWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedDoubleWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingMessagesGotInt
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
|
||||
Required.JsonInput.RepeatedFloatWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedFloatWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedInt32Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedInt32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedInt64Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedInt64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedStringWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedStringWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedUint32Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedUint32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedUint64Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedUint64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.StringFieldEscape.JsonOutput
|
||||
Required.JsonInput.StringFieldEscape.ProtobufOutput
|
||||
Required.JsonInput.StringFieldNotAString
|
||||
Required.JsonInput.StringFieldSurrogatePair.JsonOutput
|
||||
Required.JsonInput.StringFieldSurrogatePair.ProtobufOutput
|
||||
Required.JsonInput.StringFieldUnicodeEscape.JsonOutput
|
||||
Required.JsonInput.StringFieldUnicodeEscape.ProtobufOutput
|
||||
Required.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.JsonOutput
|
||||
Required.JsonInput.StringFieldUnicodeEscapeWithLowercaseHexLetters.ProtobufOutput
|
||||
Required.JsonInput.Struct.JsonOutput
|
||||
Required.JsonInput.Struct.ProtobufOutput
|
||||
Required.JsonInput.TimestampMaxValue.JsonOutput
|
||||
Required.JsonInput.TimestampMaxValue.ProtobufOutput
|
||||
Required.JsonInput.TimestampMinValue.JsonOutput
|
||||
Required.JsonInput.TimestampMinValue.ProtobufOutput
|
||||
Required.JsonInput.TimestampRepeatedValue.JsonOutput
|
||||
Required.JsonInput.TimestampRepeatedValue.ProtobufOutput
|
||||
Required.JsonInput.TimestampWithNegativeOffset.JsonOutput
|
||||
Required.JsonInput.TimestampWithNegativeOffset.ProtobufOutput
|
||||
Required.JsonInput.TimestampWithPositiveOffset.JsonOutput
|
||||
Required.JsonInput.TimestampWithPositiveOffset.ProtobufOutput
|
||||
Required.JsonInput.Uint32FieldMaxFloatValue.JsonOutput
|
||||
Required.JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
|
||||
Required.JsonInput.Uint64FieldMaxValue.JsonOutput
|
||||
Required.JsonInput.Uint64FieldMaxValue.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptBool.JsonOutput
|
||||
Required.JsonInput.ValueAcceptBool.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptFloat.JsonOutput
|
||||
Required.JsonInput.ValueAcceptFloat.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptInteger.JsonOutput
|
||||
Required.JsonInput.ValueAcceptInteger.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptList.JsonOutput
|
||||
Required.JsonInput.ValueAcceptList.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptNull.JsonOutput
|
||||
Required.JsonInput.ValueAcceptNull.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptObject.JsonOutput
|
||||
Required.JsonInput.ValueAcceptObject.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptString.JsonOutput
|
||||
Required.JsonInput.ValueAcceptString.ProtobufOutput
|
||||
Required.JsonInput.WrapperTypesWithNullValue.ProtobufOutput
|
||||
Required.ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
|
||||
Required.ProtobufInput.DoubleFieldNormalizeSignalingNan.JsonOutput
|
||||
Required.ProtobufInput.FloatFieldNormalizeQuietNan.JsonOutput
|
||||
Required.ProtobufInput.FloatFieldNormalizeSignalingNan.JsonOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.FIXED32.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.FIXED64.ProtobufOutput
|
||||
Required.ProtobufInput.RepeatedScalarSelectsLast.UINT64.ProtobufOutput
|
||||
Required.TimestampProtoInputTooLarge.JsonOutput
|
||||
Required.TimestampProtoInputTooSmall.JsonOutput
|
|
@ -1,47 +1,17 @@
|
|||
DurationProtoInputTooLarge.JsonOutput
|
||||
DurationProtoInputTooSmall.JsonOutput
|
||||
FieldMaskNumbersDontRoundTrip.JsonOutput
|
||||
FieldMaskPathsDontRoundTrip.JsonOutput
|
||||
FieldMaskTooManyUnderscore.JsonOutput
|
||||
JsonInput.AnyWithFieldMask.ProtobufOutput
|
||||
JsonInput.BytesFieldInvalidBase64Characters
|
||||
JsonInput.DoubleFieldInfinityNotQuoted
|
||||
JsonInput.DoubleFieldNanNotQuoted
|
||||
JsonInput.DoubleFieldNegativeInfinityNotQuoted
|
||||
JsonInput.DoubleFieldTooSmall
|
||||
JsonInput.DurationJsonInputTooLarge
|
||||
JsonInput.DurationJsonInputTooSmall
|
||||
JsonInput.DurationMissingS
|
||||
JsonInput.EnumFieldNumericValueNonZero.JsonOutput
|
||||
JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
|
||||
JsonInput.EnumFieldNumericValueZero.JsonOutput
|
||||
JsonInput.EnumFieldNumericValueZero.ProtobufOutput
|
||||
JsonInput.EnumFieldUnknownValue.Validator
|
||||
JsonInput.FieldMask.ProtobufOutput
|
||||
JsonInput.FieldMaskInvalidCharacter
|
||||
JsonInput.FieldNameInLowerCamelCase.Validator
|
||||
JsonInput.FieldNameInSnakeCase.JsonOutput
|
||||
JsonInput.FieldNameInSnakeCase.ProtobufOutput
|
||||
JsonInput.FloatFieldInfinityNotQuoted
|
||||
JsonInput.FloatFieldNanNotQuoted
|
||||
JsonInput.FloatFieldNegativeInfinityNotQuoted
|
||||
JsonInput.FloatFieldTooLarge
|
||||
JsonInput.FloatFieldTooSmall
|
||||
JsonInput.Int32FieldExponentialFormat.JsonOutput
|
||||
JsonInput.Int32FieldExponentialFormat.ProtobufOutput
|
||||
JsonInput.Int32FieldFloatTrailingZero.JsonOutput
|
||||
JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
|
||||
JsonInput.Int32FieldMaxFloatValue.JsonOutput
|
||||
JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
|
||||
JsonInput.Int32FieldMinFloatValue.JsonOutput
|
||||
JsonInput.Int32FieldMinFloatValue.ProtobufOutput
|
||||
JsonInput.OriginalProtoFieldName.JsonOutput
|
||||
JsonInput.OriginalProtoFieldName.ProtobufOutput
|
||||
JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
|
||||
JsonInput.TimestampJsonInputLowercaseT
|
||||
JsonInput.Uint32FieldMaxFloatValue.JsonOutput
|
||||
JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
|
||||
JsonInput.ValueAcceptNull.JsonOutput
|
||||
JsonInput.ValueAcceptNull.ProtobufOutput
|
||||
TimestampProtoInputTooLarge.JsonOutput
|
||||
TimestampProtoInputTooSmall.JsonOutput
|
||||
Recommended.JsonInput.DoubleFieldInfinityNotQuoted
|
||||
Recommended.JsonInput.DoubleFieldNanNotQuoted
|
||||
Recommended.JsonInput.DoubleFieldNegativeInfinityNotQuoted
|
||||
Recommended.JsonInput.FloatFieldInfinityNotQuoted
|
||||
Recommended.JsonInput.FloatFieldNanNotQuoted
|
||||
Recommended.JsonInput.FloatFieldNegativeInfinityNotQuoted
|
||||
Required.JsonInput.BytesFieldInvalidBase64Characters
|
||||
Required.JsonInput.DoubleFieldTooSmall
|
||||
Required.JsonInput.EnumFieldUnknownValue.Validator
|
||||
Required.JsonInput.FloatFieldTooLarge
|
||||
Required.JsonInput.FloatFieldTooSmall
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
|
||||
Required.JsonInput.TimestampJsonInputLowercaseT
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_0
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_1
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_2
|
||||
Required.ProtobufInput.IllegalZeroFieldNum_Case_3
|
||||
|
|
|
@ -7,66 +7,32 @@
|
|||
# TODO(haberman): insert links to corresponding bugs tracking the issue.
|
||||
# Should we use GitHub issues or the Google-internal bug tracker?
|
||||
|
||||
DurationProtoInputTooLarge.JsonOutput
|
||||
DurationProtoInputTooSmall.JsonOutput
|
||||
FieldMaskNumbersDontRoundTrip.JsonOutput
|
||||
FieldMaskPathsDontRoundTrip.JsonOutput
|
||||
FieldMaskTooManyUnderscore.JsonOutput
|
||||
JsonInput.AnyWithFieldMask.ProtobufOutput
|
||||
JsonInput.BytesFieldInvalidBase64Characters
|
||||
JsonInput.DoubleFieldInfinityNotQuoted
|
||||
JsonInput.DoubleFieldNanNotQuoted
|
||||
JsonInput.DoubleFieldNegativeInfinityNotQuoted
|
||||
JsonInput.DoubleFieldTooSmall
|
||||
JsonInput.DurationJsonInputTooLarge
|
||||
JsonInput.DurationJsonInputTooSmall
|
||||
JsonInput.DurationMissingS
|
||||
JsonInput.EnumFieldNumericValueNonZero.JsonOutput
|
||||
JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
|
||||
JsonInput.EnumFieldNumericValueZero.JsonOutput
|
||||
JsonInput.EnumFieldNumericValueZero.ProtobufOutput
|
||||
JsonInput.EnumFieldUnknownValue.Validator
|
||||
JsonInput.FieldMask.ProtobufOutput
|
||||
JsonInput.FieldMaskInvalidCharacter
|
||||
JsonInput.FieldNameInLowerCamelCase.Validator
|
||||
JsonInput.FieldNameInSnakeCase.JsonOutput
|
||||
JsonInput.FieldNameInSnakeCase.ProtobufOutput
|
||||
JsonInput.FloatFieldInfinityNotQuoted
|
||||
JsonInput.FloatFieldNanNotQuoted
|
||||
JsonInput.FloatFieldNegativeInfinityNotQuoted
|
||||
JsonInput.FloatFieldTooLarge
|
||||
JsonInput.FloatFieldTooSmall
|
||||
JsonInput.Int32FieldExponentialFormat.JsonOutput
|
||||
JsonInput.Int32FieldExponentialFormat.ProtobufOutput
|
||||
JsonInput.Int32FieldFloatTrailingZero.JsonOutput
|
||||
JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
|
||||
JsonInput.Int32FieldMaxFloatValue.JsonOutput
|
||||
JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
|
||||
JsonInput.Int32FieldMinFloatValue.JsonOutput
|
||||
JsonInput.Int32FieldMinFloatValue.ProtobufOutput
|
||||
JsonInput.OriginalProtoFieldName.JsonOutput
|
||||
JsonInput.OriginalProtoFieldName.ProtobufOutput
|
||||
JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
|
||||
JsonInput.TimestampJsonInputLowercaseT
|
||||
JsonInput.Uint32FieldMaxFloatValue.JsonOutput
|
||||
JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
|
||||
JsonInput.ValueAcceptNull.JsonOutput
|
||||
JsonInput.ValueAcceptNull.ProtobufOutput
|
||||
ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
|
||||
ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
|
||||
ProtobufInput.PrematureEofInPackedField.BOOL
|
||||
ProtobufInput.PrematureEofInPackedField.DOUBLE
|
||||
ProtobufInput.PrematureEofInPackedField.ENUM
|
||||
ProtobufInput.PrematureEofInPackedField.FIXED32
|
||||
ProtobufInput.PrematureEofInPackedField.FIXED64
|
||||
ProtobufInput.PrematureEofInPackedField.FLOAT
|
||||
ProtobufInput.PrematureEofInPackedField.INT32
|
||||
ProtobufInput.PrematureEofInPackedField.INT64
|
||||
ProtobufInput.PrematureEofInPackedField.SFIXED32
|
||||
ProtobufInput.PrematureEofInPackedField.SFIXED64
|
||||
ProtobufInput.PrematureEofInPackedField.SINT32
|
||||
ProtobufInput.PrematureEofInPackedField.SINT64
|
||||
ProtobufInput.PrematureEofInPackedField.UINT32
|
||||
ProtobufInput.PrematureEofInPackedField.UINT64
|
||||
TimestampProtoInputTooLarge.JsonOutput
|
||||
TimestampProtoInputTooSmall.JsonOutput
|
||||
Recommended.JsonInput.DoubleFieldInfinityNotQuoted
|
||||
Recommended.JsonInput.DoubleFieldNanNotQuoted
|
||||
Recommended.JsonInput.DoubleFieldNegativeInfinityNotQuoted
|
||||
Recommended.JsonInput.FloatFieldInfinityNotQuoted
|
||||
Recommended.JsonInput.FloatFieldNanNotQuoted
|
||||
Recommended.JsonInput.FloatFieldNegativeInfinityNotQuoted
|
||||
Required.JsonInput.BytesFieldInvalidBase64Characters
|
||||
Required.JsonInput.DoubleFieldTooSmall
|
||||
Required.JsonInput.EnumFieldUnknownValue.Validator
|
||||
Required.JsonInput.FloatFieldTooLarge
|
||||
Required.JsonInput.FloatFieldTooSmall
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingIntegersGotBool
|
||||
Required.JsonInput.TimestampJsonInputLowercaseT
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE
|
||||
Required.ProtobufInput.PrematureEofInPackedField.BOOL
|
||||
Required.ProtobufInput.PrematureEofInPackedField.DOUBLE
|
||||
Required.ProtobufInput.PrematureEofInPackedField.ENUM
|
||||
Required.ProtobufInput.PrematureEofInPackedField.FIXED32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.FIXED64
|
||||
Required.ProtobufInput.PrematureEofInPackedField.FLOAT
|
||||
Required.ProtobufInput.PrematureEofInPackedField.INT32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.INT64
|
||||
Required.ProtobufInput.PrematureEofInPackedField.SFIXED32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.SFIXED64
|
||||
Required.ProtobufInput.PrematureEofInPackedField.SINT32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.SINT64
|
||||
Required.ProtobufInput.PrematureEofInPackedField.UINT32
|
||||
Required.ProtobufInput.PrematureEofInPackedField.UINT64
|
||||
|
|
|
@ -1,199 +1,203 @@
|
|||
DurationProtoInputTooLarge.JsonOutput
|
||||
DurationProtoInputTooSmall.JsonOutput
|
||||
FieldMaskNumbersDontRoundTrip.JsonOutput
|
||||
FieldMaskPathsDontRoundTrip.JsonOutput
|
||||
FieldMaskTooManyUnderscore.JsonOutput
|
||||
JsonInput.Any.JsonOutput
|
||||
JsonInput.Any.ProtobufOutput
|
||||
JsonInput.AnyNested.JsonOutput
|
||||
JsonInput.AnyNested.ProtobufOutput
|
||||
JsonInput.AnyUnorderedTypeTag.JsonOutput
|
||||
JsonInput.AnyUnorderedTypeTag.ProtobufOutput
|
||||
JsonInput.AnyWithDuration.JsonOutput
|
||||
JsonInput.AnyWithDuration.ProtobufOutput
|
||||
JsonInput.AnyWithFieldMask.JsonOutput
|
||||
JsonInput.AnyWithFieldMask.ProtobufOutput
|
||||
JsonInput.AnyWithInt32ValueWrapper.JsonOutput
|
||||
JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
|
||||
JsonInput.AnyWithStruct.JsonOutput
|
||||
JsonInput.AnyWithStruct.ProtobufOutput
|
||||
JsonInput.AnyWithTimestamp.JsonOutput
|
||||
JsonInput.AnyWithTimestamp.ProtobufOutput
|
||||
JsonInput.AnyWithValueForInteger.JsonOutput
|
||||
JsonInput.AnyWithValueForInteger.ProtobufOutput
|
||||
JsonInput.AnyWithValueForJsonObject.JsonOutput
|
||||
JsonInput.AnyWithValueForJsonObject.ProtobufOutput
|
||||
JsonInput.BoolFieldIntegerOne
|
||||
JsonInput.BoolFieldIntegerZero
|
||||
JsonInput.DoubleFieldInfinity.JsonOutput
|
||||
JsonInput.DoubleFieldInfinity.ProtobufOutput
|
||||
JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
|
||||
JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
|
||||
JsonInput.DoubleFieldMaxPositiveValue.JsonOutput
|
||||
JsonInput.DoubleFieldMaxPositiveValue.ProtobufOutput
|
||||
JsonInput.DoubleFieldMinNegativeValue.JsonOutput
|
||||
JsonInput.DoubleFieldMinNegativeValue.ProtobufOutput
|
||||
JsonInput.DoubleFieldMinPositiveValue.JsonOutput
|
||||
JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
|
||||
JsonInput.DoubleFieldNan.JsonOutput
|
||||
JsonInput.DoubleFieldNan.ProtobufOutput
|
||||
JsonInput.DoubleFieldNegativeInfinity.JsonOutput
|
||||
JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
|
||||
JsonInput.DoubleFieldQuotedValue.JsonOutput
|
||||
JsonInput.DoubleFieldQuotedValue.ProtobufOutput
|
||||
JsonInput.DurationHas3FractionalDigits.Validator
|
||||
JsonInput.DurationHas6FractionalDigits.Validator
|
||||
JsonInput.DurationHas9FractionalDigits.Validator
|
||||
JsonInput.DurationHasZeroFractionalDigit.Validator
|
||||
JsonInput.DurationMaxValue.JsonOutput
|
||||
JsonInput.DurationMaxValue.ProtobufOutput
|
||||
JsonInput.DurationMinValue.JsonOutput
|
||||
JsonInput.DurationMinValue.ProtobufOutput
|
||||
JsonInput.DurationRepeatedValue.JsonOutput
|
||||
JsonInput.DurationRepeatedValue.ProtobufOutput
|
||||
JsonInput.EnumFieldNumericValueNonZero.JsonOutput
|
||||
JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
|
||||
JsonInput.EnumFieldNumericValueZero.JsonOutput
|
||||
JsonInput.EnumFieldNumericValueZero.ProtobufOutput
|
||||
JsonInput.EnumFieldUnknownValue.Validator
|
||||
JsonInput.FieldMask.JsonOutput
|
||||
JsonInput.FieldMask.ProtobufOutput
|
||||
JsonInput.FieldNameInSnakeCase.JsonOutput
|
||||
JsonInput.FieldNameWithMixedCases.JsonOutput
|
||||
JsonInput.FieldNameWithMixedCases.ProtobufOutput
|
||||
JsonInput.FieldNameWithMixedCases.Validator
|
||||
JsonInput.FloatFieldInfinity.JsonOutput
|
||||
JsonInput.FloatFieldInfinity.ProtobufOutput
|
||||
JsonInput.FloatFieldNan.JsonOutput
|
||||
JsonInput.FloatFieldNan.ProtobufOutput
|
||||
JsonInput.FloatFieldNegativeInfinity.JsonOutput
|
||||
JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
|
||||
JsonInput.FloatFieldQuotedValue.JsonOutput
|
||||
JsonInput.FloatFieldQuotedValue.ProtobufOutput
|
||||
JsonInput.FloatFieldTooLarge
|
||||
JsonInput.FloatFieldTooSmall
|
||||
JsonInput.Int32FieldExponentialFormat.JsonOutput
|
||||
JsonInput.Int32FieldExponentialFormat.ProtobufOutput
|
||||
JsonInput.Int32FieldFloatTrailingZero.JsonOutput
|
||||
JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
|
||||
JsonInput.Int32FieldMaxFloatValue.JsonOutput
|
||||
JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
|
||||
JsonInput.Int32FieldMinFloatValue.JsonOutput
|
||||
JsonInput.Int32FieldMinFloatValue.ProtobufOutput
|
||||
JsonInput.Int32FieldStringValue.JsonOutput
|
||||
JsonInput.Int32FieldStringValue.ProtobufOutput
|
||||
JsonInput.Int32FieldStringValueEscaped.JsonOutput
|
||||
JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
|
||||
JsonInput.Int32MapEscapedKey.JsonOutput
|
||||
JsonInput.Int32MapEscapedKey.ProtobufOutput
|
||||
JsonInput.Int32MapField.JsonOutput
|
||||
JsonInput.Int32MapField.ProtobufOutput
|
||||
JsonInput.Int64FieldBeString.Validator
|
||||
JsonInput.Int64FieldMaxValue.JsonOutput
|
||||
JsonInput.Int64FieldMaxValue.ProtobufOutput
|
||||
JsonInput.Int64FieldMinValue.JsonOutput
|
||||
JsonInput.Int64FieldMinValue.ProtobufOutput
|
||||
JsonInput.Int64MapEscapedKey.JsonOutput
|
||||
JsonInput.Int64MapEscapedKey.ProtobufOutput
|
||||
JsonInput.Int64MapField.JsonOutput
|
||||
JsonInput.Int64MapField.ProtobufOutput
|
||||
JsonInput.MessageField.JsonOutput
|
||||
JsonInput.MessageField.ProtobufOutput
|
||||
JsonInput.MessageMapField.JsonOutput
|
||||
JsonInput.MessageMapField.ProtobufOutput
|
||||
JsonInput.MessageRepeatedField.JsonOutput
|
||||
JsonInput.MessageRepeatedField.ProtobufOutput
|
||||
JsonInput.OptionalBoolWrapper.JsonOutput
|
||||
JsonInput.OptionalBoolWrapper.ProtobufOutput
|
||||
JsonInput.OptionalBytesWrapper.JsonOutput
|
||||
JsonInput.OptionalBytesWrapper.ProtobufOutput
|
||||
JsonInput.OptionalDoubleWrapper.JsonOutput
|
||||
JsonInput.OptionalDoubleWrapper.ProtobufOutput
|
||||
JsonInput.OptionalFloatWrapper.JsonOutput
|
||||
JsonInput.OptionalFloatWrapper.ProtobufOutput
|
||||
JsonInput.OptionalInt32Wrapper.JsonOutput
|
||||
JsonInput.OptionalInt32Wrapper.ProtobufOutput
|
||||
JsonInput.OptionalInt64Wrapper.JsonOutput
|
||||
JsonInput.OptionalInt64Wrapper.ProtobufOutput
|
||||
JsonInput.OptionalStringWrapper.JsonOutput
|
||||
JsonInput.OptionalStringWrapper.ProtobufOutput
|
||||
JsonInput.OptionalUint32Wrapper.JsonOutput
|
||||
JsonInput.OptionalUint32Wrapper.ProtobufOutput
|
||||
JsonInput.OptionalUint64Wrapper.JsonOutput
|
||||
JsonInput.OptionalUint64Wrapper.ProtobufOutput
|
||||
JsonInput.OptionalWrapperTypesWithNonDefaultValue.JsonOutput
|
||||
JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
|
||||
JsonInput.OriginalProtoFieldName.JsonOutput
|
||||
JsonInput.PrimitiveRepeatedField.JsonOutput
|
||||
JsonInput.PrimitiveRepeatedField.ProtobufOutput
|
||||
JsonInput.RepeatedBoolWrapper.JsonOutput
|
||||
JsonInput.RepeatedBoolWrapper.ProtobufOutput
|
||||
JsonInput.RepeatedBytesWrapper.JsonOutput
|
||||
JsonInput.RepeatedBytesWrapper.ProtobufOutput
|
||||
JsonInput.RepeatedDoubleWrapper.JsonOutput
|
||||
JsonInput.RepeatedDoubleWrapper.ProtobufOutput
|
||||
JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
|
||||
JsonInput.RepeatedFloatWrapper.JsonOutput
|
||||
JsonInput.RepeatedFloatWrapper.ProtobufOutput
|
||||
JsonInput.RepeatedInt32Wrapper.JsonOutput
|
||||
JsonInput.RepeatedInt32Wrapper.ProtobufOutput
|
||||
JsonInput.RepeatedInt64Wrapper.JsonOutput
|
||||
JsonInput.RepeatedInt64Wrapper.ProtobufOutput
|
||||
JsonInput.RepeatedStringWrapper.JsonOutput
|
||||
JsonInput.RepeatedStringWrapper.ProtobufOutput
|
||||
JsonInput.RepeatedUint32Wrapper.JsonOutput
|
||||
JsonInput.RepeatedUint32Wrapper.ProtobufOutput
|
||||
JsonInput.RepeatedUint64Wrapper.JsonOutput
|
||||
JsonInput.RepeatedUint64Wrapper.ProtobufOutput
|
||||
JsonInput.StringFieldNotAString
|
||||
JsonInput.StringFieldSurrogateInWrongOrder
|
||||
JsonInput.StringFieldSurrogatePair.JsonOutput
|
||||
JsonInput.StringFieldSurrogatePair.ProtobufOutput
|
||||
JsonInput.StringFieldUnpairedHighSurrogate
|
||||
JsonInput.StringFieldUnpairedLowSurrogate
|
||||
JsonInput.Struct.JsonOutput
|
||||
JsonInput.Struct.ProtobufOutput
|
||||
JsonInput.TimestampHas3FractionalDigits.Validator
|
||||
JsonInput.TimestampHas6FractionalDigits.Validator
|
||||
JsonInput.TimestampHas9FractionalDigits.Validator
|
||||
JsonInput.TimestampHasZeroFractionalDigit.Validator
|
||||
JsonInput.TimestampMaxValue.JsonOutput
|
||||
JsonInput.TimestampMaxValue.ProtobufOutput
|
||||
JsonInput.TimestampMinValue.JsonOutput
|
||||
JsonInput.TimestampMinValue.ProtobufOutput
|
||||
JsonInput.TimestampRepeatedValue.JsonOutput
|
||||
JsonInput.TimestampRepeatedValue.ProtobufOutput
|
||||
JsonInput.TimestampWithNegativeOffset.JsonOutput
|
||||
JsonInput.TimestampWithNegativeOffset.ProtobufOutput
|
||||
JsonInput.TimestampWithPositiveOffset.JsonOutput
|
||||
JsonInput.TimestampWithPositiveOffset.ProtobufOutput
|
||||
JsonInput.TimestampZeroNormalized.Validator
|
||||
JsonInput.Uint32FieldMaxFloatValue.JsonOutput
|
||||
JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
|
||||
JsonInput.Uint32MapField.JsonOutput
|
||||
JsonInput.Uint32MapField.ProtobufOutput
|
||||
JsonInput.Uint64FieldBeString.Validator
|
||||
JsonInput.Uint64FieldMaxValue.JsonOutput
|
||||
JsonInput.Uint64FieldMaxValue.ProtobufOutput
|
||||
JsonInput.Uint64MapField.JsonOutput
|
||||
JsonInput.Uint64MapField.ProtobufOutput
|
||||
JsonInput.ValueAcceptBool.JsonOutput
|
||||
JsonInput.ValueAcceptBool.ProtobufOutput
|
||||
JsonInput.ValueAcceptFloat.JsonOutput
|
||||
JsonInput.ValueAcceptFloat.ProtobufOutput
|
||||
JsonInput.ValueAcceptInteger.JsonOutput
|
||||
JsonInput.ValueAcceptInteger.ProtobufOutput
|
||||
JsonInput.ValueAcceptList.JsonOutput
|
||||
JsonInput.ValueAcceptList.ProtobufOutput
|
||||
JsonInput.ValueAcceptNull.JsonOutput
|
||||
JsonInput.ValueAcceptNull.ProtobufOutput
|
||||
JsonInput.ValueAcceptObject.JsonOutput
|
||||
JsonInput.ValueAcceptObject.ProtobufOutput
|
||||
JsonInput.ValueAcceptString.JsonOutput
|
||||
JsonInput.ValueAcceptString.ProtobufOutput
|
||||
ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
|
||||
ProtobufInput.DoubleFieldNormalizeSignalingNan.JsonOutput
|
||||
ProtobufInput.FloatFieldNormalizeQuietNan.JsonOutput
|
||||
ProtobufInput.FloatFieldNormalizeSignalingNan.JsonOutput
|
||||
TimestampProtoInputTooLarge.JsonOutput
|
||||
TimestampProtoInputTooSmall.JsonOutput
|
||||
Recommended.FieldMaskNumbersDontRoundTrip.JsonOutput
|
||||
Recommended.FieldMaskPathsDontRoundTrip.JsonOutput
|
||||
Recommended.FieldMaskTooManyUnderscore.JsonOutput
|
||||
Recommended.JsonInput.BoolFieldIntegerOne
|
||||
Recommended.JsonInput.BoolFieldIntegerZero
|
||||
Recommended.JsonInput.DurationHas3FractionalDigits.Validator
|
||||
Recommended.JsonInput.DurationHas6FractionalDigits.Validator
|
||||
Recommended.JsonInput.DurationHas9FractionalDigits.Validator
|
||||
Recommended.JsonInput.DurationHasZeroFractionalDigit.Validator
|
||||
Recommended.JsonInput.Int64FieldBeString.Validator
|
||||
Recommended.JsonInput.OneofZeroDouble.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroDouble.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroFloat.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroFloat.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroUint32.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroUint32.ProtobufOutput
|
||||
Recommended.JsonInput.OneofZeroUint64.JsonOutput
|
||||
Recommended.JsonInput.OneofZeroUint64.ProtobufOutput
|
||||
Recommended.JsonInput.StringEndsWithEscapeChar
|
||||
Recommended.JsonInput.StringFieldSurrogateInWrongOrder
|
||||
Recommended.JsonInput.StringFieldUnpairedHighSurrogate
|
||||
Recommended.JsonInput.StringFieldUnpairedLowSurrogate
|
||||
Recommended.JsonInput.TimestampHas3FractionalDigits.Validator
|
||||
Recommended.JsonInput.TimestampHas6FractionalDigits.Validator
|
||||
Recommended.JsonInput.TimestampHas9FractionalDigits.Validator
|
||||
Recommended.JsonInput.TimestampHasZeroFractionalDigit.Validator
|
||||
Recommended.JsonInput.TimestampZeroNormalized.Validator
|
||||
Recommended.JsonInput.Uint64FieldBeString.Validator
|
||||
Required.DurationProtoInputTooLarge.JsonOutput
|
||||
Required.DurationProtoInputTooSmall.JsonOutput
|
||||
Required.JsonInput.Any.JsonOutput
|
||||
Required.JsonInput.Any.ProtobufOutput
|
||||
Required.JsonInput.AnyNested.JsonOutput
|
||||
Required.JsonInput.AnyNested.ProtobufOutput
|
||||
Required.JsonInput.AnyUnorderedTypeTag.JsonOutput
|
||||
Required.JsonInput.AnyUnorderedTypeTag.ProtobufOutput
|
||||
Required.JsonInput.AnyWithDuration.JsonOutput
|
||||
Required.JsonInput.AnyWithDuration.ProtobufOutput
|
||||
Required.JsonInput.AnyWithFieldMask.JsonOutput
|
||||
Required.JsonInput.AnyWithFieldMask.ProtobufOutput
|
||||
Required.JsonInput.AnyWithInt32ValueWrapper.JsonOutput
|
||||
Required.JsonInput.AnyWithInt32ValueWrapper.ProtobufOutput
|
||||
Required.JsonInput.AnyWithStruct.JsonOutput
|
||||
Required.JsonInput.AnyWithStruct.ProtobufOutput
|
||||
Required.JsonInput.AnyWithTimestamp.JsonOutput
|
||||
Required.JsonInput.AnyWithTimestamp.ProtobufOutput
|
||||
Required.JsonInput.AnyWithValueForInteger.JsonOutput
|
||||
Required.JsonInput.AnyWithValueForInteger.ProtobufOutput
|
||||
Required.JsonInput.AnyWithValueForJsonObject.JsonOutput
|
||||
Required.JsonInput.AnyWithValueForJsonObject.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldInfinity.JsonOutput
|
||||
Required.JsonInput.DoubleFieldInfinity.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMaxPositiveValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMaxPositiveValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMinNegativeValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMinNegativeValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldMinPositiveValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldMinPositiveValue.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldNan.JsonOutput
|
||||
Required.JsonInput.DoubleFieldNan.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldNegativeInfinity.JsonOutput
|
||||
Required.JsonInput.DoubleFieldNegativeInfinity.ProtobufOutput
|
||||
Required.JsonInput.DoubleFieldQuotedValue.JsonOutput
|
||||
Required.JsonInput.DoubleFieldQuotedValue.ProtobufOutput
|
||||
Required.JsonInput.DurationMaxValue.JsonOutput
|
||||
Required.JsonInput.DurationMaxValue.ProtobufOutput
|
||||
Required.JsonInput.DurationMinValue.JsonOutput
|
||||
Required.JsonInput.DurationMinValue.ProtobufOutput
|
||||
Required.JsonInput.DurationRepeatedValue.JsonOutput
|
||||
Required.JsonInput.DurationRepeatedValue.ProtobufOutput
|
||||
Required.JsonInput.EnumFieldNumericValueNonZero.JsonOutput
|
||||
Required.JsonInput.EnumFieldNumericValueNonZero.ProtobufOutput
|
||||
Required.JsonInput.EnumFieldNumericValueZero.JsonOutput
|
||||
Required.JsonInput.EnumFieldNumericValueZero.ProtobufOutput
|
||||
Required.JsonInput.EnumFieldUnknownValue.Validator
|
||||
Required.JsonInput.FieldMask.JsonOutput
|
||||
Required.JsonInput.FieldMask.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldInfinity.JsonOutput
|
||||
Required.JsonInput.FloatFieldInfinity.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldNan.JsonOutput
|
||||
Required.JsonInput.FloatFieldNan.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldNegativeInfinity.JsonOutput
|
||||
Required.JsonInput.FloatFieldNegativeInfinity.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldQuotedValue.JsonOutput
|
||||
Required.JsonInput.FloatFieldQuotedValue.ProtobufOutput
|
||||
Required.JsonInput.FloatFieldTooLarge
|
||||
Required.JsonInput.FloatFieldTooSmall
|
||||
Required.JsonInput.Int32FieldExponentialFormat.JsonOutput
|
||||
Required.JsonInput.Int32FieldExponentialFormat.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldFloatTrailingZero.JsonOutput
|
||||
Required.JsonInput.Int32FieldFloatTrailingZero.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldMaxFloatValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldMaxFloatValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldMinFloatValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldMinFloatValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldStringValue.JsonOutput
|
||||
Required.JsonInput.Int32FieldStringValue.ProtobufOutput
|
||||
Required.JsonInput.Int32FieldStringValueEscaped.JsonOutput
|
||||
Required.JsonInput.Int32FieldStringValueEscaped.ProtobufOutput
|
||||
Required.JsonInput.Int32MapEscapedKey.JsonOutput
|
||||
Required.JsonInput.Int32MapEscapedKey.ProtobufOutput
|
||||
Required.JsonInput.Int32MapField.JsonOutput
|
||||
Required.JsonInput.Int32MapField.ProtobufOutput
|
||||
Required.JsonInput.Int64FieldMaxValue.JsonOutput
|
||||
Required.JsonInput.Int64FieldMaxValue.ProtobufOutput
|
||||
Required.JsonInput.Int64FieldMinValue.JsonOutput
|
||||
Required.JsonInput.Int64FieldMinValue.ProtobufOutput
|
||||
Required.JsonInput.Int64MapEscapedKey.JsonOutput
|
||||
Required.JsonInput.Int64MapEscapedKey.ProtobufOutput
|
||||
Required.JsonInput.Int64MapField.JsonOutput
|
||||
Required.JsonInput.Int64MapField.ProtobufOutput
|
||||
Required.JsonInput.MessageField.JsonOutput
|
||||
Required.JsonInput.MessageField.ProtobufOutput
|
||||
Required.JsonInput.MessageMapField.JsonOutput
|
||||
Required.JsonInput.MessageMapField.ProtobufOutput
|
||||
Required.JsonInput.MessageRepeatedField.JsonOutput
|
||||
Required.JsonInput.MessageRepeatedField.ProtobufOutput
|
||||
Required.JsonInput.OptionalBoolWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalBoolWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalBytesWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalBytesWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalDoubleWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalDoubleWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalFloatWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalFloatWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalInt32Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalInt32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalInt64Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalInt64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalStringWrapper.JsonOutput
|
||||
Required.JsonInput.OptionalStringWrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalUint32Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalUint32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalUint64Wrapper.JsonOutput
|
||||
Required.JsonInput.OptionalUint64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.OptionalWrapperTypesWithNonDefaultValue.JsonOutput
|
||||
Required.JsonInput.OptionalWrapperTypesWithNonDefaultValue.ProtobufOutput
|
||||
Required.JsonInput.PrimitiveRepeatedField.JsonOutput
|
||||
Required.JsonInput.PrimitiveRepeatedField.ProtobufOutput
|
||||
Required.JsonInput.RepeatedBoolWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedBoolWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedBytesWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedBytesWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedDoubleWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedDoubleWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
|
||||
Required.JsonInput.RepeatedFloatWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedFloatWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedInt32Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedInt32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedInt64Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedInt64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedStringWrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedStringWrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedUint32Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedUint32Wrapper.ProtobufOutput
|
||||
Required.JsonInput.RepeatedUint64Wrapper.JsonOutput
|
||||
Required.JsonInput.RepeatedUint64Wrapper.ProtobufOutput
|
||||
Required.JsonInput.StringFieldNotAString
|
||||
Required.JsonInput.StringFieldSurrogatePair.JsonOutput
|
||||
Required.JsonInput.StringFieldSurrogatePair.ProtobufOutput
|
||||
Required.JsonInput.Struct.JsonOutput
|
||||
Required.JsonInput.Struct.ProtobufOutput
|
||||
Required.JsonInput.TimestampMaxValue.JsonOutput
|
||||
Required.JsonInput.TimestampMaxValue.ProtobufOutput
|
||||
Required.JsonInput.TimestampMinValue.JsonOutput
|
||||
Required.JsonInput.TimestampMinValue.ProtobufOutput
|
||||
Required.JsonInput.TimestampRepeatedValue.JsonOutput
|
||||
Required.JsonInput.TimestampRepeatedValue.ProtobufOutput
|
||||
Required.JsonInput.TimestampWithNegativeOffset.JsonOutput
|
||||
Required.JsonInput.TimestampWithNegativeOffset.ProtobufOutput
|
||||
Required.JsonInput.TimestampWithPositiveOffset.JsonOutput
|
||||
Required.JsonInput.TimestampWithPositiveOffset.ProtobufOutput
|
||||
Required.JsonInput.Uint32FieldMaxFloatValue.JsonOutput
|
||||
Required.JsonInput.Uint32FieldMaxFloatValue.ProtobufOutput
|
||||
Required.JsonInput.Uint32MapField.JsonOutput
|
||||
Required.JsonInput.Uint32MapField.ProtobufOutput
|
||||
Required.JsonInput.Uint64FieldMaxValue.JsonOutput
|
||||
Required.JsonInput.Uint64FieldMaxValue.ProtobufOutput
|
||||
Required.JsonInput.Uint64MapField.JsonOutput
|
||||
Required.JsonInput.Uint64MapField.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptBool.JsonOutput
|
||||
Required.JsonInput.ValueAcceptBool.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptFloat.JsonOutput
|
||||
Required.JsonInput.ValueAcceptFloat.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptInteger.JsonOutput
|
||||
Required.JsonInput.ValueAcceptInteger.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptList.JsonOutput
|
||||
Required.JsonInput.ValueAcceptList.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptNull.JsonOutput
|
||||
Required.JsonInput.ValueAcceptNull.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptObject.JsonOutput
|
||||
Required.JsonInput.ValueAcceptObject.ProtobufOutput
|
||||
Required.JsonInput.ValueAcceptString.JsonOutput
|
||||
Required.JsonInput.ValueAcceptString.ProtobufOutput
|
||||
Required.ProtobufInput.DoubleFieldNormalizeQuietNan.JsonOutput
|
||||
Required.ProtobufInput.DoubleFieldNormalizeSignalingNan.JsonOutput
|
||||
Required.ProtobufInput.FloatFieldNormalizeQuietNan.JsonOutput
|
||||
Required.ProtobufInput.FloatFieldNormalizeSignalingNan.JsonOutput
|
||||
Required.TimestampProtoInputTooLarge.JsonOutput
|
||||
Required.TimestampProtoInputTooSmall.JsonOutput
|
||||
|
|
|
@ -57,7 +57,7 @@ for remove_file in (args.remove_list or []):
|
|||
with open(remove_file) as f:
|
||||
for line in f:
|
||||
if line in add_set:
|
||||
raise "Asked to both add and remove test: " + line
|
||||
raise Exception("Asked to both add and remove test: " + line)
|
||||
remove_set.add(line.strip())
|
||||
|
||||
add_list = sorted(add_set, reverse=True)
|
||||
|
|
21
csharp/.gitignore
vendored
21
csharp/.gitignore
vendored
|
@ -1,16 +1,10 @@
|
|||
#
|
||||
# Untracked directories
|
||||
#
|
||||
src/AddressBook/bin
|
||||
src/AddressBook/obj
|
||||
src/Google.Protobuf/bin/
|
||||
src/Google.Protobuf/obj/
|
||||
src/Google.Protobuf.Conformance/bin/
|
||||
src/Google.Protobuf.Conformance/obj/
|
||||
src/Google.Protobuf.Test/bin/
|
||||
src/Google.Protobuf.Test/obj/
|
||||
src/Google.Protobuf.JsonDump/bin/
|
||||
src/Google.Protobuf.JsonDump/obj/
|
||||
# Output
|
||||
bin
|
||||
obj
|
||||
project.lock.json
|
||||
TestResult.xml
|
||||
|
||||
# Possibly legacy now?
|
||||
mono/bin
|
||||
mono/tmp
|
||||
mono/protoc
|
||||
|
@ -23,6 +17,7 @@ lib/NUnit
|
|||
#
|
||||
# Untracked files
|
||||
#
|
||||
.vs
|
||||
*.user
|
||||
*.suo
|
||||
*.nupkg
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<title>Google Protocol Buffers tools</title>
|
||||
<summary>Tools for Protocol Buffers - Google's data interchange format.</summary>
|
||||
<description>See project site for more info.</description>
|
||||
<version>3.0.0-beta3</version>
|
||||
<version>3.3.0</version>
|
||||
<authors>Google Inc.</authors>
|
||||
<owners>protobuf-packages</owners>
|
||||
<licenseUrl>https://github.com/google/protobuf/blob/master/LICENSE</licenseUrl>
|
||||
|
|
|
@ -1,16 +1,13 @@
|
|||
This directory contains the C# Protocol Buffers runtime library.
|
||||
|
||||
Status: Beta - ready for external testing
|
||||
=========================================
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
The easiest way how to use C# protobufs is via the `Google.Protobuf`
|
||||
NuGet package. Just add the NuGet package to your VS project.
|
||||
|
||||
Besides C# runtime library, the NuGet package also contains
|
||||
precompiled version of `protoc.exe` and a copy of well known `.proto`
|
||||
You will also want to install the `Google.Protobuf.Tools` NuGet package, which
|
||||
contains precompiled version of `protoc.exe` and a copy of well known `.proto`
|
||||
files under the package's `tools` directory.
|
||||
|
||||
To generate C# files from your `.proto` files, invoke `protoc` with the
|
||||
|
@ -35,8 +32,7 @@ Building
|
|||
========
|
||||
|
||||
Open the `src/Google.Protobuf.sln` solution in Visual Studio 2015 or
|
||||
later. You should be able to run the NUnit test from Test Explorer
|
||||
(you might need to install NUnit Visual Studio add-in).
|
||||
later.
|
||||
|
||||
Although *users* of this project are only expected to have Visual
|
||||
Studio 2012 or later, *developers* of the library are required to
|
||||
|
@ -45,6 +41,57 @@ in its implementation. These features have no impact when using the
|
|||
compiled code - they're only relevant when building the
|
||||
`Google.Protobuf` assembly.
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
The unit tests use [NUnit 3](https://github.com/nunit/nunit). Vanilla NUnit doesn't
|
||||
support .NET Core, so to run the tests you'll need to use
|
||||
[dotnet-test-nunit](https://github.com/nunit/dotnet-test-nunit).
|
||||
`dotnet-test-nunit` can also run tests for .NET 4.5+, so to run the tests
|
||||
for both .NET Core and .NET 4.5, you can simply open the
|
||||
`Package Manager Console` in Visual Studio and execute:
|
||||
```
|
||||
dotnet test Google.Protobuf.Test
|
||||
```
|
||||
|
||||
.NET 3.5
|
||||
========
|
||||
|
||||
We don't officially support .NET 3.5. However, there has been some effort
|
||||
to make enabling .NET 3.5 support relatively painless in case you require it.
|
||||
There's no guarantee that this will continue in the future, so rely on .NET
|
||||
3.5 support at your peril.
|
||||
|
||||
To enable .NET 3.5 support:
|
||||
|
||||
1. Modify [src/Google.Protobuf/project.json](src/Google.Protobuf/project.json) to add `"net35": {}` to `"frameworks"`.
|
||||
2. Modify [src/Google.Protobuf.Test/project.json](src/Google.Protobuf/project.json):
|
||||
1. Add `"net35": {}` to `"frameworks"`.
|
||||
2. `dotnet-test-nunit` doesn't support .NET 3.5, so remove it from
|
||||
the project-wide `"dependencies"` and add it to the framework-specific
|
||||
dependencies under `"net451"` and `"netcoreapp1.0"`.
|
||||
|
||||
Note that `dotnet-test-nunit` doesn't support .NET 3.5. You can instead run the
|
||||
tests with [NUnit 3 console](https://github.com/nunit/nunit-console)
|
||||
by running something like:
|
||||
```
|
||||
nunit3-console.exe "Google.Protobuf.Test\bin\Debug\net35\win7-x64\Google.Protobuf.Test.dll" --inprocess
|
||||
```
|
||||
|
||||
The exact path may differ depending on your environment (e.g., the `win7-x64`
|
||||
directory may be called something else). The `--inprocess` flag seems to be a
|
||||
necessary workaround for a bug in NUnit; otherwise, you'll receive
|
||||
an error "Exception has been thrown by the target of an invocation"
|
||||
([possibly related issue](https://github.com/nunit/nunit/issues/1480)).
|
||||
|
||||
If you still want to run the .NET 4.5 and .NET Core tests, you can do so by
|
||||
specifying the framework when using `dotnet-test-nunit`, i.e. from
|
||||
`Package Manager Console` in Visual Studio:
|
||||
```
|
||||
dotnet test Google.Protobuf.Test --framework netcoreapp1.0
|
||||
dotnet test Google.Protobuf.Test --framework net451
|
||||
```
|
||||
|
||||
History of C# protobufs
|
||||
=======================
|
||||
|
||||
|
|
|
@ -1,10 +1,7 @@
|
|||
@rem Builds Google.Protobuf NuGet packages
|
||||
|
||||
@rem Adjust the location of nuget.exe
|
||||
set NUGET=C:\nuget\nuget.exe
|
||||
|
||||
@rem Build src/Google.Protobuf.sln solution in Release configuration first.
|
||||
%NUGET% pack src\Google.Protobuf\Google.Protobuf.nuspec -Symbols || goto :error
|
||||
dotnet restore src
|
||||
dotnet pack -c Release src\Google.Protobuf || goto :error
|
||||
|
||||
goto :EOF
|
||||
|
||||
|
|
52
csharp/build_tools.sh
Executable file
52
csharp/build_tools.sh
Executable file
|
@ -0,0 +1,52 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ $# -ne 1 ]; then
|
||||
cat <<EOF
|
||||
Usage: $0 <VERSION_NUMBER>
|
||||
|
||||
Example:
|
||||
$ $0 3.0.0
|
||||
|
||||
This script will download pre-built protoc binaries from maven repository and
|
||||
create the Google.Protobuf.Tools package. Well-known type .proto files will also
|
||||
be included.
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
|
||||
VERSION_NUMBER=$1
|
||||
# <directory name> <binary file name> pairs.
|
||||
declare -a FILE_NAMES=( \
|
||||
windows_x86 windows-x86_32.exe \
|
||||
windows_x64 windows-x86_64.exe \
|
||||
macosx_x86 osx-x86_32.exe \
|
||||
macosx_x64 osx-x86_64.exe \
|
||||
linux_x86 linux-x86_32.exe \
|
||||
linux_x64 linux-x86_64.exe \
|
||||
)
|
||||
|
||||
set -e
|
||||
|
||||
mkdir -p protoc
|
||||
# Create a zip file for each binary.
|
||||
for((i=0;i<${#FILE_NAMES[@]};i+=2));do
|
||||
DIR_NAME=${FILE_NAMES[$i]}
|
||||
mkdir -p protoc/$DIR_NAME
|
||||
|
||||
if [ ${DIR_NAME:0:3} = "win" ]; then
|
||||
TARGET_BINARY="protoc.exe"
|
||||
else
|
||||
TARGET_BINARY="protoc"
|
||||
fi
|
||||
|
||||
BINARY_NAME=${FILE_NAMES[$(($i+1))]}
|
||||
BINARY_URL=http://repo1.maven.org/maven2/com/google/protobuf/protoc/${VERSION_NUMBER}/protoc-${VERSION_NUMBER}-${BINARY_NAME}
|
||||
|
||||
if ! wget ${BINARY_URL} -O protoc/$DIR_NAME/$TARGET_BINARY &> /dev/null; then
|
||||
echo "[ERROR] Failed to download ${BINARY_URL}" >&2
|
||||
echo "[ERROR] Skipped $protoc-${VERSION_NAME}-${DIR_NAME}" >&2
|
||||
continue
|
||||
fi
|
||||
done
|
||||
|
||||
nuget pack Google.Protobuf.Tools.nuspec
|
|
@ -1,17 +1,16 @@
|
|||
#!/bin/bash
|
||||
# Use mono to build solution and run all tests.
|
||||
|
||||
# Adjust these to reflect the location of nunit-console in your system.
|
||||
NUNIT_CONSOLE=nunit-console
|
||||
|
||||
# The rest you can leave intact
|
||||
CONFIG=Release
|
||||
SRC=$(dirname $0)/src
|
||||
|
||||
set -ex
|
||||
|
||||
echo Building the solution.
|
||||
xbuild /p:Configuration=$CONFIG $SRC/Google.Protobuf.sln
|
||||
echo Building relevant projects.
|
||||
dotnet build -c $CONFIG $SRC/Google.Protobuf $SRC/Google.Protobuf.Test $SRC/Google.Protobuf.Conformance
|
||||
|
||||
echo Running tests.
|
||||
$NUNIT_CONSOLE $SRC/Google.Protobuf.Test/bin/$CONFIG/Google.Protobuf.Test.dll
|
||||
# Only test netcoreapp1.0, which uses the .NET Core runtime.
|
||||
# If we want to test the .NET 4.5 version separately, we could
|
||||
# run Mono explicitly. However, we don't have any differences between
|
||||
# the .NET 4.5 and netstandard1.0 assemblies.
|
||||
dotnet test -c $CONFIG -f netcoreapp1.0 $SRC/Google.Protobuf.Test
|
||||
|
|
|
@ -0,0 +1,126 @@
|
|||
syntax = "proto3";
|
||||
|
||||
// These proto descriptors have at one time been reported as an issue or defect.
|
||||
// They are kept here to replicate the issue, and continue to verify the fix.
|
||||
|
||||
// Issue: Non-"Google.Protobuffers" namespace will ensure that protobuffer library types are qualified
|
||||
option csharp_namespace = "UnitTest.Issues.TestProtos";
|
||||
|
||||
package unittest_issues;
|
||||
option optimize_for = SPEED;
|
||||
|
||||
// Issue 307: when generating doubly-nested types, any references
|
||||
// should be of the form A.Types.B.Types.C.
|
||||
message Issue307 {
|
||||
message NestedOnce {
|
||||
message NestedTwice {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Old issue 13: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=13
|
||||
// New issue 309: https://github.com/google/protobuf/issues/309
|
||||
|
||||
// message A {
|
||||
// optional int32 _A = 1;
|
||||
// }
|
||||
|
||||
// message B {
|
||||
// optional int32 B_ = 1;
|
||||
// }
|
||||
|
||||
//message AB {
|
||||
// optional int32 a_b = 1;
|
||||
//}
|
||||
|
||||
// Similar issue with numeric names
|
||||
// Java code failed too, so probably best for this to be a restriction.
|
||||
// See https://github.com/google/protobuf/issues/308
|
||||
// message NumberField {
|
||||
// optional int32 _01 = 1;
|
||||
// }
|
||||
|
||||
// issue 19 - negative enum values
|
||||
|
||||
enum NegativeEnum {
|
||||
NEGATIVE_ENUM_ZERO = 0;
|
||||
FiveBelow = -5;
|
||||
MinusOne = -1;
|
||||
}
|
||||
|
||||
message NegativeEnumMessage {
|
||||
NegativeEnum value = 1;
|
||||
repeated NegativeEnum values = 2 [packed = false];
|
||||
repeated NegativeEnum packed_values = 3 [packed=true];
|
||||
}
|
||||
|
||||
// Issue 21: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=21
|
||||
// Decorate fields with [deprecated=true] as [System.Obsolete]
|
||||
|
||||
message DeprecatedChild {
|
||||
}
|
||||
|
||||
enum DeprecatedEnum {
|
||||
DEPRECATED_ZERO = 0;
|
||||
one = 1;
|
||||
}
|
||||
|
||||
message DeprecatedFieldsMessage {
|
||||
int32 PrimitiveValue = 1 [deprecated = true];
|
||||
repeated int32 PrimitiveArray = 2 [deprecated = true];
|
||||
|
||||
DeprecatedChild MessageValue = 3 [deprecated = true];
|
||||
repeated DeprecatedChild MessageArray = 4 [deprecated = true];
|
||||
|
||||
DeprecatedEnum EnumValue = 5 [deprecated = true];
|
||||
repeated DeprecatedEnum EnumArray = 6 [deprecated = true];
|
||||
}
|
||||
|
||||
// Issue 45: http://code.google.com/p/protobuf-csharp-port/issues/detail?id=45
|
||||
message ItemField {
|
||||
int32 item = 1;
|
||||
}
|
||||
|
||||
message ReservedNames {
|
||||
// Force a nested type called Types
|
||||
message SomeNestedType {
|
||||
}
|
||||
|
||||
int32 types = 1;
|
||||
int32 descriptor = 2;
|
||||
}
|
||||
|
||||
message TestJsonFieldOrdering {
|
||||
// These fields are deliberately not declared in numeric
|
||||
// order, and the oneof fields aren't contiguous either.
|
||||
// This allows for reasonably robust tests of JSON output
|
||||
// ordering.
|
||||
// TestFieldOrderings in unittest_proto3.proto is similar,
|
||||
// but doesn't include oneofs.
|
||||
// TODO: Consider adding oneofs to TestFieldOrderings, although
|
||||
// that will require fixing other tests in multiple platforms.
|
||||
// Alternatively, consider just adding this to
|
||||
// unittest_proto3.proto if multiple platforms want it.
|
||||
|
||||
int32 plain_int32 = 4;
|
||||
|
||||
oneof o1 {
|
||||
string o1_string = 2;
|
||||
int32 o1_int32 = 5;
|
||||
}
|
||||
|
||||
string plain_string = 1;
|
||||
|
||||
oneof o2 {
|
||||
int32 o2_int32 = 6;
|
||||
string o2_string = 3;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
message TestJsonName {
|
||||
// Message for testing the effects for of the json_name option
|
||||
string name = 1;
|
||||
string description = 2 [json_name = "desc"];
|
||||
string guid = 3 [json_name = "exid"];
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// This file is mostly equivalent to map_unittest.proto, but imports
|
||||
// unittest_proto3.proto instead of unittest.proto, so that it only
|
||||
// uses proto3 messages. This makes it suitable for testing
|
||||
// implementations which only support proto3.
|
||||
// The TestRequiredMessageMap message has been removed as there are no
|
||||
// required fields in proto3.
|
||||
syntax = "proto3";
|
||||
|
||||
option cc_enable_arenas = true;
|
||||
option csharp_namespace = "Google.Protobuf.TestProtos";
|
||||
|
||||
import "google/protobuf/unittest_proto3.proto";
|
||||
|
||||
// We don't put this in a package within proto2 because we need to make sure
|
||||
// that the generated code doesn't depend on being in the proto2 namespace.
|
||||
// In map_test_util.h we do "using namespace unittest = protobuf_unittest".
|
||||
package protobuf_unittest;
|
||||
|
||||
// Tests maps.
|
||||
message TestMap {
|
||||
map<int32 , int32 > map_int32_int32 = 1;
|
||||
map<int64 , int64 > map_int64_int64 = 2;
|
||||
map<uint32 , uint32 > map_uint32_uint32 = 3;
|
||||
map<uint64 , uint64 > map_uint64_uint64 = 4;
|
||||
map<sint32 , sint32 > map_sint32_sint32 = 5;
|
||||
map<sint64 , sint64 > map_sint64_sint64 = 6;
|
||||
map<fixed32 , fixed32 > map_fixed32_fixed32 = 7;
|
||||
map<fixed64 , fixed64 > map_fixed64_fixed64 = 8;
|
||||
map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 9;
|
||||
map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 10;
|
||||
map<int32 , float > map_int32_float = 11;
|
||||
map<int32 , double > map_int32_double = 12;
|
||||
map<bool , bool > map_bool_bool = 13;
|
||||
map<string , string > map_string_string = 14;
|
||||
map<int32 , bytes > map_int32_bytes = 15;
|
||||
map<int32 , MapEnum > map_int32_enum = 16;
|
||||
map<int32 , ForeignMessage> map_int32_foreign_message = 17;
|
||||
}
|
||||
|
||||
message TestMapSubmessage {
|
||||
TestMap test_map = 1;
|
||||
}
|
||||
|
||||
message TestMessageMap {
|
||||
map<int32, TestAllTypes> map_int32_message = 1;
|
||||
}
|
||||
|
||||
// Two map fields share the same entry default instance.
|
||||
message TestSameTypeMap {
|
||||
map<int32, int32> map1 = 1;
|
||||
map<int32, int32> map2 = 2;
|
||||
}
|
||||
|
||||
enum MapEnum {
|
||||
MAP_ENUM_FOO = 0;
|
||||
MAP_ENUM_BAR = 1;
|
||||
MAP_ENUM_BAZ = 2;
|
||||
}
|
||||
|
||||
message TestArenaMap {
|
||||
map<int32 , int32 > map_int32_int32 = 1;
|
||||
map<int64 , int64 > map_int64_int64 = 2;
|
||||
map<uint32 , uint32 > map_uint32_uint32 = 3;
|
||||
map<uint64 , uint64 > map_uint64_uint64 = 4;
|
||||
map<sint32 , sint32 > map_sint32_sint32 = 5;
|
||||
map<sint64 , sint64 > map_sint64_sint64 = 6;
|
||||
map<fixed32 , fixed32 > map_fixed32_fixed32 = 7;
|
||||
map<fixed64 , fixed64 > map_fixed64_fixed64 = 8;
|
||||
map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 9;
|
||||
map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 10;
|
||||
map<int32 , float > map_int32_float = 11;
|
||||
map<int32 , double > map_int32_double = 12;
|
||||
map<bool , bool > map_bool_bool = 13;
|
||||
map<int32 , MapEnum > map_int32_enum = 14;
|
||||
map<int32 , ForeignMessage> map_int32_foreign_message = 15;
|
||||
}
|
||||
|
||||
// Previously, message containing enum called Type cannot be used as value of
|
||||
// map field.
|
||||
message MessageContainingEnumCalledType {
|
||||
enum Type {
|
||||
TYPE_FOO = 0;
|
||||
}
|
||||
map<int32, MessageContainingEnumCalledType> type = 1;
|
||||
}
|
||||
|
||||
// Previously, message cannot contain map field called "entry".
|
||||
message MessageContainingMapCalledEntry {
|
||||
map<int32, int32> entry = 1;
|
||||
}
|
|
@ -0,0 +1,68 @@
|
|||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Author: kenton@google.com (Kenton Varda)
|
||||
// Based on original Protocol Buffers design by
|
||||
// Sanjay Ghemawat, Jeff Dean, and others.
|
||||
//
|
||||
// A proto file which is imported by unittest_proto3.proto to test importing.
|
||||
|
||||
syntax = "proto3";
|
||||
|
||||
// We don't put this in a package within proto2 because we need to make sure
|
||||
// that the generated code doesn't depend on being in the proto2 namespace.
|
||||
// In test_util.h we do
|
||||
// "using namespace unittest_import = protobuf_unittest_import".
|
||||
package protobuf_unittest_import;
|
||||
|
||||
option optimize_for = SPEED;
|
||||
option cc_enable_arenas = true;
|
||||
|
||||
// Exercise the java_package option.
|
||||
option java_package = "com.google.protobuf.test";
|
||||
option csharp_namespace = "Google.Protobuf.TestProtos";
|
||||
|
||||
// Do not set a java_outer_classname here to verify that Proto2 works without
|
||||
// one.
|
||||
|
||||
// Test public import
|
||||
import public "google/protobuf/unittest_import_public_proto3.proto";
|
||||
|
||||
message ImportMessage {
|
||||
int32 d = 1;
|
||||
}
|
||||
|
||||
enum ImportEnum {
|
||||
IMPORT_ENUM_UNSPECIFIED = 0;
|
||||
IMPORT_FOO = 7;
|
||||
IMPORT_BAR = 8;
|
||||
IMPORT_BAZ = 9;
|
||||
}
|
||||
|
|
@ -28,18 +28,15 @@
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Negative compilation test for arena usage.
|
||||
// Author: liujisi@google.com (Pherl Liu)
|
||||
|
||||
#include <google/protobuf/arena.h>
|
||||
#include <google/protobuf/unittest.pb.h>
|
||||
syntax = "proto3";
|
||||
|
||||
#ifdef TEST_ARENA_PRIVATE_CONSTRUCTOR
|
||||
package protobuf_unittest_import;
|
||||
|
||||
namespace google {
|
||||
void ArenaPrivateConstructor() {
|
||||
google::protobuf::Arena arena;
|
||||
protobuf_unittest::TestAllTypes message(&arena);
|
||||
option java_package = "com.google.protobuf.test";
|
||||
option csharp_namespace = "Google.Protobuf.TestProtos";
|
||||
|
||||
message PublicImportMessage {
|
||||
int32 e = 1;
|
||||
}
|
||||
|
||||
#endif
|
||||
} // namespace google
|
|
@ -0,0 +1,388 @@
|
|||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Author: kenton@google.com (Kenton Varda)
|
||||
// Based on original Protocol Buffers design by
|
||||
// Sanjay Ghemawat, Jeff Dean, and others.
|
||||
//
|
||||
// A proto file we will use for unit testing.
|
||||
|
||||
syntax = "proto3";
|
||||
|
||||
// Some generic_services option(s) added automatically.
|
||||
// See: http://go/proto2-generic-services-default
|
||||
option cc_generic_services = true; // auto-added
|
||||
option java_generic_services = true; // auto-added
|
||||
option py_generic_services = true; // auto-added
|
||||
option cc_enable_arenas = true;
|
||||
option csharp_namespace = "Google.Protobuf.TestProtos";
|
||||
|
||||
import "google/protobuf/unittest_import_proto3.proto";
|
||||
|
||||
// We don't put this in a package within proto2 because we need to make sure
|
||||
// that the generated code doesn't depend on being in the proto2 namespace.
|
||||
// In test_util.h we do "using namespace unittest = protobuf_unittest".
|
||||
package protobuf_unittest;
|
||||
|
||||
// Protos optimized for SPEED use a strict superset of the generated code
|
||||
// of equivalent ones optimized for CODE_SIZE, so we should optimize all our
|
||||
// tests for speed unless explicitly testing code size optimization.
|
||||
option optimize_for = SPEED;
|
||||
|
||||
option java_outer_classname = "UnittestProto";
|
||||
|
||||
// This proto includes every type of field in both singular and repeated
|
||||
// forms.
|
||||
message TestAllTypes {
|
||||
message NestedMessage {
|
||||
// The field name "b" fails to compile in proto1 because it conflicts with
|
||||
// a local variable named "b" in one of the generated methods. Doh.
|
||||
// This file needs to compile in proto1 to test backwards-compatibility.
|
||||
int32 bb = 1;
|
||||
}
|
||||
|
||||
enum NestedEnum {
|
||||
NESTED_ENUM_UNSPECIFIED = 0;
|
||||
FOO = 1;
|
||||
BAR = 2;
|
||||
BAZ = 3;
|
||||
NEG = -1; // Intentionally negative.
|
||||
}
|
||||
|
||||
// Singular
|
||||
int32 single_int32 = 1;
|
||||
int64 single_int64 = 2;
|
||||
uint32 single_uint32 = 3;
|
||||
uint64 single_uint64 = 4;
|
||||
sint32 single_sint32 = 5;
|
||||
sint64 single_sint64 = 6;
|
||||
fixed32 single_fixed32 = 7;
|
||||
fixed64 single_fixed64 = 8;
|
||||
sfixed32 single_sfixed32 = 9;
|
||||
sfixed64 single_sfixed64 = 10;
|
||||
float single_float = 11;
|
||||
double single_double = 12;
|
||||
bool single_bool = 13;
|
||||
string single_string = 14;
|
||||
bytes single_bytes = 15;
|
||||
|
||||
NestedMessage single_nested_message = 18;
|
||||
ForeignMessage single_foreign_message = 19;
|
||||
protobuf_unittest_import.ImportMessage single_import_message = 20;
|
||||
|
||||
NestedEnum single_nested_enum = 21;
|
||||
ForeignEnum single_foreign_enum = 22;
|
||||
protobuf_unittest_import.ImportEnum single_import_enum = 23;
|
||||
|
||||
// Defined in unittest_import_public.proto
|
||||
protobuf_unittest_import.PublicImportMessage
|
||||
single_public_import_message = 26;
|
||||
|
||||
// Repeated
|
||||
repeated int32 repeated_int32 = 31;
|
||||
repeated int64 repeated_int64 = 32;
|
||||
repeated uint32 repeated_uint32 = 33;
|
||||
repeated uint64 repeated_uint64 = 34;
|
||||
repeated sint32 repeated_sint32 = 35;
|
||||
repeated sint64 repeated_sint64 = 36;
|
||||
repeated fixed32 repeated_fixed32 = 37;
|
||||
repeated fixed64 repeated_fixed64 = 38;
|
||||
repeated sfixed32 repeated_sfixed32 = 39;
|
||||
repeated sfixed64 repeated_sfixed64 = 40;
|
||||
repeated float repeated_float = 41;
|
||||
repeated double repeated_double = 42;
|
||||
repeated bool repeated_bool = 43;
|
||||
repeated string repeated_string = 44;
|
||||
repeated bytes repeated_bytes = 45;
|
||||
|
||||
repeated NestedMessage repeated_nested_message = 48;
|
||||
repeated ForeignMessage repeated_foreign_message = 49;
|
||||
repeated protobuf_unittest_import.ImportMessage repeated_import_message = 50;
|
||||
|
||||
repeated NestedEnum repeated_nested_enum = 51;
|
||||
repeated ForeignEnum repeated_foreign_enum = 52;
|
||||
repeated protobuf_unittest_import.ImportEnum repeated_import_enum = 53;
|
||||
// Defined in unittest_import_public.proto
|
||||
repeated protobuf_unittest_import.PublicImportMessage
|
||||
repeated_public_import_message = 54;
|
||||
|
||||
// For oneof test
|
||||
oneof oneof_field {
|
||||
uint32 oneof_uint32 = 111;
|
||||
NestedMessage oneof_nested_message = 112;
|
||||
string oneof_string = 113;
|
||||
bytes oneof_bytes = 114;
|
||||
}
|
||||
}
|
||||
|
||||
// This proto includes a recusively nested message.
|
||||
message NestedTestAllTypes {
|
||||
NestedTestAllTypes child = 1;
|
||||
TestAllTypes payload = 2;
|
||||
repeated NestedTestAllTypes repeated_child = 3;
|
||||
}
|
||||
|
||||
message TestDeprecatedFields {
|
||||
int32 deprecated_int32 = 1 [deprecated=true];
|
||||
}
|
||||
|
||||
// Define these after TestAllTypes to make sure the compiler can handle
|
||||
// that.
|
||||
message ForeignMessage {
|
||||
int32 c = 1;
|
||||
}
|
||||
|
||||
enum ForeignEnum {
|
||||
FOREIGN_UNSPECIFIED = 0;
|
||||
FOREIGN_FOO = 4;
|
||||
FOREIGN_BAR = 5;
|
||||
FOREIGN_BAZ = 6;
|
||||
}
|
||||
|
||||
message TestReservedFields {
|
||||
reserved 2, 15, 9 to 11;
|
||||
reserved "bar", "baz";
|
||||
}
|
||||
|
||||
|
||||
// Test that we can use NestedMessage from outside TestAllTypes.
|
||||
message TestForeignNested {
|
||||
TestAllTypes.NestedMessage foreign_nested = 1;
|
||||
}
|
||||
|
||||
// Test that really large tag numbers don't break anything.
|
||||
message TestReallyLargeTagNumber {
|
||||
// The largest possible tag number is 2^28 - 1, since the wire format uses
|
||||
// three bits to communicate wire type.
|
||||
int32 a = 1;
|
||||
int32 bb = 268435455;
|
||||
}
|
||||
|
||||
message TestRecursiveMessage {
|
||||
TestRecursiveMessage a = 1;
|
||||
int32 i = 2;
|
||||
}
|
||||
|
||||
// Test that mutual recursion works.
|
||||
message TestMutualRecursionA {
|
||||
TestMutualRecursionB bb = 1;
|
||||
}
|
||||
|
||||
message TestMutualRecursionB {
|
||||
TestMutualRecursionA a = 1;
|
||||
int32 optional_int32 = 2;
|
||||
}
|
||||
|
||||
|
||||
// Test an enum that has multiple values with the same number.
|
||||
enum TestEnumWithDupValue {
|
||||
TEST_ENUM_WITH_DUP_VALUE_UNSPECIFIED = 0;
|
||||
option allow_alias = true;
|
||||
|
||||
FOO1 = 1;
|
||||
BAR1 = 2;
|
||||
BAZ = 3;
|
||||
FOO2 = 1;
|
||||
BAR2 = 2;
|
||||
}
|
||||
|
||||
// Test an enum with large, unordered values.
|
||||
enum TestSparseEnum {
|
||||
TEST_SPARSE_ENUM_UNSPECIFIED = 0;
|
||||
SPARSE_A = 123;
|
||||
SPARSE_B = 62374;
|
||||
SPARSE_C = 12589234;
|
||||
SPARSE_D = -15;
|
||||
SPARSE_E = -53452;
|
||||
// In proto3, value 0 must be the first one specified
|
||||
// SPARSE_F = 0;
|
||||
SPARSE_G = 2;
|
||||
}
|
||||
|
||||
// Test message with CamelCase field names. This violates Protocol Buffer
|
||||
// standard style.
|
||||
message TestCamelCaseFieldNames {
|
||||
int32 PrimitiveField = 1;
|
||||
string StringField = 2;
|
||||
ForeignEnum EnumField = 3;
|
||||
ForeignMessage MessageField = 4;
|
||||
|
||||
repeated int32 RepeatedPrimitiveField = 7;
|
||||
repeated string RepeatedStringField = 8;
|
||||
repeated ForeignEnum RepeatedEnumField = 9;
|
||||
repeated ForeignMessage RepeatedMessageField = 10;
|
||||
}
|
||||
|
||||
|
||||
// We list fields out of order, to ensure that we're using field number and not
|
||||
// field index to determine serialization order.
|
||||
message TestFieldOrderings {
|
||||
string my_string = 11;
|
||||
int64 my_int = 1;
|
||||
float my_float = 101;
|
||||
message NestedMessage {
|
||||
int64 oo = 2;
|
||||
// The field name "b" fails to compile in proto1 because it conflicts with
|
||||
// a local variable named "b" in one of the generated methods. Doh.
|
||||
// This file needs to compile in proto1 to test backwards-compatibility.
|
||||
int32 bb = 1;
|
||||
}
|
||||
|
||||
NestedMessage single_nested_message = 200;
|
||||
}
|
||||
|
||||
message SparseEnumMessage {
|
||||
TestSparseEnum sparse_enum = 1;
|
||||
}
|
||||
|
||||
// Test String and Bytes: string is for valid UTF-8 strings
|
||||
message OneString {
|
||||
string data = 1;
|
||||
}
|
||||
|
||||
message MoreString {
|
||||
repeated string data = 1;
|
||||
}
|
||||
|
||||
message OneBytes {
|
||||
bytes data = 1;
|
||||
}
|
||||
|
||||
message MoreBytes {
|
||||
bytes data = 1;
|
||||
}
|
||||
|
||||
// Test int32, uint32, int64, uint64, and bool are all compatible
|
||||
message Int32Message {
|
||||
int32 data = 1;
|
||||
}
|
||||
|
||||
message Uint32Message {
|
||||
uint32 data = 1;
|
||||
}
|
||||
|
||||
message Int64Message {
|
||||
int64 data = 1;
|
||||
}
|
||||
|
||||
message Uint64Message {
|
||||
uint64 data = 1;
|
||||
}
|
||||
|
||||
message BoolMessage {
|
||||
bool data = 1;
|
||||
}
|
||||
|
||||
// Test oneofs.
|
||||
message TestOneof {
|
||||
oneof foo {
|
||||
int32 foo_int = 1;
|
||||
string foo_string = 2;
|
||||
TestAllTypes foo_message = 3;
|
||||
}
|
||||
}
|
||||
|
||||
// Test messages for packed fields
|
||||
|
||||
message TestPackedTypes {
|
||||
repeated int32 packed_int32 = 90 [packed = true];
|
||||
repeated int64 packed_int64 = 91 [packed = true];
|
||||
repeated uint32 packed_uint32 = 92 [packed = true];
|
||||
repeated uint64 packed_uint64 = 93 [packed = true];
|
||||
repeated sint32 packed_sint32 = 94 [packed = true];
|
||||
repeated sint64 packed_sint64 = 95 [packed = true];
|
||||
repeated fixed32 packed_fixed32 = 96 [packed = true];
|
||||
repeated fixed64 packed_fixed64 = 97 [packed = true];
|
||||
repeated sfixed32 packed_sfixed32 = 98 [packed = true];
|
||||
repeated sfixed64 packed_sfixed64 = 99 [packed = true];
|
||||
repeated float packed_float = 100 [packed = true];
|
||||
repeated double packed_double = 101 [packed = true];
|
||||
repeated bool packed_bool = 102 [packed = true];
|
||||
repeated ForeignEnum packed_enum = 103 [packed = true];
|
||||
}
|
||||
|
||||
// A message with the same fields as TestPackedTypes, but without packing. Used
|
||||
// to test packed <-> unpacked wire compatibility.
|
||||
message TestUnpackedTypes {
|
||||
repeated int32 unpacked_int32 = 90 [packed = false];
|
||||
repeated int64 unpacked_int64 = 91 [packed = false];
|
||||
repeated uint32 unpacked_uint32 = 92 [packed = false];
|
||||
repeated uint64 unpacked_uint64 = 93 [packed = false];
|
||||
repeated sint32 unpacked_sint32 = 94 [packed = false];
|
||||
repeated sint64 unpacked_sint64 = 95 [packed = false];
|
||||
repeated fixed32 unpacked_fixed32 = 96 [packed = false];
|
||||
repeated fixed64 unpacked_fixed64 = 97 [packed = false];
|
||||
repeated sfixed32 unpacked_sfixed32 = 98 [packed = false];
|
||||
repeated sfixed64 unpacked_sfixed64 = 99 [packed = false];
|
||||
repeated float unpacked_float = 100 [packed = false];
|
||||
repeated double unpacked_double = 101 [packed = false];
|
||||
repeated bool unpacked_bool = 102 [packed = false];
|
||||
repeated ForeignEnum unpacked_enum = 103 [packed = false];
|
||||
}
|
||||
|
||||
message TestRepeatedScalarDifferentTagSizes {
|
||||
// Parsing repeated fixed size values used to fail. This message needs to be
|
||||
// used in order to get a tag of the right size; all of the repeated fields
|
||||
// in TestAllTypes didn't trigger the check.
|
||||
repeated fixed32 repeated_fixed32 = 12;
|
||||
// Check for a varint type, just for good measure.
|
||||
repeated int32 repeated_int32 = 13;
|
||||
|
||||
// These have two-byte tags.
|
||||
repeated fixed64 repeated_fixed64 = 2046;
|
||||
repeated int64 repeated_int64 = 2047;
|
||||
|
||||
// Three byte tags.
|
||||
repeated float repeated_float = 262142;
|
||||
repeated uint64 repeated_uint64 = 262143;
|
||||
}
|
||||
|
||||
message TestCommentInjectionMessage {
|
||||
// */ <- This should not close the generated doc comment
|
||||
string a = 1;
|
||||
}
|
||||
|
||||
|
||||
// Test that RPC services work.
|
||||
message FooRequest {}
|
||||
message FooResponse {}
|
||||
|
||||
message FooClientMessage {}
|
||||
message FooServerMessage{}
|
||||
|
||||
service TestService {
|
||||
rpc Foo(FooRequest) returns (FooResponse);
|
||||
rpc Bar(BarRequest) returns (BarResponse);
|
||||
}
|
||||
|
||||
|
||||
message BarRequest {}
|
||||
message BarResponse {}
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
syntax = "proto3";
|
||||
|
||||
package protobuf_unittest;
|
||||
|
||||
option csharp_namespace = "Google.Protobuf.TestProtos";
|
||||
option java_multiple_files = true;
|
||||
option java_package = "com.google.protobuf.test";
|
||||
|
||||
import "google/protobuf/any.proto";
|
||||
import "google/protobuf/api.proto";
|
||||
import "google/protobuf/duration.proto";
|
||||
import "google/protobuf/empty.proto";
|
||||
import "google/protobuf/field_mask.proto";
|
||||
import "google/protobuf/source_context.proto";
|
||||
import "google/protobuf/struct.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/protobuf/type.proto";
|
||||
import "google/protobuf/wrappers.proto";
|
||||
|
||||
// Test that we can include all well-known types.
|
||||
// Each wrapper type is included separately, as languages
|
||||
// map handle different wrappers in different ways.
|
||||
message TestWellKnownTypes {
|
||||
google.protobuf.Any any_field = 1;
|
||||
google.protobuf.Api api_field = 2;
|
||||
google.protobuf.Duration duration_field = 3;
|
||||
google.protobuf.Empty empty_field = 4;
|
||||
google.protobuf.FieldMask field_mask_field = 5;
|
||||
google.protobuf.SourceContext source_context_field = 6;
|
||||
google.protobuf.Struct struct_field = 7;
|
||||
google.protobuf.Timestamp timestamp_field = 8;
|
||||
google.protobuf.Type type_field = 9;
|
||||
google.protobuf.DoubleValue double_field = 10;
|
||||
google.protobuf.FloatValue float_field = 11;
|
||||
google.protobuf.Int64Value int64_field = 12;
|
||||
google.protobuf.UInt64Value uint64_field = 13;
|
||||
google.protobuf.Int32Value int32_field = 14;
|
||||
google.protobuf.UInt32Value uint32_field = 15;
|
||||
google.protobuf.BoolValue bool_field = 16;
|
||||
google.protobuf.StringValue string_field = 17;
|
||||
google.protobuf.BytesValue bytes_field = 18;
|
||||
// Part of struct, but useful to be able to test separately
|
||||
google.protobuf.Value value_field = 19;
|
||||
}
|
||||
|
||||
// A repeated field for each well-known type.
|
||||
message RepeatedWellKnownTypes {
|
||||
repeated google.protobuf.Any any_field = 1;
|
||||
repeated google.protobuf.Api api_field = 2;
|
||||
repeated google.protobuf.Duration duration_field = 3;
|
||||
repeated google.protobuf.Empty empty_field = 4;
|
||||
repeated google.protobuf.FieldMask field_mask_field = 5;
|
||||
repeated google.protobuf.SourceContext source_context_field = 6;
|
||||
repeated google.protobuf.Struct struct_field = 7;
|
||||
repeated google.protobuf.Timestamp timestamp_field = 8;
|
||||
repeated google.protobuf.Type type_field = 9;
|
||||
// These don't actually make a lot of sense, but they're not prohibited...
|
||||
repeated google.protobuf.DoubleValue double_field = 10;
|
||||
repeated google.protobuf.FloatValue float_field = 11;
|
||||
repeated google.protobuf.Int64Value int64_field = 12;
|
||||
repeated google.protobuf.UInt64Value uint64_field = 13;
|
||||
repeated google.protobuf.Int32Value int32_field = 14;
|
||||
repeated google.protobuf.UInt32Value uint32_field = 15;
|
||||
repeated google.protobuf.BoolValue bool_field = 16;
|
||||
repeated google.protobuf.StringValue string_field = 17;
|
||||
repeated google.protobuf.BytesValue bytes_field = 18;
|
||||
}
|
||||
|
||||
message OneofWellKnownTypes {
|
||||
oneof oneof_field {
|
||||
google.protobuf.Any any_field = 1;
|
||||
google.protobuf.Api api_field = 2;
|
||||
google.protobuf.Duration duration_field = 3;
|
||||
google.protobuf.Empty empty_field = 4;
|
||||
google.protobuf.FieldMask field_mask_field = 5;
|
||||
google.protobuf.SourceContext source_context_field = 6;
|
||||
google.protobuf.Struct struct_field = 7;
|
||||
google.protobuf.Timestamp timestamp_field = 8;
|
||||
google.protobuf.Type type_field = 9;
|
||||
google.protobuf.DoubleValue double_field = 10;
|
||||
google.protobuf.FloatValue float_field = 11;
|
||||
google.protobuf.Int64Value int64_field = 12;
|
||||
google.protobuf.UInt64Value uint64_field = 13;
|
||||
google.protobuf.Int32Value int32_field = 14;
|
||||
google.protobuf.UInt32Value uint32_field = 15;
|
||||
google.protobuf.BoolValue bool_field = 16;
|
||||
google.protobuf.StringValue string_field = 17;
|
||||
google.protobuf.BytesValue bytes_field = 18;
|
||||
}
|
||||
}
|
||||
|
||||
// A map field for each well-known type. We only
|
||||
// need to worry about the value part of the map being the
|
||||
// well-known types, as messages can't be map keys.
|
||||
message MapWellKnownTypes {
|
||||
map<int32,google.protobuf.Any> any_field = 1;
|
||||
map<int32,google.protobuf.Api> api_field = 2;
|
||||
map<int32,google.protobuf.Duration> duration_field = 3;
|
||||
map<int32,google.protobuf.Empty> empty_field = 4;
|
||||
map<int32,google.protobuf.FieldMask> field_mask_field = 5;
|
||||
map<int32,google.protobuf.SourceContext> source_context_field = 6;
|
||||
map<int32,google.protobuf.Struct> struct_field = 7;
|
||||
map<int32,google.protobuf.Timestamp> timestamp_field = 8;
|
||||
map<int32,google.protobuf.Type> type_field = 9;
|
||||
map<int32,google.protobuf.DoubleValue> double_field = 10;
|
||||
map<int32,google.protobuf.FloatValue> float_field = 11;
|
||||
map<int32,google.protobuf.Int64Value> int64_field = 12;
|
||||
map<int32,google.protobuf.UInt64Value> uint64_field = 13;
|
||||
map<int32,google.protobuf.Int32Value> int32_field = 14;
|
||||
map<int32,google.protobuf.UInt32Value> uint32_field = 15;
|
||||
map<int32,google.protobuf.BoolValue> bool_field = 16;
|
||||
map<int32,google.protobuf.StringValue> string_field = 17;
|
||||
map<int32,google.protobuf.BytesValue> bytes_field = 18;
|
||||
}
|
|
@ -0,0 +1,171 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
public class ByteStringTest
|
||||
{
|
||||
[Test]
|
||||
public void Equality()
|
||||
{
|
||||
ByteString b1 = ByteString.CopyFrom(1, 2, 3);
|
||||
ByteString b2 = ByteString.CopyFrom(1, 2, 3);
|
||||
ByteString b3 = ByteString.CopyFrom(1, 2, 4);
|
||||
ByteString b4 = ByteString.CopyFrom(1, 2, 3, 4);
|
||||
EqualityTester.AssertEquality(b1, b1);
|
||||
EqualityTester.AssertEquality(b1, b2);
|
||||
EqualityTester.AssertInequality(b1, b3);
|
||||
EqualityTester.AssertInequality(b1, b4);
|
||||
EqualityTester.AssertInequality(b1, null);
|
||||
#pragma warning disable 1718 // Deliberately calling ==(b1, b1) and !=(b1, b1)
|
||||
Assert.IsTrue(b1 == b1);
|
||||
Assert.IsTrue(b1 == b2);
|
||||
Assert.IsFalse(b1 == b3);
|
||||
Assert.IsFalse(b1 == b4);
|
||||
Assert.IsFalse(b1 == null);
|
||||
Assert.IsTrue((ByteString) null == null);
|
||||
Assert.IsFalse(b1 != b1);
|
||||
Assert.IsFalse(b1 != b2);
|
||||
#pragma warning disable 1718
|
||||
Assert.IsTrue(b1 != b3);
|
||||
Assert.IsTrue(b1 != b4);
|
||||
Assert.IsTrue(b1 != null);
|
||||
Assert.IsFalse((ByteString) null != null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EmptyByteStringHasZeroSize()
|
||||
{
|
||||
Assert.AreEqual(0, ByteString.Empty.Length);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CopyFromStringWithExplicitEncoding()
|
||||
{
|
||||
ByteString bs = ByteString.CopyFrom("AB", Encoding.Unicode);
|
||||
Assert.AreEqual(4, bs.Length);
|
||||
Assert.AreEqual(65, bs[0]);
|
||||
Assert.AreEqual(0, bs[1]);
|
||||
Assert.AreEqual(66, bs[2]);
|
||||
Assert.AreEqual(0, bs[3]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IsEmptyWhenEmpty()
|
||||
{
|
||||
Assert.IsTrue(ByteString.CopyFromUtf8("").IsEmpty);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IsEmptyWhenNotEmpty()
|
||||
{
|
||||
Assert.IsFalse(ByteString.CopyFromUtf8("X").IsEmpty);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CopyFromByteArrayCopiesContents()
|
||||
{
|
||||
byte[] data = new byte[1];
|
||||
data[0] = 10;
|
||||
ByteString bs = ByteString.CopyFrom(data);
|
||||
Assert.AreEqual(10, bs[0]);
|
||||
data[0] = 5;
|
||||
Assert.AreEqual(10, bs[0]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToByteArrayCopiesContents()
|
||||
{
|
||||
ByteString bs = ByteString.CopyFromUtf8("Hello");
|
||||
byte[] data = bs.ToByteArray();
|
||||
Assert.AreEqual((byte)'H', data[0]);
|
||||
Assert.AreEqual((byte)'H', bs[0]);
|
||||
data[0] = 0;
|
||||
Assert.AreEqual(0, data[0]);
|
||||
Assert.AreEqual((byte)'H', bs[0]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CopyFromUtf8UsesUtf8()
|
||||
{
|
||||
ByteString bs = ByteString.CopyFromUtf8("\u20ac");
|
||||
Assert.AreEqual(3, bs.Length);
|
||||
Assert.AreEqual(0xe2, bs[0]);
|
||||
Assert.AreEqual(0x82, bs[1]);
|
||||
Assert.AreEqual(0xac, bs[2]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CopyFromPortion()
|
||||
{
|
||||
byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6};
|
||||
ByteString bs = ByteString.CopyFrom(data, 2, 3);
|
||||
Assert.AreEqual(3, bs.Length);
|
||||
Assert.AreEqual(2, bs[0]);
|
||||
Assert.AreEqual(3, bs[1]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToStringUtf8()
|
||||
{
|
||||
ByteString bs = ByteString.CopyFromUtf8("\u20ac");
|
||||
Assert.AreEqual("\u20ac", bs.ToStringUtf8());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToStringWithExplicitEncoding()
|
||||
{
|
||||
ByteString bs = ByteString.CopyFrom("\u20ac", Encoding.Unicode);
|
||||
Assert.AreEqual("\u20ac", bs.ToString(Encoding.Unicode));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FromBase64_WithText()
|
||||
{
|
||||
byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6};
|
||||
string base64 = Convert.ToBase64String(data);
|
||||
ByteString bs = ByteString.FromBase64(base64);
|
||||
Assert.AreEqual(data, bs.ToByteArray());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FromBase64_Empty()
|
||||
{
|
||||
// Optimization which also fixes issue 61.
|
||||
Assert.AreSame(ByteString.Empty, ByteString.FromBase64(""));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
internal static class CodedInputStreamExtensions
|
||||
{
|
||||
public static void AssertNextTag(this CodedInputStream input, uint expectedTag)
|
||||
{
|
||||
uint tag = input.ReadTag();
|
||||
Assert.AreEqual(expectedTag, tag);
|
||||
}
|
||||
|
||||
public static T ReadMessage<T>(this CodedInputStream stream, MessageParser<T> parser)
|
||||
where T : IMessage<T>
|
||||
{
|
||||
var message = parser.CreateTemplate();
|
||||
stream.ReadMessage(message);
|
||||
return message;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,598 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using Google.Protobuf.TestProtos;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
public class CodedInputStreamTest
|
||||
{
|
||||
/// <summary>
|
||||
/// Helper to construct a byte array from a bunch of bytes. The inputs are
|
||||
/// actually ints so that I can use hex notation and not get stupid errors
|
||||
/// about precision.
|
||||
/// </summary>
|
||||
private static byte[] Bytes(params int[] bytesAsInts)
|
||||
{
|
||||
byte[] bytes = new byte[bytesAsInts.Length];
|
||||
for (int i = 0; i < bytesAsInts.Length; i++)
|
||||
{
|
||||
bytes[i] = (byte) bytesAsInts[i];
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses the given bytes using ReadRawVarint32() and ReadRawVarint64()
|
||||
/// </summary>
|
||||
private static void AssertReadVarint(byte[] data, ulong value)
|
||||
{
|
||||
CodedInputStream input = new CodedInputStream(data);
|
||||
Assert.AreEqual((uint) value, input.ReadRawVarint32());
|
||||
|
||||
input = new CodedInputStream(data);
|
||||
Assert.AreEqual(value, input.ReadRawVarint64());
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
|
||||
// Try different block sizes.
|
||||
for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)
|
||||
{
|
||||
input = new CodedInputStream(new SmallBlockInputStream(data, bufferSize));
|
||||
Assert.AreEqual((uint) value, input.ReadRawVarint32());
|
||||
|
||||
input = new CodedInputStream(new SmallBlockInputStream(data, bufferSize));
|
||||
Assert.AreEqual(value, input.ReadRawVarint64());
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
|
||||
// Try reading directly from a MemoryStream. We want to verify that it
|
||||
// doesn't read past the end of the input, so write an extra byte - this
|
||||
// lets us test the position at the end.
|
||||
MemoryStream memoryStream = new MemoryStream();
|
||||
memoryStream.Write(data, 0, data.Length);
|
||||
memoryStream.WriteByte(0);
|
||||
memoryStream.Position = 0;
|
||||
Assert.AreEqual((uint) value, CodedInputStream.ReadRawVarint32(memoryStream));
|
||||
Assert.AreEqual(data.Length, memoryStream.Position);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses the given bytes using ReadRawVarint32() and ReadRawVarint64() and
|
||||
/// expects them to fail with an InvalidProtocolBufferException whose
|
||||
/// description matches the given one.
|
||||
/// </summary>
|
||||
private static void AssertReadVarintFailure(InvalidProtocolBufferException expected, byte[] data)
|
||||
{
|
||||
CodedInputStream input = new CodedInputStream(data);
|
||||
var exception = Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawVarint32());
|
||||
Assert.AreEqual(expected.Message, exception.Message);
|
||||
|
||||
input = new CodedInputStream(data);
|
||||
exception = Assert.Throws<InvalidProtocolBufferException>(() => input.ReadRawVarint64());
|
||||
Assert.AreEqual(expected.Message, exception.Message);
|
||||
|
||||
// Make sure we get the same error when reading directly from a Stream.
|
||||
exception = Assert.Throws<InvalidProtocolBufferException>(() => CodedInputStream.ReadRawVarint32(new MemoryStream(data)));
|
||||
Assert.AreEqual(expected.Message, exception.Message);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ReadVarint()
|
||||
{
|
||||
AssertReadVarint(Bytes(0x00), 0);
|
||||
AssertReadVarint(Bytes(0x01), 1);
|
||||
AssertReadVarint(Bytes(0x7f), 127);
|
||||
// 14882
|
||||
AssertReadVarint(Bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7));
|
||||
// 2961488830
|
||||
AssertReadVarint(Bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b),
|
||||
(0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
|
||||
(0x0bL << 28));
|
||||
|
||||
// 64-bit
|
||||
// 7256456126
|
||||
AssertReadVarint(Bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b),
|
||||
(0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
|
||||
(0x1bL << 28));
|
||||
// 41256202580718336
|
||||
AssertReadVarint(Bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49),
|
||||
(0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |
|
||||
(0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49));
|
||||
// 11964378330978735131
|
||||
AssertReadVarint(Bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01),
|
||||
(0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
|
||||
(0x3bUL << 28) | (0x56UL << 35) | (0x00UL << 42) |
|
||||
(0x05UL << 49) | (0x26UL << 56) | (0x01UL << 63));
|
||||
|
||||
// Failures
|
||||
AssertReadVarintFailure(
|
||||
InvalidProtocolBufferException.MalformedVarint(),
|
||||
Bytes(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
|
||||
0x00));
|
||||
AssertReadVarintFailure(
|
||||
InvalidProtocolBufferException.TruncatedMessage(),
|
||||
Bytes(0x80));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses the given bytes using ReadRawLittleEndian32() and checks
|
||||
/// that the result matches the given value.
|
||||
/// </summary>
|
||||
private static void AssertReadLittleEndian32(byte[] data, uint value)
|
||||
{
|
||||
CodedInputStream input = new CodedInputStream(data);
|
||||
Assert.AreEqual(value, input.ReadRawLittleEndian32());
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
|
||||
// Try different block sizes.
|
||||
for (int blockSize = 1; blockSize <= 16; blockSize *= 2)
|
||||
{
|
||||
input = new CodedInputStream(
|
||||
new SmallBlockInputStream(data, blockSize));
|
||||
Assert.AreEqual(value, input.ReadRawLittleEndian32());
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses the given bytes using ReadRawLittleEndian64() and checks
|
||||
/// that the result matches the given value.
|
||||
/// </summary>
|
||||
private static void AssertReadLittleEndian64(byte[] data, ulong value)
|
||||
{
|
||||
CodedInputStream input = new CodedInputStream(data);
|
||||
Assert.AreEqual(value, input.ReadRawLittleEndian64());
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
|
||||
// Try different block sizes.
|
||||
for (int blockSize = 1; blockSize <= 16; blockSize *= 2)
|
||||
{
|
||||
input = new CodedInputStream(
|
||||
new SmallBlockInputStream(data, blockSize));
|
||||
Assert.AreEqual(value, input.ReadRawLittleEndian64());
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ReadLittleEndian()
|
||||
{
|
||||
AssertReadLittleEndian32(Bytes(0x78, 0x56, 0x34, 0x12), 0x12345678);
|
||||
AssertReadLittleEndian32(Bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0);
|
||||
|
||||
AssertReadLittleEndian64(Bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12),
|
||||
0x123456789abcdef0L);
|
||||
AssertReadLittleEndian64(
|
||||
Bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef012345678UL);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DecodeZigZag32()
|
||||
{
|
||||
Assert.AreEqual(0, CodedInputStream.DecodeZigZag32(0));
|
||||
Assert.AreEqual(-1, CodedInputStream.DecodeZigZag32(1));
|
||||
Assert.AreEqual(1, CodedInputStream.DecodeZigZag32(2));
|
||||
Assert.AreEqual(-2, CodedInputStream.DecodeZigZag32(3));
|
||||
Assert.AreEqual(0x3FFFFFFF, CodedInputStream.DecodeZigZag32(0x7FFFFFFE));
|
||||
Assert.AreEqual(unchecked((int) 0xC0000000), CodedInputStream.DecodeZigZag32(0x7FFFFFFF));
|
||||
Assert.AreEqual(0x7FFFFFFF, CodedInputStream.DecodeZigZag32(0xFFFFFFFE));
|
||||
Assert.AreEqual(unchecked((int) 0x80000000), CodedInputStream.DecodeZigZag32(0xFFFFFFFF));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DecodeZigZag64()
|
||||
{
|
||||
Assert.AreEqual(0, CodedInputStream.DecodeZigZag64(0));
|
||||
Assert.AreEqual(-1, CodedInputStream.DecodeZigZag64(1));
|
||||
Assert.AreEqual(1, CodedInputStream.DecodeZigZag64(2));
|
||||
Assert.AreEqual(-2, CodedInputStream.DecodeZigZag64(3));
|
||||
Assert.AreEqual(0x000000003FFFFFFFL, CodedInputStream.DecodeZigZag64(0x000000007FFFFFFEL));
|
||||
Assert.AreEqual(unchecked((long) 0xFFFFFFFFC0000000L), CodedInputStream.DecodeZigZag64(0x000000007FFFFFFFL));
|
||||
Assert.AreEqual(0x000000007FFFFFFFL, CodedInputStream.DecodeZigZag64(0x00000000FFFFFFFEL));
|
||||
Assert.AreEqual(unchecked((long) 0xFFFFFFFF80000000L), CodedInputStream.DecodeZigZag64(0x00000000FFFFFFFFL));
|
||||
Assert.AreEqual(0x7FFFFFFFFFFFFFFFL, CodedInputStream.DecodeZigZag64(0xFFFFFFFFFFFFFFFEL));
|
||||
Assert.AreEqual(unchecked((long) 0x8000000000000000L), CodedInputStream.DecodeZigZag64(0xFFFFFFFFFFFFFFFFL));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ReadWholeMessage_VaryingBlockSizes()
|
||||
{
|
||||
TestAllTypes message = SampleMessages.CreateFullTestAllTypes();
|
||||
|
||||
byte[] rawBytes = message.ToByteArray();
|
||||
Assert.AreEqual(rawBytes.Length, message.CalculateSize());
|
||||
TestAllTypes message2 = TestAllTypes.Parser.ParseFrom(rawBytes);
|
||||
Assert.AreEqual(message, message2);
|
||||
|
||||
// Try different block sizes.
|
||||
for (int blockSize = 1; blockSize < 256; blockSize *= 2)
|
||||
{
|
||||
message2 = TestAllTypes.Parser.ParseFrom(new SmallBlockInputStream(rawBytes, blockSize));
|
||||
Assert.AreEqual(message, message2);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ReadHugeBlob()
|
||||
{
|
||||
// Allocate and initialize a 1MB blob.
|
||||
byte[] blob = new byte[1 << 20];
|
||||
for (int i = 0; i < blob.Length; i++)
|
||||
{
|
||||
blob[i] = (byte) i;
|
||||
}
|
||||
|
||||
// Make a message containing it.
|
||||
var message = new TestAllTypes { SingleBytes = ByteString.CopyFrom(blob) };
|
||||
|
||||
// Serialize and parse it. Make sure to parse from an InputStream, not
|
||||
// directly from a ByteString, so that CodedInputStream uses buffered
|
||||
// reading.
|
||||
TestAllTypes message2 = TestAllTypes.Parser.ParseFrom(message.ToByteString());
|
||||
|
||||
Assert.AreEqual(message, message2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ReadMaliciouslyLargeBlob()
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
CodedOutputStream output = new CodedOutputStream(ms);
|
||||
|
||||
uint tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteRawVarint32(tag);
|
||||
output.WriteRawVarint32(0x7FFFFFFF);
|
||||
output.WriteRawBytes(new byte[32]); // Pad with a few random bytes.
|
||||
output.Flush();
|
||||
ms.Position = 0;
|
||||
|
||||
CodedInputStream input = new CodedInputStream(ms);
|
||||
Assert.AreEqual(tag, input.ReadTag());
|
||||
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => input.ReadBytes());
|
||||
}
|
||||
|
||||
internal static TestRecursiveMessage MakeRecursiveMessage(int depth)
|
||||
{
|
||||
if (depth == 0)
|
||||
{
|
||||
return new TestRecursiveMessage { I = 5 };
|
||||
}
|
||||
else
|
||||
{
|
||||
return new TestRecursiveMessage { A = MakeRecursiveMessage(depth - 1) };
|
||||
}
|
||||
}
|
||||
|
||||
internal static void AssertMessageDepth(TestRecursiveMessage message, int depth)
|
||||
{
|
||||
if (depth == 0)
|
||||
{
|
||||
Assert.IsNull(message.A);
|
||||
Assert.AreEqual(5, message.I);
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert.IsNotNull(message.A);
|
||||
AssertMessageDepth(message.A, depth - 1);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MaliciousRecursion()
|
||||
{
|
||||
ByteString data64 = MakeRecursiveMessage(64).ToByteString();
|
||||
ByteString data65 = MakeRecursiveMessage(65).ToByteString();
|
||||
|
||||
AssertMessageDepth(TestRecursiveMessage.Parser.ParseFrom(data64), 64);
|
||||
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestRecursiveMessage.Parser.ParseFrom(data65));
|
||||
|
||||
CodedInputStream input = CodedInputStream.CreateWithLimits(new MemoryStream(data64.ToByteArray()), 1000000, 63);
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestRecursiveMessage.Parser.ParseFrom(input));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SizeLimit()
|
||||
{
|
||||
// Have to use a Stream rather than ByteString.CreateCodedInput as SizeLimit doesn't
|
||||
// apply to the latter case.
|
||||
MemoryStream ms = new MemoryStream(SampleMessages.CreateFullTestAllTypes().ToByteArray());
|
||||
CodedInputStream input = CodedInputStream.CreateWithLimits(ms, 16, 100);
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseFrom(input));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tests that if we read an string that contains invalid UTF-8, no exception
|
||||
/// is thrown. Instead, the invalid bytes are replaced with the Unicode
|
||||
/// "replacement character" U+FFFD.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ReadInvalidUtf8()
|
||||
{
|
||||
MemoryStream ms = new MemoryStream();
|
||||
CodedOutputStream output = new CodedOutputStream(ms);
|
||||
|
||||
uint tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteRawVarint32(tag);
|
||||
output.WriteRawVarint32(1);
|
||||
output.WriteRawBytes(new byte[] {0x80});
|
||||
output.Flush();
|
||||
ms.Position = 0;
|
||||
|
||||
CodedInputStream input = new CodedInputStream(ms);
|
||||
|
||||
Assert.AreEqual(tag, input.ReadTag());
|
||||
string text = input.ReadString();
|
||||
Assert.AreEqual('\ufffd', text[0]);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A stream which limits the number of bytes it reads at a time.
|
||||
/// We use this to make sure that CodedInputStream doesn't screw up when
|
||||
/// reading in small blocks.
|
||||
/// </summary>
|
||||
private sealed class SmallBlockInputStream : MemoryStream
|
||||
{
|
||||
private readonly int blockSize;
|
||||
|
||||
public SmallBlockInputStream(byte[] data, int blockSize)
|
||||
: base(data)
|
||||
{
|
||||
this.blockSize = blockSize;
|
||||
}
|
||||
|
||||
public override int Read(byte[] buffer, int offset, int count)
|
||||
{
|
||||
return base.Read(buffer, offset, Math.Min(count, blockSize));
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestNegativeEnum()
|
||||
{
|
||||
byte[] bytes = { 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01 };
|
||||
CodedInputStream input = new CodedInputStream(bytes);
|
||||
Assert.AreEqual((int)SampleEnum.NegativeValue, input.ReadEnum());
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
|
||||
//Issue 71: CodedInputStream.ReadBytes go to slow path unnecessarily
|
||||
[Test]
|
||||
public void TestSlowPathAvoidance()
|
||||
{
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
CodedOutputStream output = new CodedOutputStream(ms);
|
||||
output.WriteTag(1, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteBytes(ByteString.CopyFrom(new byte[100]));
|
||||
output.WriteTag(2, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteBytes(ByteString.CopyFrom(new byte[100]));
|
||||
output.Flush();
|
||||
|
||||
ms.Position = 0;
|
||||
CodedInputStream input = new CodedInputStream(ms, new byte[ms.Length / 2], 0, 0);
|
||||
|
||||
uint tag = input.ReadTag();
|
||||
Assert.AreEqual(1, WireFormat.GetTagFieldNumber(tag));
|
||||
Assert.AreEqual(100, input.ReadBytes().Length);
|
||||
|
||||
tag = input.ReadTag();
|
||||
Assert.AreEqual(2, WireFormat.GetTagFieldNumber(tag));
|
||||
Assert.AreEqual(100, input.ReadBytes().Length);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Tag0Throws()
|
||||
{
|
||||
var input = new CodedInputStream(new byte[] { 0 });
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => input.ReadTag());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SkipGroup()
|
||||
{
|
||||
// Create an output stream with a group in:
|
||||
// Field 1: string "field 1"
|
||||
// Field 2: group containing:
|
||||
// Field 1: fixed int32 value 100
|
||||
// Field 2: string "ignore me"
|
||||
// Field 3: nested group containing
|
||||
// Field 1: fixed int64 value 1000
|
||||
// Field 3: string "field 3"
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
output.WriteTag(1, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteString("field 1");
|
||||
|
||||
// The outer group...
|
||||
output.WriteTag(2, WireFormat.WireType.StartGroup);
|
||||
output.WriteTag(1, WireFormat.WireType.Fixed32);
|
||||
output.WriteFixed32(100);
|
||||
output.WriteTag(2, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteString("ignore me");
|
||||
// The nested group...
|
||||
output.WriteTag(3, WireFormat.WireType.StartGroup);
|
||||
output.WriteTag(1, WireFormat.WireType.Fixed64);
|
||||
output.WriteFixed64(1000);
|
||||
// Note: Not sure the field number is relevant for end group...
|
||||
output.WriteTag(3, WireFormat.WireType.EndGroup);
|
||||
|
||||
// End the outer group
|
||||
output.WriteTag(2, WireFormat.WireType.EndGroup);
|
||||
|
||||
output.WriteTag(3, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteString("field 3");
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
// Now act like a generated client
|
||||
var input = new CodedInputStream(stream);
|
||||
Assert.AreEqual(WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited), input.ReadTag());
|
||||
Assert.AreEqual("field 1", input.ReadString());
|
||||
Assert.AreEqual(WireFormat.MakeTag(2, WireFormat.WireType.StartGroup), input.ReadTag());
|
||||
input.SkipLastField(); // Should consume the whole group, including the nested one.
|
||||
Assert.AreEqual(WireFormat.MakeTag(3, WireFormat.WireType.LengthDelimited), input.ReadTag());
|
||||
Assert.AreEqual("field 3", input.ReadString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SkipGroup_WrongEndGroupTag()
|
||||
{
|
||||
// Create an output stream with:
|
||||
// Field 1: string "field 1"
|
||||
// Start group 2
|
||||
// Field 3: fixed int32
|
||||
// End group 4 (should give an error)
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
output.WriteTag(1, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteString("field 1");
|
||||
|
||||
// The outer group...
|
||||
output.WriteTag(2, WireFormat.WireType.StartGroup);
|
||||
output.WriteTag(3, WireFormat.WireType.Fixed32);
|
||||
output.WriteFixed32(100);
|
||||
output.WriteTag(4, WireFormat.WireType.EndGroup);
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
// Now act like a generated client
|
||||
var input = new CodedInputStream(stream);
|
||||
Assert.AreEqual(WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited), input.ReadTag());
|
||||
Assert.AreEqual("field 1", input.ReadString());
|
||||
Assert.AreEqual(WireFormat.MakeTag(2, WireFormat.WireType.StartGroup), input.ReadTag());
|
||||
Assert.Throws<InvalidProtocolBufferException>(input.SkipLastField);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RogueEndGroupTag()
|
||||
{
|
||||
// If we have an end-group tag without a leading start-group tag, generated
|
||||
// code will just call SkipLastField... so that should fail.
|
||||
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
output.WriteTag(1, WireFormat.WireType.EndGroup);
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
var input = new CodedInputStream(stream);
|
||||
Assert.AreEqual(WireFormat.MakeTag(1, WireFormat.WireType.EndGroup), input.ReadTag());
|
||||
Assert.Throws<InvalidProtocolBufferException>(input.SkipLastField);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EndOfStreamReachedWhileSkippingGroup()
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
output.WriteTag(1, WireFormat.WireType.StartGroup);
|
||||
output.WriteTag(2, WireFormat.WireType.StartGroup);
|
||||
output.WriteTag(2, WireFormat.WireType.EndGroup);
|
||||
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
// Now act like a generated client
|
||||
var input = new CodedInputStream(stream);
|
||||
input.ReadTag();
|
||||
Assert.Throws<InvalidProtocolBufferException>(input.SkipLastField);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RecursionLimitAppliedWhileSkippingGroup()
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
for (int i = 0; i < CodedInputStream.DefaultRecursionLimit + 1; i++)
|
||||
{
|
||||
output.WriteTag(1, WireFormat.WireType.StartGroup);
|
||||
}
|
||||
for (int i = 0; i < CodedInputStream.DefaultRecursionLimit + 1; i++)
|
||||
{
|
||||
output.WriteTag(1, WireFormat.WireType.EndGroup);
|
||||
}
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
// Now act like a generated client
|
||||
var input = new CodedInputStream(stream);
|
||||
Assert.AreEqual(WireFormat.MakeTag(1, WireFormat.WireType.StartGroup), input.ReadTag());
|
||||
Assert.Throws<InvalidProtocolBufferException>(input.SkipLastField);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Construction_Invalid()
|
||||
{
|
||||
Assert.Throws<ArgumentNullException>(() => new CodedInputStream((byte[]) null));
|
||||
Assert.Throws<ArgumentNullException>(() => new CodedInputStream(null, 0, 0));
|
||||
Assert.Throws<ArgumentNullException>(() => new CodedInputStream((Stream) null));
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => new CodedInputStream(new byte[10], 100, 0));
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => new CodedInputStream(new byte[10], 5, 10));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CreateWithLimits_InvalidLimits()
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => CodedInputStream.CreateWithLimits(stream, 0, 1));
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => CodedInputStream.CreateWithLimits(stream, 1, 0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Dispose_DisposesUnderlyingStream()
|
||||
{
|
||||
var memoryStream = new MemoryStream();
|
||||
Assert.IsTrue(memoryStream.CanRead);
|
||||
using (var cis = new CodedInputStream(memoryStream))
|
||||
{
|
||||
}
|
||||
Assert.IsFalse(memoryStream.CanRead); // Disposed
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Dispose_WithLeaveOpen()
|
||||
{
|
||||
var memoryStream = new MemoryStream();
|
||||
Assert.IsTrue(memoryStream.CanRead);
|
||||
using (var cis = new CodedInputStream(memoryStream, true))
|
||||
{
|
||||
}
|
||||
Assert.IsTrue(memoryStream.CanRead); // We left the stream open
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,419 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using Google.Protobuf.TestProtos;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
public class CodedOutputStreamTest
|
||||
{
|
||||
/// <summary>
|
||||
/// Writes the given value using WriteRawVarint32() and WriteRawVarint64() and
|
||||
/// checks that the result matches the given bytes
|
||||
/// </summary>
|
||||
private static void AssertWriteVarint(byte[] data, ulong value)
|
||||
{
|
||||
// Only do 32-bit write if the value fits in 32 bits.
|
||||
if ((value >> 32) == 0)
|
||||
{
|
||||
MemoryStream rawOutput = new MemoryStream();
|
||||
CodedOutputStream output = new CodedOutputStream(rawOutput);
|
||||
output.WriteRawVarint32((uint) value);
|
||||
output.Flush();
|
||||
Assert.AreEqual(data, rawOutput.ToArray());
|
||||
// Also try computing size.
|
||||
Assert.AreEqual(data.Length, CodedOutputStream.ComputeRawVarint32Size((uint) value));
|
||||
}
|
||||
|
||||
{
|
||||
MemoryStream rawOutput = new MemoryStream();
|
||||
CodedOutputStream output = new CodedOutputStream(rawOutput);
|
||||
output.WriteRawVarint64(value);
|
||||
output.Flush();
|
||||
Assert.AreEqual(data, rawOutput.ToArray());
|
||||
|
||||
// Also try computing size.
|
||||
Assert.AreEqual(data.Length, CodedOutputStream.ComputeRawVarint64Size(value));
|
||||
}
|
||||
|
||||
// Try different buffer sizes.
|
||||
for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)
|
||||
{
|
||||
// Only do 32-bit write if the value fits in 32 bits.
|
||||
if ((value >> 32) == 0)
|
||||
{
|
||||
MemoryStream rawOutput = new MemoryStream();
|
||||
CodedOutputStream output =
|
||||
new CodedOutputStream(rawOutput, bufferSize);
|
||||
output.WriteRawVarint32((uint) value);
|
||||
output.Flush();
|
||||
Assert.AreEqual(data, rawOutput.ToArray());
|
||||
}
|
||||
|
||||
{
|
||||
MemoryStream rawOutput = new MemoryStream();
|
||||
CodedOutputStream output = new CodedOutputStream(rawOutput, bufferSize);
|
||||
output.WriteRawVarint64(value);
|
||||
output.Flush();
|
||||
Assert.AreEqual(data, rawOutput.ToArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tests WriteRawVarint32() and WriteRawVarint64()
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void WriteVarint()
|
||||
{
|
||||
AssertWriteVarint(new byte[] {0x00}, 0);
|
||||
AssertWriteVarint(new byte[] {0x01}, 1);
|
||||
AssertWriteVarint(new byte[] {0x7f}, 127);
|
||||
// 14882
|
||||
AssertWriteVarint(new byte[] {0xa2, 0x74}, (0x22 << 0) | (0x74 << 7));
|
||||
// 2961488830
|
||||
AssertWriteVarint(new byte[] {0xbe, 0xf7, 0x92, 0x84, 0x0b},
|
||||
(0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
|
||||
(0x0bL << 28));
|
||||
|
||||
// 64-bit
|
||||
// 7256456126
|
||||
AssertWriteVarint(new byte[] {0xbe, 0xf7, 0x92, 0x84, 0x1b},
|
||||
(0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
|
||||
(0x1bL << 28));
|
||||
// 41256202580718336
|
||||
AssertWriteVarint(
|
||||
new byte[] {0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49},
|
||||
(0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |
|
||||
(0x43UL << 28) | (0x49L << 35) | (0x24UL << 42) | (0x49UL << 49));
|
||||
// 11964378330978735131
|
||||
AssertWriteVarint(
|
||||
new byte[] {0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01},
|
||||
unchecked((ulong)
|
||||
((0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
|
||||
(0x3bL << 28) | (0x56L << 35) | (0x00L << 42) |
|
||||
(0x05L << 49) | (0x26L << 56) | (0x01L << 63))));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses the given bytes using WriteRawLittleEndian32() and checks
|
||||
/// that the result matches the given value.
|
||||
/// </summary>
|
||||
private static void AssertWriteLittleEndian32(byte[] data, uint value)
|
||||
{
|
||||
MemoryStream rawOutput = new MemoryStream();
|
||||
CodedOutputStream output = new CodedOutputStream(rawOutput);
|
||||
output.WriteRawLittleEndian32(value);
|
||||
output.Flush();
|
||||
Assert.AreEqual(data, rawOutput.ToArray());
|
||||
|
||||
// Try different buffer sizes.
|
||||
for (int bufferSize = 1; bufferSize <= 16; bufferSize *= 2)
|
||||
{
|
||||
rawOutput = new MemoryStream();
|
||||
output = new CodedOutputStream(rawOutput, bufferSize);
|
||||
output.WriteRawLittleEndian32(value);
|
||||
output.Flush();
|
||||
Assert.AreEqual(data, rawOutput.ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Parses the given bytes using WriteRawLittleEndian64() and checks
|
||||
/// that the result matches the given value.
|
||||
/// </summary>
|
||||
private static void AssertWriteLittleEndian64(byte[] data, ulong value)
|
||||
{
|
||||
MemoryStream rawOutput = new MemoryStream();
|
||||
CodedOutputStream output = new CodedOutputStream(rawOutput);
|
||||
output.WriteRawLittleEndian64(value);
|
||||
output.Flush();
|
||||
Assert.AreEqual(data, rawOutput.ToArray());
|
||||
|
||||
// Try different block sizes.
|
||||
for (int blockSize = 1; blockSize <= 16; blockSize *= 2)
|
||||
{
|
||||
rawOutput = new MemoryStream();
|
||||
output = new CodedOutputStream(rawOutput, blockSize);
|
||||
output.WriteRawLittleEndian64(value);
|
||||
output.Flush();
|
||||
Assert.AreEqual(data, rawOutput.ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tests writeRawLittleEndian32() and writeRawLittleEndian64().
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void WriteLittleEndian()
|
||||
{
|
||||
AssertWriteLittleEndian32(new byte[] {0x78, 0x56, 0x34, 0x12}, 0x12345678);
|
||||
AssertWriteLittleEndian32(new byte[] {0xf0, 0xde, 0xbc, 0x9a}, 0x9abcdef0);
|
||||
|
||||
AssertWriteLittleEndian64(
|
||||
new byte[] {0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12},
|
||||
0x123456789abcdef0L);
|
||||
AssertWriteLittleEndian64(
|
||||
new byte[] {0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a},
|
||||
0x9abcdef012345678UL);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteWholeMessage_VaryingBlockSizes()
|
||||
{
|
||||
TestAllTypes message = SampleMessages.CreateFullTestAllTypes();
|
||||
|
||||
byte[] rawBytes = message.ToByteArray();
|
||||
|
||||
// Try different block sizes.
|
||||
for (int blockSize = 1; blockSize < 256; blockSize *= 2)
|
||||
{
|
||||
MemoryStream rawOutput = new MemoryStream();
|
||||
CodedOutputStream output = new CodedOutputStream(rawOutput, blockSize);
|
||||
message.WriteTo(output);
|
||||
output.Flush();
|
||||
Assert.AreEqual(rawBytes, rawOutput.ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EncodeZigZag32()
|
||||
{
|
||||
Assert.AreEqual(0u, CodedOutputStream.EncodeZigZag32(0));
|
||||
Assert.AreEqual(1u, CodedOutputStream.EncodeZigZag32(-1));
|
||||
Assert.AreEqual(2u, CodedOutputStream.EncodeZigZag32(1));
|
||||
Assert.AreEqual(3u, CodedOutputStream.EncodeZigZag32(-2));
|
||||
Assert.AreEqual(0x7FFFFFFEu, CodedOutputStream.EncodeZigZag32(0x3FFFFFFF));
|
||||
Assert.AreEqual(0x7FFFFFFFu, CodedOutputStream.EncodeZigZag32(unchecked((int) 0xC0000000)));
|
||||
Assert.AreEqual(0xFFFFFFFEu, CodedOutputStream.EncodeZigZag32(0x7FFFFFFF));
|
||||
Assert.AreEqual(0xFFFFFFFFu, CodedOutputStream.EncodeZigZag32(unchecked((int) 0x80000000)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EncodeZigZag64()
|
||||
{
|
||||
Assert.AreEqual(0u, CodedOutputStream.EncodeZigZag64(0));
|
||||
Assert.AreEqual(1u, CodedOutputStream.EncodeZigZag64(-1));
|
||||
Assert.AreEqual(2u, CodedOutputStream.EncodeZigZag64(1));
|
||||
Assert.AreEqual(3u, CodedOutputStream.EncodeZigZag64(-2));
|
||||
Assert.AreEqual(0x000000007FFFFFFEuL,
|
||||
CodedOutputStream.EncodeZigZag64(unchecked((long) 0x000000003FFFFFFFUL)));
|
||||
Assert.AreEqual(0x000000007FFFFFFFuL,
|
||||
CodedOutputStream.EncodeZigZag64(unchecked((long) 0xFFFFFFFFC0000000UL)));
|
||||
Assert.AreEqual(0x00000000FFFFFFFEuL,
|
||||
CodedOutputStream.EncodeZigZag64(unchecked((long) 0x000000007FFFFFFFUL)));
|
||||
Assert.AreEqual(0x00000000FFFFFFFFuL,
|
||||
CodedOutputStream.EncodeZigZag64(unchecked((long) 0xFFFFFFFF80000000UL)));
|
||||
Assert.AreEqual(0xFFFFFFFFFFFFFFFEL,
|
||||
CodedOutputStream.EncodeZigZag64(unchecked((long) 0x7FFFFFFFFFFFFFFFUL)));
|
||||
Assert.AreEqual(0xFFFFFFFFFFFFFFFFL,
|
||||
CodedOutputStream.EncodeZigZag64(unchecked((long) 0x8000000000000000UL)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RoundTripZigZag32()
|
||||
{
|
||||
// Some easier-to-verify round-trip tests. The inputs (other than 0, 1, -1)
|
||||
// were chosen semi-randomly via keyboard bashing.
|
||||
Assert.AreEqual(0, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(0)));
|
||||
Assert.AreEqual(1, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(1)));
|
||||
Assert.AreEqual(-1, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(-1)));
|
||||
Assert.AreEqual(14927, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(14927)));
|
||||
Assert.AreEqual(-3612, CodedInputStream.DecodeZigZag32(CodedOutputStream.EncodeZigZag32(-3612)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RoundTripZigZag64()
|
||||
{
|
||||
Assert.AreEqual(0, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(0)));
|
||||
Assert.AreEqual(1, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(1)));
|
||||
Assert.AreEqual(-1, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(-1)));
|
||||
Assert.AreEqual(14927, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(14927)));
|
||||
Assert.AreEqual(-3612, CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(-3612)));
|
||||
|
||||
Assert.AreEqual(856912304801416L,
|
||||
CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(856912304801416L)));
|
||||
Assert.AreEqual(-75123905439571256L,
|
||||
CodedInputStream.DecodeZigZag64(CodedOutputStream.EncodeZigZag64(-75123905439571256L)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestNegativeEnumNoTag()
|
||||
{
|
||||
Assert.AreEqual(10, CodedOutputStream.ComputeInt32Size(-2));
|
||||
Assert.AreEqual(10, CodedOutputStream.ComputeEnumSize((int) SampleEnum.NegativeValue));
|
||||
|
||||
byte[] bytes = new byte[10];
|
||||
CodedOutputStream output = new CodedOutputStream(bytes);
|
||||
output.WriteEnum((int) SampleEnum.NegativeValue);
|
||||
|
||||
Assert.AreEqual(0, output.SpaceLeft);
|
||||
Assert.AreEqual("FE-FF-FF-FF-FF-FF-FF-FF-FF-01", BitConverter.ToString(bytes));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestCodedInputOutputPosition()
|
||||
{
|
||||
byte[] content = new byte[110];
|
||||
for (int i = 0; i < content.Length; i++)
|
||||
content[i] = (byte)i;
|
||||
|
||||
byte[] child = new byte[120];
|
||||
{
|
||||
MemoryStream ms = new MemoryStream(child);
|
||||
CodedOutputStream cout = new CodedOutputStream(ms, 20);
|
||||
// Field 11: numeric value: 500
|
||||
cout.WriteTag(11, WireFormat.WireType.Varint);
|
||||
Assert.AreEqual(1, cout.Position);
|
||||
cout.WriteInt32(500);
|
||||
Assert.AreEqual(3, cout.Position);
|
||||
//Field 12: length delimited 120 bytes
|
||||
cout.WriteTag(12, WireFormat.WireType.LengthDelimited);
|
||||
Assert.AreEqual(4, cout.Position);
|
||||
cout.WriteBytes(ByteString.CopyFrom(content));
|
||||
Assert.AreEqual(115, cout.Position);
|
||||
// Field 13: fixed numeric value: 501
|
||||
cout.WriteTag(13, WireFormat.WireType.Fixed32);
|
||||
Assert.AreEqual(116, cout.Position);
|
||||
cout.WriteSFixed32(501);
|
||||
Assert.AreEqual(120, cout.Position);
|
||||
cout.Flush();
|
||||
}
|
||||
|
||||
byte[] bytes = new byte[130];
|
||||
{
|
||||
CodedOutputStream cout = new CodedOutputStream(bytes);
|
||||
// Field 1: numeric value: 500
|
||||
cout.WriteTag(1, WireFormat.WireType.Varint);
|
||||
Assert.AreEqual(1, cout.Position);
|
||||
cout.WriteInt32(500);
|
||||
Assert.AreEqual(3, cout.Position);
|
||||
//Field 2: length delimited 120 bytes
|
||||
cout.WriteTag(2, WireFormat.WireType.LengthDelimited);
|
||||
Assert.AreEqual(4, cout.Position);
|
||||
cout.WriteBytes(ByteString.CopyFrom(child));
|
||||
Assert.AreEqual(125, cout.Position);
|
||||
// Field 3: fixed numeric value: 500
|
||||
cout.WriteTag(3, WireFormat.WireType.Fixed32);
|
||||
Assert.AreEqual(126, cout.Position);
|
||||
cout.WriteSFixed32(501);
|
||||
Assert.AreEqual(130, cout.Position);
|
||||
cout.Flush();
|
||||
}
|
||||
// Now test Input stream:
|
||||
{
|
||||
CodedInputStream cin = new CodedInputStream(new MemoryStream(bytes), new byte[50], 0, 0);
|
||||
Assert.AreEqual(0, cin.Position);
|
||||
// Field 1:
|
||||
uint tag = cin.ReadTag();
|
||||
Assert.AreEqual(1, tag >> 3);
|
||||
Assert.AreEqual(1, cin.Position);
|
||||
Assert.AreEqual(500, cin.ReadInt32());
|
||||
Assert.AreEqual(3, cin.Position);
|
||||
//Field 2:
|
||||
tag = cin.ReadTag();
|
||||
Assert.AreEqual(2, tag >> 3);
|
||||
Assert.AreEqual(4, cin.Position);
|
||||
int childlen = cin.ReadLength();
|
||||
Assert.AreEqual(120, childlen);
|
||||
Assert.AreEqual(5, cin.Position);
|
||||
int oldlimit = cin.PushLimit((int)childlen);
|
||||
Assert.AreEqual(5, cin.Position);
|
||||
// Now we are reading child message
|
||||
{
|
||||
// Field 11: numeric value: 500
|
||||
tag = cin.ReadTag();
|
||||
Assert.AreEqual(11, tag >> 3);
|
||||
Assert.AreEqual(6, cin.Position);
|
||||
Assert.AreEqual(500, cin.ReadInt32());
|
||||
Assert.AreEqual(8, cin.Position);
|
||||
//Field 12: length delimited 120 bytes
|
||||
tag = cin.ReadTag();
|
||||
Assert.AreEqual(12, tag >> 3);
|
||||
Assert.AreEqual(9, cin.Position);
|
||||
ByteString bstr = cin.ReadBytes();
|
||||
Assert.AreEqual(110, bstr.Length);
|
||||
Assert.AreEqual((byte) 109, bstr[109]);
|
||||
Assert.AreEqual(120, cin.Position);
|
||||
// Field 13: fixed numeric value: 501
|
||||
tag = cin.ReadTag();
|
||||
Assert.AreEqual(13, tag >> 3);
|
||||
// ROK - Previously broken here, this returned 126 failing to account for bufferSizeAfterLimit
|
||||
Assert.AreEqual(121, cin.Position);
|
||||
Assert.AreEqual(501, cin.ReadSFixed32());
|
||||
Assert.AreEqual(125, cin.Position);
|
||||
Assert.IsTrue(cin.IsAtEnd);
|
||||
}
|
||||
cin.PopLimit(oldlimit);
|
||||
Assert.AreEqual(125, cin.Position);
|
||||
// Field 3: fixed numeric value: 501
|
||||
tag = cin.ReadTag();
|
||||
Assert.AreEqual(3, tag >> 3);
|
||||
Assert.AreEqual(126, cin.Position);
|
||||
Assert.AreEqual(501, cin.ReadSFixed32());
|
||||
Assert.AreEqual(130, cin.Position);
|
||||
Assert.IsTrue(cin.IsAtEnd);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Dispose_DisposesUnderlyingStream()
|
||||
{
|
||||
var memoryStream = new MemoryStream();
|
||||
Assert.IsTrue(memoryStream.CanWrite);
|
||||
using (var cos = new CodedOutputStream(memoryStream))
|
||||
{
|
||||
cos.WriteRawByte(0);
|
||||
Assert.AreEqual(0, memoryStream.Position); // Not flushed yet
|
||||
}
|
||||
Assert.AreEqual(1, memoryStream.ToArray().Length); // Flushed data from CodedOutputStream to MemoryStream
|
||||
Assert.IsFalse(memoryStream.CanWrite); // Disposed
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Dispose_WithLeaveOpen()
|
||||
{
|
||||
var memoryStream = new MemoryStream();
|
||||
Assert.IsTrue(memoryStream.CanWrite);
|
||||
using (var cos = new CodedOutputStream(memoryStream, true))
|
||||
{
|
||||
cos.WriteRawByte(0);
|
||||
Assert.AreEqual(0, memoryStream.Position); // Not flushed yet
|
||||
}
|
||||
Assert.AreEqual(1, memoryStream.Position); // Flushed data from CodedOutputStream to MemoryStream
|
||||
Assert.IsTrue(memoryStream.CanWrite); // We left the stream open
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,532 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Google.Protobuf.TestProtos;
|
||||
using NUnit.Framework;
|
||||
using System.Collections;
|
||||
using System.Linq;
|
||||
|
||||
namespace Google.Protobuf.Collections
|
||||
{
|
||||
/// <summary>
|
||||
/// Tests for MapField which aren't reliant on the encoded format -
|
||||
/// tests for serialization/deserialization are part of GeneratedMessageTest.
|
||||
/// </summary>
|
||||
public class MapFieldTest
|
||||
{
|
||||
[Test]
|
||||
public void Clone_ClonesMessages()
|
||||
{
|
||||
var message = new ForeignMessage { C = 20 };
|
||||
var map = new MapField<string, ForeignMessage> { { "x", message } };
|
||||
var clone = map.Clone();
|
||||
map["x"].C = 30;
|
||||
Assert.AreEqual(20, clone["x"].C);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NullValuesProhibited()
|
||||
{
|
||||
TestNullValues<int?>(0);
|
||||
TestNullValues("");
|
||||
TestNullValues(new TestAllTypes());
|
||||
}
|
||||
|
||||
private void TestNullValues<T>(T nonNullValue)
|
||||
{
|
||||
var map = new MapField<int, T>();
|
||||
var nullValue = (T) (object) null;
|
||||
Assert.Throws<ArgumentNullException>(() => map.Add(0, nullValue));
|
||||
Assert.Throws<ArgumentNullException>(() => map[0] = nullValue);
|
||||
map.Add(1, nonNullValue);
|
||||
map[1] = nonNullValue;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Add_ForbidsNullKeys()
|
||||
{
|
||||
var map = new MapField<string, ForeignMessage>();
|
||||
Assert.Throws<ArgumentNullException>(() => map.Add(null, new ForeignMessage()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Indexer_ForbidsNullKeys()
|
||||
{
|
||||
var map = new MapField<string, ForeignMessage>();
|
||||
Assert.Throws<ArgumentNullException>(() => map[null] = new ForeignMessage());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddPreservesInsertionOrder()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
map.Add("a", "v1");
|
||||
map.Add("b", "v2");
|
||||
map.Add("c", "v3");
|
||||
map.Remove("b");
|
||||
map.Add("d", "v4");
|
||||
CollectionAssert.AreEqual(new[] { "a", "c", "d" }, map.Keys);
|
||||
CollectionAssert.AreEqual(new[] { "v1", "v3", "v4" }, map.Values);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EqualityIsOrderInsensitive()
|
||||
{
|
||||
var map1 = new MapField<string, string>();
|
||||
map1.Add("a", "v1");
|
||||
map1.Add("b", "v2");
|
||||
|
||||
var map2 = new MapField<string, string>();
|
||||
map2.Add("b", "v2");
|
||||
map2.Add("a", "v1");
|
||||
|
||||
EqualityTester.AssertEquality(map1, map2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EqualityIsKeySensitive()
|
||||
{
|
||||
var map1 = new MapField<string, string>();
|
||||
map1.Add("first key", "v1");
|
||||
map1.Add("second key", "v2");
|
||||
|
||||
var map2 = new MapField<string, string>();
|
||||
map2.Add("third key", "v1");
|
||||
map2.Add("fourth key", "v2");
|
||||
|
||||
EqualityTester.AssertInequality(map1, map2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Equality_Simple()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
EqualityTester.AssertEquality(map, map);
|
||||
EqualityTester.AssertInequality(map, null);
|
||||
Assert.IsFalse(map.Equals(new object()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EqualityIsValueSensitive()
|
||||
{
|
||||
// Note: Without some care, it's a little easier than one might
|
||||
// hope to see hash collisions, but only in some environments...
|
||||
var map1 = new MapField<string, string>();
|
||||
map1.Add("a", "first value");
|
||||
map1.Add("b", "second value");
|
||||
|
||||
var map2 = new MapField<string, string>();
|
||||
map2.Add("a", "third value");
|
||||
map2.Add("b", "fourth value");
|
||||
|
||||
EqualityTester.AssertInequality(map1, map2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Add_Dictionary()
|
||||
{
|
||||
var map1 = new MapField<string, string>
|
||||
{
|
||||
{ "x", "y" },
|
||||
{ "a", "b" }
|
||||
};
|
||||
var map2 = new MapField<string, string>
|
||||
{
|
||||
{ "before", "" },
|
||||
map1,
|
||||
{ "after", "" }
|
||||
};
|
||||
var expected = new MapField<string, string>
|
||||
{
|
||||
{ "before", "" },
|
||||
{ "x", "y" },
|
||||
{ "a", "b" },
|
||||
{ "after", "" }
|
||||
};
|
||||
Assert.AreEqual(expected, map2);
|
||||
CollectionAssert.AreEqual(new[] { "before", "x", "a", "after" }, map2.Keys);
|
||||
}
|
||||
|
||||
// General IDictionary<TKey, TValue> behavior tests
|
||||
[Test]
|
||||
public void Add_KeyAlreadyExists()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
map.Add("foo", "bar");
|
||||
Assert.Throws<ArgumentException>(() => map.Add("foo", "baz"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Add_Pair()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
ICollection<KeyValuePair<string, string>> collection = map;
|
||||
collection.Add(NewKeyValuePair("x", "y"));
|
||||
Assert.AreEqual("y", map["x"]);
|
||||
Assert.Throws<ArgumentException>(() => collection.Add(NewKeyValuePair("x", "z")));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Contains_Pair()
|
||||
{
|
||||
var map = new MapField<string, string> { { "x", "y" } };
|
||||
ICollection<KeyValuePair<string, string>> collection = map;
|
||||
Assert.IsTrue(collection.Contains(NewKeyValuePair("x", "y")));
|
||||
Assert.IsFalse(collection.Contains(NewKeyValuePair("x", "z")));
|
||||
Assert.IsFalse(collection.Contains(NewKeyValuePair("z", "y")));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Remove_Key()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
map.Add("foo", "bar");
|
||||
Assert.AreEqual(1, map.Count);
|
||||
Assert.IsFalse(map.Remove("missing"));
|
||||
Assert.AreEqual(1, map.Count);
|
||||
Assert.IsTrue(map.Remove("foo"));
|
||||
Assert.AreEqual(0, map.Count);
|
||||
Assert.Throws<ArgumentNullException>(() => map.Remove(null));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Remove_Pair()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
map.Add("foo", "bar");
|
||||
ICollection<KeyValuePair<string, string>> collection = map;
|
||||
Assert.AreEqual(1, map.Count);
|
||||
Assert.IsFalse(collection.Remove(NewKeyValuePair("wrong key", "bar")));
|
||||
Assert.AreEqual(1, map.Count);
|
||||
Assert.IsFalse(collection.Remove(NewKeyValuePair("foo", "wrong value")));
|
||||
Assert.AreEqual(1, map.Count);
|
||||
Assert.IsTrue(collection.Remove(NewKeyValuePair("foo", "bar")));
|
||||
Assert.AreEqual(0, map.Count);
|
||||
Assert.Throws<ArgumentException>(() => collection.Remove(new KeyValuePair<string, string>(null, "")));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CopyTo_Pair()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
map.Add("foo", "bar");
|
||||
ICollection<KeyValuePair<string, string>> collection = map;
|
||||
KeyValuePair<string, string>[] array = new KeyValuePair<string, string>[3];
|
||||
collection.CopyTo(array, 1);
|
||||
Assert.AreEqual(NewKeyValuePair("foo", "bar"), array[1]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Clear()
|
||||
{
|
||||
var map = new MapField<string, string> { { "x", "y" } };
|
||||
Assert.AreEqual(1, map.Count);
|
||||
map.Clear();
|
||||
Assert.AreEqual(0, map.Count);
|
||||
map.Add("x", "y");
|
||||
Assert.AreEqual(1, map.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Indexer_Get()
|
||||
{
|
||||
var map = new MapField<string, string> { { "x", "y" } };
|
||||
Assert.AreEqual("y", map["x"]);
|
||||
Assert.Throws<KeyNotFoundException>(() => { var ignored = map["z"]; });
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Indexer_Set()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
map["x"] = "y";
|
||||
Assert.AreEqual("y", map["x"]);
|
||||
map["x"] = "z"; // This won't throw, unlike Add.
|
||||
Assert.AreEqual("z", map["x"]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetEnumerator_NonGeneric()
|
||||
{
|
||||
IEnumerable map = new MapField<string, string> { { "x", "y" } };
|
||||
CollectionAssert.AreEqual(new[] { new KeyValuePair<string, string>("x", "y") },
|
||||
map.Cast<object>().ToList());
|
||||
}
|
||||
|
||||
// Test for the explicitly-implemented non-generic IDictionary interface
|
||||
[Test]
|
||||
public void IDictionary_GetEnumerator()
|
||||
{
|
||||
IDictionary map = new MapField<string, string> { { "x", "y" } };
|
||||
var enumerator = map.GetEnumerator();
|
||||
|
||||
// Commented assertions show an ideal situation - it looks like
|
||||
// the LinkedList enumerator doesn't throw when you ask for the current entry
|
||||
// at an inappropriate time; fixing this would be more work than it's worth.
|
||||
// Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
|
||||
Assert.IsTrue(enumerator.MoveNext());
|
||||
Assert.AreEqual("x", enumerator.Key);
|
||||
Assert.AreEqual("y", enumerator.Value);
|
||||
Assert.AreEqual(new DictionaryEntry("x", "y"), enumerator.Current);
|
||||
Assert.AreEqual(new DictionaryEntry("x", "y"), enumerator.Entry);
|
||||
Assert.IsFalse(enumerator.MoveNext());
|
||||
// Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
|
||||
enumerator.Reset();
|
||||
// Assert.Throws<InvalidOperationException>(() => enumerator.Current.GetHashCode());
|
||||
Assert.IsTrue(enumerator.MoveNext());
|
||||
Assert.AreEqual("x", enumerator.Key); // Assume the rest are okay
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_Add()
|
||||
{
|
||||
var map = new MapField<string, string> { { "x", "y" } };
|
||||
IDictionary dictionary = map;
|
||||
dictionary.Add("a", "b");
|
||||
Assert.AreEqual("b", map["a"]);
|
||||
Assert.Throws<ArgumentException>(() => dictionary.Add("a", "duplicate"));
|
||||
Assert.Throws<InvalidCastException>(() => dictionary.Add(new object(), "key is bad"));
|
||||
Assert.Throws<InvalidCastException>(() => dictionary.Add("value is bad", new object()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_Contains()
|
||||
{
|
||||
var map = new MapField<string, string> { { "x", "y" } };
|
||||
IDictionary dictionary = map;
|
||||
|
||||
Assert.IsFalse(dictionary.Contains("a"));
|
||||
Assert.IsFalse(dictionary.Contains(5));
|
||||
// Surprising, but IDictionary.Contains is only about keys.
|
||||
Assert.IsFalse(dictionary.Contains(new DictionaryEntry("x", "y")));
|
||||
Assert.IsTrue(dictionary.Contains("x"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_Remove()
|
||||
{
|
||||
var map = new MapField<string, string> { { "x", "y" } };
|
||||
IDictionary dictionary = map;
|
||||
dictionary.Remove("a");
|
||||
Assert.AreEqual(1, dictionary.Count);
|
||||
dictionary.Remove(5);
|
||||
Assert.AreEqual(1, dictionary.Count);
|
||||
dictionary.Remove(new DictionaryEntry("x", "y"));
|
||||
Assert.AreEqual(1, dictionary.Count);
|
||||
dictionary.Remove("x");
|
||||
Assert.AreEqual(0, dictionary.Count);
|
||||
Assert.Throws<ArgumentNullException>(() => dictionary.Remove(null));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_CopyTo()
|
||||
{
|
||||
var map = new MapField<string, string> { { "x", "y" } };
|
||||
IDictionary dictionary = map;
|
||||
var array = new DictionaryEntry[3];
|
||||
dictionary.CopyTo(array, 1);
|
||||
CollectionAssert.AreEqual(new[] { default(DictionaryEntry), new DictionaryEntry("x", "y"), default(DictionaryEntry) },
|
||||
array);
|
||||
var objectArray = new object[3];
|
||||
dictionary.CopyTo(objectArray, 1);
|
||||
CollectionAssert.AreEqual(new object[] { null, new DictionaryEntry("x", "y"), null },
|
||||
objectArray);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_IsFixedSize()
|
||||
{
|
||||
var map = new MapField<string, string> { { "x", "y" } };
|
||||
IDictionary dictionary = map;
|
||||
Assert.IsFalse(dictionary.IsFixedSize);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_Keys()
|
||||
{
|
||||
IDictionary dictionary = new MapField<string, string> { { "x", "y" } };
|
||||
CollectionAssert.AreEqual(new[] { "x" }, dictionary.Keys);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_Values()
|
||||
{
|
||||
IDictionary dictionary = new MapField<string, string> { { "x", "y" } };
|
||||
CollectionAssert.AreEqual(new[] { "y" }, dictionary.Values);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_IsSynchronized()
|
||||
{
|
||||
IDictionary dictionary = new MapField<string, string> { { "x", "y" } };
|
||||
Assert.IsFalse(dictionary.IsSynchronized);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_SyncRoot()
|
||||
{
|
||||
IDictionary dictionary = new MapField<string, string> { { "x", "y" } };
|
||||
Assert.AreSame(dictionary, dictionary.SyncRoot);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_Indexer_Get()
|
||||
{
|
||||
IDictionary dictionary = new MapField<string, string> { { "x", "y" } };
|
||||
Assert.AreEqual("y", dictionary["x"]);
|
||||
Assert.IsNull(dictionary["a"]);
|
||||
Assert.IsNull(dictionary[5]);
|
||||
Assert.Throws<ArgumentNullException>(() => dictionary[null].GetHashCode());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IDictionary_Indexer_Set()
|
||||
{
|
||||
var map = new MapField<string, string> { { "x", "y" } };
|
||||
IDictionary dictionary = map;
|
||||
map["a"] = "b";
|
||||
Assert.AreEqual("b", map["a"]);
|
||||
map["a"] = "c";
|
||||
Assert.AreEqual("c", map["a"]);
|
||||
Assert.Throws<InvalidCastException>(() => dictionary[5] = "x");
|
||||
Assert.Throws<InvalidCastException>(() => dictionary["x"] = 5);
|
||||
Assert.Throws<ArgumentNullException>(() => dictionary[null] = "z");
|
||||
Assert.Throws<ArgumentNullException>(() => dictionary["x"] = null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void KeysReturnsLiveView()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
var keys = map.Keys;
|
||||
CollectionAssert.AreEqual(new string[0], keys);
|
||||
map["foo"] = "bar";
|
||||
map["x"] = "y";
|
||||
CollectionAssert.AreEqual(new[] { "foo", "x" }, keys);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ValuesReturnsLiveView()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
var values = map.Values;
|
||||
CollectionAssert.AreEqual(new string[0], values);
|
||||
map["foo"] = "bar";
|
||||
map["x"] = "y";
|
||||
CollectionAssert.AreEqual(new[] { "bar", "y" }, values);
|
||||
}
|
||||
|
||||
// Just test keys - we know the implementation is the same for values
|
||||
[Test]
|
||||
public void ViewsAreReadOnly()
|
||||
{
|
||||
var map = new MapField<string, string>();
|
||||
var keys = map.Keys;
|
||||
Assert.IsTrue(keys.IsReadOnly);
|
||||
Assert.Throws<NotSupportedException>(() => keys.Clear());
|
||||
Assert.Throws<NotSupportedException>(() => keys.Remove("a"));
|
||||
Assert.Throws<NotSupportedException>(() => keys.Add("a"));
|
||||
}
|
||||
|
||||
// Just test keys - we know the implementation is the same for values
|
||||
[Test]
|
||||
public void ViewCopyTo()
|
||||
{
|
||||
var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
|
||||
var keys = map.Keys;
|
||||
var array = new string[4];
|
||||
Assert.Throws<ArgumentException>(() => keys.CopyTo(array, 3));
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => keys.CopyTo(array, -1));
|
||||
keys.CopyTo(array, 1);
|
||||
CollectionAssert.AreEqual(new[] { null, "foo", "x", null }, array);
|
||||
}
|
||||
|
||||
// Just test keys - we know the implementation is the same for values
|
||||
[Test]
|
||||
public void NonGenericViewCopyTo()
|
||||
{
|
||||
IDictionary map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
|
||||
ICollection keys = map.Keys;
|
||||
// Note the use of the Array type here rather than string[]
|
||||
Array array = new string[4];
|
||||
Assert.Throws<ArgumentException>(() => keys.CopyTo(array, 3));
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => keys.CopyTo(array, -1));
|
||||
keys.CopyTo(array, 1);
|
||||
CollectionAssert.AreEqual(new[] { null, "foo", "x", null }, array);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void KeysContains()
|
||||
{
|
||||
var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
|
||||
var keys = map.Keys;
|
||||
Assert.IsTrue(keys.Contains("foo"));
|
||||
Assert.IsFalse(keys.Contains("bar")); // It's a value!
|
||||
Assert.IsFalse(keys.Contains("1"));
|
||||
// Keys can't be null, so we should prevent contains check
|
||||
Assert.Throws<ArgumentNullException>(() => keys.Contains(null));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ValuesContains()
|
||||
{
|
||||
var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
|
||||
var values = map.Values;
|
||||
Assert.IsTrue(values.Contains("bar"));
|
||||
Assert.IsFalse(values.Contains("foo")); // It's a key!
|
||||
Assert.IsFalse(values.Contains("1"));
|
||||
// Values can be null, so this makes sense
|
||||
Assert.IsFalse(values.Contains(null));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_StringToString()
|
||||
{
|
||||
var map = new MapField<string, string> { { "foo", "bar" }, { "x", "y" } };
|
||||
Assert.AreEqual("{ \"foo\": \"bar\", \"x\": \"y\" }", map.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_UnsupportedKeyType()
|
||||
{
|
||||
var map = new MapField<byte, string> { { 10, "foo" } };
|
||||
Assert.Throws<ArgumentException>(() => map.ToString());
|
||||
}
|
||||
|
||||
private static KeyValuePair<TKey, TValue> NewKeyValuePair<TKey, TValue>(TKey key, TValue value)
|
||||
{
|
||||
return new KeyValuePair<TKey, TValue>(key, value);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,746 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Google.Protobuf.TestProtos;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf.Collections
|
||||
{
|
||||
public class RepeatedFieldTest
|
||||
{
|
||||
[Test]
|
||||
public void NullValuesRejected()
|
||||
{
|
||||
var list = new RepeatedField<string>();
|
||||
Assert.Throws<ArgumentNullException>(() => list.Add((string)null));
|
||||
Assert.Throws<ArgumentNullException>(() => list.Add((IEnumerable<string>)null));
|
||||
Assert.Throws<ArgumentNullException>(() => list.Add((RepeatedField<string>)null));
|
||||
Assert.Throws<ArgumentNullException>(() => list.Contains(null));
|
||||
Assert.Throws<ArgumentNullException>(() => list.IndexOf(null));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Add_SingleItem()
|
||||
{
|
||||
var list = new RepeatedField<string>();
|
||||
list.Add("foo");
|
||||
Assert.AreEqual(1, list.Count);
|
||||
Assert.AreEqual("foo", list[0]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Add_Sequence()
|
||||
{
|
||||
var list = new RepeatedField<string>();
|
||||
list.Add(new[] { "foo", "bar" });
|
||||
Assert.AreEqual(2, list.Count);
|
||||
Assert.AreEqual("foo", list[0]);
|
||||
Assert.AreEqual("bar", list[1]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddRange_SlowPath()
|
||||
{
|
||||
var list = new RepeatedField<string>();
|
||||
list.AddRange(new[] { "foo", "bar" }.Select(x => x));
|
||||
Assert.AreEqual(2, list.Count);
|
||||
Assert.AreEqual("foo", list[0]);
|
||||
Assert.AreEqual("bar", list[1]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddRange_SlowPath_NullsProhibited_ReferenceType()
|
||||
{
|
||||
var list = new RepeatedField<string>();
|
||||
// It's okay for this to throw ArgumentNullException if necessary.
|
||||
// It's not ideal, but not awful.
|
||||
Assert.Catch<ArgumentException>(() => list.AddRange(new[] { "foo", null }.Select(x => x)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddRange_SlowPath_NullsProhibited_NullableValueType()
|
||||
{
|
||||
var list = new RepeatedField<int?>();
|
||||
// It's okay for this to throw ArgumentNullException if necessary.
|
||||
// It's not ideal, but not awful.
|
||||
Assert.Catch<ArgumentException>(() => list.AddRange(new[] { 20, (int?)null }.Select(x => x)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddRange_Optimized_NonNullableValueType()
|
||||
{
|
||||
var list = new RepeatedField<int>();
|
||||
list.AddRange(new List<int> { 20, 30 });
|
||||
Assert.AreEqual(2, list.Count);
|
||||
Assert.AreEqual(20, list[0]);
|
||||
Assert.AreEqual(30, list[1]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddRange_Optimized_ReferenceType()
|
||||
{
|
||||
var list = new RepeatedField<string>();
|
||||
list.AddRange(new List<string> { "foo", "bar" });
|
||||
Assert.AreEqual(2, list.Count);
|
||||
Assert.AreEqual("foo", list[0]);
|
||||
Assert.AreEqual("bar", list[1]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddRange_Optimized_NullableValueType()
|
||||
{
|
||||
var list = new RepeatedField<int?>();
|
||||
list.AddRange(new List<int?> { 20, 30 });
|
||||
Assert.AreEqual(2, list.Count);
|
||||
Assert.AreEqual((int?) 20, list[0]);
|
||||
Assert.AreEqual((int?) 30, list[1]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddRange_Optimized_NullsProhibited_ReferenceType()
|
||||
{
|
||||
// We don't just trust that a collection with a nullable element type doesn't contain nulls
|
||||
var list = new RepeatedField<string>();
|
||||
// It's okay for this to throw ArgumentNullException if necessary.
|
||||
// It's not ideal, but not awful.
|
||||
Assert.Catch<ArgumentException>(() => list.AddRange(new List<string> { "foo", null }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddRange_Optimized_NullsProhibited_NullableValueType()
|
||||
{
|
||||
// We don't just trust that a collection with a nullable element type doesn't contain nulls
|
||||
var list = new RepeatedField<int?>();
|
||||
// It's okay for this to throw ArgumentNullException if necessary.
|
||||
// It's not ideal, but not awful.
|
||||
Assert.Catch<ArgumentException>(() => list.AddRange(new List<int?> { 20, null }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddRange_AlreadyNotEmpty()
|
||||
{
|
||||
var list = new RepeatedField<int> { 1, 2, 3 };
|
||||
list.AddRange(new List<int> { 4, 5, 6 });
|
||||
CollectionAssert.AreEqual(new[] { 1, 2, 3, 4, 5, 6 }, list);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddRange_RepeatedField()
|
||||
{
|
||||
var list = new RepeatedField<string> { "original" };
|
||||
list.AddRange(new RepeatedField<string> { "foo", "bar" });
|
||||
Assert.AreEqual(3, list.Count);
|
||||
Assert.AreEqual("original", list[0]);
|
||||
Assert.AreEqual("foo", list[1]);
|
||||
Assert.AreEqual("bar", list[2]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RemoveAt_Valid()
|
||||
{
|
||||
var list = new RepeatedField<string> { "first", "second", "third" };
|
||||
list.RemoveAt(1);
|
||||
CollectionAssert.AreEqual(new[] { "first", "third" }, list);
|
||||
// Just check that these don't throw...
|
||||
list.RemoveAt(list.Count - 1); // Now the count will be 1...
|
||||
list.RemoveAt(0);
|
||||
Assert.AreEqual(0, list.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RemoveAt_Invalid()
|
||||
{
|
||||
var list = new RepeatedField<string> { "first", "second", "third" };
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => list.RemoveAt(-1));
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => list.RemoveAt(3));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Insert_Valid()
|
||||
{
|
||||
var list = new RepeatedField<string> { "first", "second" };
|
||||
list.Insert(1, "middle");
|
||||
CollectionAssert.AreEqual(new[] { "first", "middle", "second" }, list);
|
||||
list.Insert(3, "end");
|
||||
CollectionAssert.AreEqual(new[] { "first", "middle", "second", "end" }, list);
|
||||
list.Insert(0, "start");
|
||||
CollectionAssert.AreEqual(new[] { "start", "first", "middle", "second", "end" }, list);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Insert_Invalid()
|
||||
{
|
||||
var list = new RepeatedField<string> { "first", "second" };
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => list.Insert(-1, "foo"));
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => list.Insert(3, "foo"));
|
||||
Assert.Throws<ArgumentNullException>(() => list.Insert(0, null));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Equals_RepeatedField()
|
||||
{
|
||||
var list = new RepeatedField<string> { "first", "second" };
|
||||
Assert.IsFalse(list.Equals((RepeatedField<string>) null));
|
||||
Assert.IsTrue(list.Equals(list));
|
||||
Assert.IsFalse(list.Equals(new RepeatedField<string> { "first", "third" }));
|
||||
Assert.IsFalse(list.Equals(new RepeatedField<string> { "first" }));
|
||||
Assert.IsTrue(list.Equals(new RepeatedField<string> { "first", "second" }));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Equals_Object()
|
||||
{
|
||||
var list = new RepeatedField<string> { "first", "second" };
|
||||
Assert.IsFalse(list.Equals((object) null));
|
||||
Assert.IsTrue(list.Equals((object) list));
|
||||
Assert.IsFalse(list.Equals((object) new RepeatedField<string> { "first", "third" }));
|
||||
Assert.IsFalse(list.Equals((object) new RepeatedField<string> { "first" }));
|
||||
Assert.IsTrue(list.Equals((object) new RepeatedField<string> { "first", "second" }));
|
||||
Assert.IsFalse(list.Equals(new object()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetEnumerator_GenericInterface()
|
||||
{
|
||||
IEnumerable<string> list = new RepeatedField<string> { "first", "second" };
|
||||
// Select gets rid of the optimizations in ToList...
|
||||
CollectionAssert.AreEqual(new[] { "first", "second" }, list.Select(x => x).ToList());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetEnumerator_NonGenericInterface()
|
||||
{
|
||||
IEnumerable list = new RepeatedField<string> { "first", "second" };
|
||||
CollectionAssert.AreEqual(new[] { "first", "second" }, list.Cast<object>().ToList());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CopyTo()
|
||||
{
|
||||
var list = new RepeatedField<string> { "first", "second" };
|
||||
string[] stringArray = new string[4];
|
||||
list.CopyTo(stringArray, 1);
|
||||
CollectionAssert.AreEqual(new[] { null, "first", "second", null }, stringArray);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Indexer_Get()
|
||||
{
|
||||
var list = new RepeatedField<string> { "first", "second" };
|
||||
Assert.AreEqual("first", list[0]);
|
||||
Assert.AreEqual("second", list[1]);
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => list[-1].GetHashCode());
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => list[2].GetHashCode());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Indexer_Set()
|
||||
{
|
||||
var list = new RepeatedField<string> { "first", "second" };
|
||||
list[0] = "changed";
|
||||
Assert.AreEqual("changed", list[0]);
|
||||
Assert.Throws<ArgumentNullException>(() => list[0] = null);
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => list[-1] = "bad");
|
||||
Assert.Throws<ArgumentOutOfRangeException>(() => list[2] = "bad");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Clone_ReturnsMutable()
|
||||
{
|
||||
var list = new RepeatedField<int> { 0 };
|
||||
var clone = list.Clone();
|
||||
clone[0] = 1;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Enumerator()
|
||||
{
|
||||
var list = new RepeatedField<string> { "first", "second" };
|
||||
using (var enumerator = list.GetEnumerator())
|
||||
{
|
||||
Assert.IsTrue(enumerator.MoveNext());
|
||||
Assert.AreEqual("first", enumerator.Current);
|
||||
Assert.IsTrue(enumerator.MoveNext());
|
||||
Assert.AreEqual("second", enumerator.Current);
|
||||
Assert.IsFalse(enumerator.MoveNext());
|
||||
Assert.IsFalse(enumerator.MoveNext());
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddEntriesFrom_PackedInt32()
|
||||
{
|
||||
uint packedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
var length = CodedOutputStream.ComputeInt32Size(10)
|
||||
+ CodedOutputStream.ComputeInt32Size(999)
|
||||
+ CodedOutputStream.ComputeInt32Size(-1000);
|
||||
output.WriteTag(packedTag);
|
||||
output.WriteRawVarint32((uint) length);
|
||||
output.WriteInt32(10);
|
||||
output.WriteInt32(999);
|
||||
output.WriteInt32(-1000);
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
// Deliberately "expecting" a non-packed tag, but we detect that the data is
|
||||
// actually packed.
|
||||
uint nonPackedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
|
||||
var field = new RepeatedField<int>();
|
||||
var input = new CodedInputStream(stream);
|
||||
input.AssertNextTag(packedTag);
|
||||
field.AddEntriesFrom(input, FieldCodec.ForInt32(nonPackedTag));
|
||||
CollectionAssert.AreEqual(new[] { 10, 999, -1000 }, field);
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddEntriesFrom_NonPackedInt32()
|
||||
{
|
||||
uint nonPackedTag = WireFormat.MakeTag(10, WireFormat.WireType.Varint);
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
output.WriteTag(nonPackedTag);
|
||||
output.WriteInt32(10);
|
||||
output.WriteTag(nonPackedTag);
|
||||
output.WriteInt32(999);
|
||||
output.WriteTag(nonPackedTag);
|
||||
output.WriteInt32(-1000); // Just for variety...
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
// Deliberately "expecting" a packed tag, but we detect that the data is
|
||||
// actually not packed.
|
||||
uint packedTag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
|
||||
var field = new RepeatedField<int>();
|
||||
var input = new CodedInputStream(stream);
|
||||
input.AssertNextTag(nonPackedTag);
|
||||
field.AddEntriesFrom(input, FieldCodec.ForInt32(packedTag));
|
||||
CollectionAssert.AreEqual(new[] { 10, 999, -1000 }, field);
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddEntriesFrom_String()
|
||||
{
|
||||
uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
output.WriteTag(tag);
|
||||
output.WriteString("Foo");
|
||||
output.WriteTag(tag);
|
||||
output.WriteString("");
|
||||
output.WriteTag(tag);
|
||||
output.WriteString("Bar");
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
var field = new RepeatedField<string>();
|
||||
var input = new CodedInputStream(stream);
|
||||
input.AssertNextTag(tag);
|
||||
field.AddEntriesFrom(input, FieldCodec.ForString(tag));
|
||||
CollectionAssert.AreEqual(new[] { "Foo", "", "Bar" }, field);
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AddEntriesFrom_Message()
|
||||
{
|
||||
var message1 = new ForeignMessage { C = 2000 };
|
||||
var message2 = new ForeignMessage { C = -250 };
|
||||
|
||||
uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
output.WriteTag(tag);
|
||||
output.WriteMessage(message1);
|
||||
output.WriteTag(tag);
|
||||
output.WriteMessage(message2);
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
var field = new RepeatedField<ForeignMessage>();
|
||||
var input = new CodedInputStream(stream);
|
||||
input.AssertNextTag(tag);
|
||||
field.AddEntriesFrom(input, FieldCodec.ForMessage(tag, ForeignMessage.Parser));
|
||||
CollectionAssert.AreEqual(new[] { message1, message2}, field);
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteTo_PackedInt32()
|
||||
{
|
||||
uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
|
||||
var field = new RepeatedField<int> { 10, 1000, 1000000 };
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
field.WriteTo(output, FieldCodec.ForInt32(tag));
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
var input = new CodedInputStream(stream);
|
||||
input.AssertNextTag(tag);
|
||||
var length = input.ReadLength();
|
||||
Assert.AreEqual(10, input.ReadInt32());
|
||||
Assert.AreEqual(1000, input.ReadInt32());
|
||||
Assert.AreEqual(1000000, input.ReadInt32());
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
Assert.AreEqual(1 + CodedOutputStream.ComputeLengthSize(length) + length, stream.Length);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteTo_NonPackedInt32()
|
||||
{
|
||||
uint tag = WireFormat.MakeTag(10, WireFormat.WireType.Varint);
|
||||
var field = new RepeatedField<int> { 10, 1000, 1000000};
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
field.WriteTo(output, FieldCodec.ForInt32(tag));
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
var input = new CodedInputStream(stream);
|
||||
input.AssertNextTag(tag);
|
||||
Assert.AreEqual(10, input.ReadInt32());
|
||||
input.AssertNextTag(tag);
|
||||
Assert.AreEqual(1000, input.ReadInt32());
|
||||
input.AssertNextTag(tag);
|
||||
Assert.AreEqual(1000000, input.ReadInt32());
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteTo_String()
|
||||
{
|
||||
uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
|
||||
var field = new RepeatedField<string> { "Foo", "", "Bar" };
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
field.WriteTo(output, FieldCodec.ForString(tag));
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
var input = new CodedInputStream(stream);
|
||||
input.AssertNextTag(tag);
|
||||
Assert.AreEqual("Foo", input.ReadString());
|
||||
input.AssertNextTag(tag);
|
||||
Assert.AreEqual("", input.ReadString());
|
||||
input.AssertNextTag(tag);
|
||||
Assert.AreEqual("Bar", input.ReadString());
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WriteTo_Message()
|
||||
{
|
||||
var message1 = new ForeignMessage { C = 20 };
|
||||
var message2 = new ForeignMessage { C = 25 };
|
||||
uint tag = WireFormat.MakeTag(10, WireFormat.WireType.LengthDelimited);
|
||||
var field = new RepeatedField<ForeignMessage> { message1, message2 };
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
field.WriteTo(output, FieldCodec.ForMessage(tag, ForeignMessage.Parser));
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
var input = new CodedInputStream(stream);
|
||||
input.AssertNextTag(tag);
|
||||
Assert.AreEqual(message1, input.ReadMessage(ForeignMessage.Parser));
|
||||
input.AssertNextTag(tag);
|
||||
Assert.AreEqual(message2, input.ReadMessage(ForeignMessage.Parser));
|
||||
Assert.IsTrue(input.IsAtEnd);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSize_VariableSizeNonPacked()
|
||||
{
|
||||
var list = new RepeatedField<int> { 1, 500, 1 };
|
||||
var tag = WireFormat.MakeTag(1, WireFormat.WireType.Varint);
|
||||
// 2 bytes for the first entry, 3 bytes for the second, 2 bytes for the third
|
||||
Assert.AreEqual(7, list.CalculateSize(FieldCodec.ForInt32(tag)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSize_FixedSizeNonPacked()
|
||||
{
|
||||
var list = new RepeatedField<int> { 1, 500, 1 };
|
||||
var tag = WireFormat.MakeTag(1, WireFormat.WireType.Fixed32);
|
||||
// 5 bytes for the each entry
|
||||
Assert.AreEqual(15, list.CalculateSize(FieldCodec.ForSFixed32(tag)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSize_VariableSizePacked()
|
||||
{
|
||||
var list = new RepeatedField<int> { 1, 500, 1};
|
||||
var tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
|
||||
// 1 byte for the tag, 1 byte for the length,
|
||||
// 1 byte for the first entry, 2 bytes for the second, 1 byte for the third
|
||||
Assert.AreEqual(6, list.CalculateSize(FieldCodec.ForInt32(tag)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateSize_FixedSizePacked()
|
||||
{
|
||||
var list = new RepeatedField<int> { 1, 500, 1 };
|
||||
var tag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
|
||||
// 1 byte for the tag, 1 byte for the length, 4 bytes per entry
|
||||
Assert.AreEqual(14, list.CalculateSize(FieldCodec.ForSFixed32(tag)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestNegativeEnumArray()
|
||||
{
|
||||
int arraySize = 1 + 1 + (11 * 5);
|
||||
int msgSize = arraySize;
|
||||
byte[] bytes = new byte[msgSize];
|
||||
CodedOutputStream output = new CodedOutputStream(bytes);
|
||||
uint tag = WireFormat.MakeTag(8, WireFormat.WireType.Varint);
|
||||
for (int i = 0; i >= -5; i--)
|
||||
{
|
||||
output.WriteTag(tag);
|
||||
output.WriteEnum(i);
|
||||
}
|
||||
|
||||
Assert.AreEqual(0, output.SpaceLeft);
|
||||
|
||||
CodedInputStream input = new CodedInputStream(bytes);
|
||||
tag = input.ReadTag();
|
||||
|
||||
RepeatedField<SampleEnum> values = new RepeatedField<SampleEnum>();
|
||||
values.AddEntriesFrom(input, FieldCodec.ForEnum(tag, x => (int)x, x => (SampleEnum)x));
|
||||
|
||||
Assert.AreEqual(6, values.Count);
|
||||
Assert.AreEqual(SampleEnum.None, values[0]);
|
||||
Assert.AreEqual(((SampleEnum)(-1)), values[1]);
|
||||
Assert.AreEqual(SampleEnum.NegativeValue, values[2]);
|
||||
Assert.AreEqual(((SampleEnum)(-3)), values[3]);
|
||||
Assert.AreEqual(((SampleEnum)(-4)), values[4]);
|
||||
Assert.AreEqual(((SampleEnum)(-5)), values[5]);
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void TestNegativeEnumPackedArray()
|
||||
{
|
||||
int arraySize = 1 + (10 * 5);
|
||||
int msgSize = 1 + 1 + arraySize;
|
||||
byte[] bytes = new byte[msgSize];
|
||||
CodedOutputStream output = new CodedOutputStream(bytes);
|
||||
// Length-delimited to show we want the packed representation
|
||||
uint tag = WireFormat.MakeTag(8, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteTag(tag);
|
||||
int size = 0;
|
||||
for (int i = 0; i >= -5; i--)
|
||||
{
|
||||
size += CodedOutputStream.ComputeEnumSize(i);
|
||||
}
|
||||
output.WriteRawVarint32((uint)size);
|
||||
for (int i = 0; i >= -5; i--)
|
||||
{
|
||||
output.WriteEnum(i);
|
||||
}
|
||||
Assert.AreEqual(0, output.SpaceLeft);
|
||||
|
||||
CodedInputStream input = new CodedInputStream(bytes);
|
||||
tag = input.ReadTag();
|
||||
|
||||
RepeatedField<SampleEnum> values = new RepeatedField<SampleEnum>();
|
||||
values.AddEntriesFrom(input, FieldCodec.ForEnum(tag, x => (int)x, x => (SampleEnum)x));
|
||||
|
||||
Assert.AreEqual(6, values.Count);
|
||||
Assert.AreEqual(SampleEnum.None, values[0]);
|
||||
Assert.AreEqual(((SampleEnum)(-1)), values[1]);
|
||||
Assert.AreEqual(SampleEnum.NegativeValue, values[2]);
|
||||
Assert.AreEqual(((SampleEnum)(-3)), values[3]);
|
||||
Assert.AreEqual(((SampleEnum)(-4)), values[4]);
|
||||
Assert.AreEqual(((SampleEnum)(-5)), values[5]);
|
||||
}
|
||||
|
||||
// Fairly perfunctory tests for the non-generic IList implementation
|
||||
[Test]
|
||||
public void IList_Indexer()
|
||||
{
|
||||
var field = new RepeatedField<string> { "first", "second" };
|
||||
IList list = field;
|
||||
Assert.AreEqual("first", list[0]);
|
||||
list[1] = "changed";
|
||||
Assert.AreEqual("changed", field[1]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IList_Contains()
|
||||
{
|
||||
IList list = new RepeatedField<string> { "first", "second" };
|
||||
Assert.IsTrue(list.Contains("second"));
|
||||
Assert.IsFalse(list.Contains("third"));
|
||||
Assert.IsFalse(list.Contains(new object()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IList_Add()
|
||||
{
|
||||
IList list = new RepeatedField<string> { "first", "second" };
|
||||
list.Add("third");
|
||||
CollectionAssert.AreEqual(new[] { "first", "second", "third" }, list);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IList_Remove()
|
||||
{
|
||||
IList list = new RepeatedField<string> { "first", "second" };
|
||||
list.Remove("third"); // No-op, no exception
|
||||
list.Remove(new object()); // No-op, no exception
|
||||
list.Remove("first");
|
||||
CollectionAssert.AreEqual(new[] { "second" }, list);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IList_IsFixedSize()
|
||||
{
|
||||
var field = new RepeatedField<string> { "first", "second" };
|
||||
IList list = field;
|
||||
Assert.IsFalse(list.IsFixedSize);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IList_IndexOf()
|
||||
{
|
||||
IList list = new RepeatedField<string> { "first", "second" };
|
||||
Assert.AreEqual(1, list.IndexOf("second"));
|
||||
Assert.AreEqual(-1, list.IndexOf("third"));
|
||||
Assert.AreEqual(-1, list.IndexOf(new object()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IList_SyncRoot()
|
||||
{
|
||||
IList list = new RepeatedField<string> { "first", "second" };
|
||||
Assert.AreSame(list, list.SyncRoot);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IList_CopyTo()
|
||||
{
|
||||
IList list = new RepeatedField<string> { "first", "second" };
|
||||
string[] stringArray = new string[4];
|
||||
list.CopyTo(stringArray, 1);
|
||||
CollectionAssert.AreEqual(new[] { null, "first", "second", null }, stringArray);
|
||||
|
||||
object[] objectArray = new object[4];
|
||||
list.CopyTo(objectArray, 1);
|
||||
CollectionAssert.AreEqual(new[] { null, "first", "second", null }, objectArray);
|
||||
|
||||
Assert.Throws<ArrayTypeMismatchException>(() => list.CopyTo(new StringBuilder[4], 1));
|
||||
Assert.Throws<ArrayTypeMismatchException>(() => list.CopyTo(new int[4], 1));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IList_IsSynchronized()
|
||||
{
|
||||
IList list = new RepeatedField<string> { "first", "second" };
|
||||
Assert.IsFalse(list.IsSynchronized);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IList_Insert()
|
||||
{
|
||||
IList list = new RepeatedField<string> { "first", "second" };
|
||||
list.Insert(1, "middle");
|
||||
CollectionAssert.AreEqual(new[] { "first", "middle", "second" }, list);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_Integers()
|
||||
{
|
||||
var list = new RepeatedField<int> { 5, 10, 20 };
|
||||
var text = list.ToString();
|
||||
Assert.AreEqual("[ 5, 10, 20 ]", text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_Strings()
|
||||
{
|
||||
var list = new RepeatedField<string> { "x", "y", "z" };
|
||||
var text = list.ToString();
|
||||
Assert.AreEqual("[ \"x\", \"y\", \"z\" ]", text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_Messages()
|
||||
{
|
||||
var list = new RepeatedField<TestAllTypes> { new TestAllTypes { SingleDouble = 1.5 }, new TestAllTypes { SingleInt32 = 10 } };
|
||||
var text = list.ToString();
|
||||
Assert.AreEqual("[ { \"singleDouble\": 1.5 }, { \"singleInt32\": 10 } ]", text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_Empty()
|
||||
{
|
||||
var list = new RepeatedField<TestAllTypes> { };
|
||||
var text = list.ToString();
|
||||
Assert.AreEqual("[ ]", text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_InvalidElementType()
|
||||
{
|
||||
var list = new RepeatedField<decimal> { 15m };
|
||||
Assert.Throws<ArgumentException>(() => list.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_Timestamp()
|
||||
{
|
||||
var list = new RepeatedField<Timestamp> { Timestamp.FromDateTime(new DateTime(2015, 10, 1, 12, 34, 56, DateTimeKind.Utc)) };
|
||||
var text = list.ToString();
|
||||
Assert.AreEqual("[ \"2015-10-01T12:34:56Z\" ]", text);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_Struct()
|
||||
{
|
||||
var message = new Struct { Fields = { { "foo", new Value { NumberValue = 20 } } } };
|
||||
var list = new RepeatedField<Struct> { message };
|
||||
var text = list.ToString();
|
||||
Assert.AreEqual(text, "[ { \"foo\": 20 } ]", message.ToString());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using NUnit.Framework;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Google.Protobuf.Compatibility
|
||||
{
|
||||
public class PropertyInfoExtensionsTest
|
||||
{
|
||||
public string PublicReadWrite { get; set; }
|
||||
private string PrivateReadWrite { get; set; }
|
||||
public string PublicReadPrivateWrite { get; private set; }
|
||||
public string PrivateReadPublicWrite { private get; set; }
|
||||
public string PublicReadOnly { get { return null; } }
|
||||
private string PrivateReadOnly { get { return null; } }
|
||||
public string PublicWriteOnly { set { } }
|
||||
private string PrivateWriteOnly { set { } }
|
||||
|
||||
[Test]
|
||||
[TestCase("PublicReadWrite")]
|
||||
[TestCase("PublicReadPrivateWrite")]
|
||||
[TestCase("PublicReadOnly")]
|
||||
public void GetGetMethod_Success(string name)
|
||||
{
|
||||
var propertyInfo = typeof(PropertyInfoExtensionsTest)
|
||||
.GetProperty(name, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
|
||||
Assert.IsNotNull(PropertyInfoExtensions.GetGetMethod(propertyInfo));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("PrivateReadWrite")]
|
||||
[TestCase("PrivateReadPublicWrite")]
|
||||
[TestCase("PrivateReadOnly")]
|
||||
[TestCase("PublicWriteOnly")]
|
||||
[TestCase("PrivateWriteOnly")]
|
||||
public void GetGetMethod_NoAccessibleGetter(string name)
|
||||
{
|
||||
var propertyInfo = typeof(PropertyInfoExtensionsTest)
|
||||
.GetProperty(name, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
|
||||
Assert.IsNull(PropertyInfoExtensions.GetGetMethod(propertyInfo));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("PublicReadWrite")]
|
||||
[TestCase("PrivateReadPublicWrite")]
|
||||
[TestCase("PublicWriteOnly")]
|
||||
public void GetSetMethod_Success(string name)
|
||||
{
|
||||
var propertyInfo = typeof(PropertyInfoExtensionsTest)
|
||||
.GetProperty(name, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
|
||||
Assert.IsNotNull(PropertyInfoExtensions.GetSetMethod(propertyInfo));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("PublicReadPrivateWrite")]
|
||||
[TestCase("PrivateReadWrite")]
|
||||
[TestCase("PrivateReadOnly")]
|
||||
[TestCase("PublicReadOnly")]
|
||||
[TestCase("PrivateWriteOnly")]
|
||||
public void GetSetMethod_NoAccessibleGetter(string name)
|
||||
{
|
||||
var propertyInfo = typeof(PropertyInfoExtensionsTest)
|
||||
.GetProperty(name, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
|
||||
Assert.IsNull(PropertyInfoExtensions.GetSetMethod(propertyInfo));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,117 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
|
||||
#if !DOTNET35
|
||||
namespace Google.Protobuf.Compatibility
|
||||
{
|
||||
public class TypeExtensionsTest
|
||||
{
|
||||
public class DerivedList : List<string> { }
|
||||
public string PublicProperty { get; set; }
|
||||
private string PrivateProperty { get; set; }
|
||||
|
||||
public void PublicMethod()
|
||||
{
|
||||
}
|
||||
|
||||
private void PrivateMethod()
|
||||
{
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(typeof(object), typeof(string), true)]
|
||||
[TestCase(typeof(object), typeof(int), true)]
|
||||
[TestCase(typeof(string), typeof(string), true)]
|
||||
[TestCase(typeof(string), typeof(object), false)]
|
||||
[TestCase(typeof(string), typeof(int), false)]
|
||||
[TestCase(typeof(int), typeof(int), true)]
|
||||
[TestCase(typeof(ValueType), typeof(int), true)]
|
||||
[TestCase(typeof(long), typeof(int), false)] //
|
||||
public void IsAssignableFrom(Type target, Type argument, bool expected)
|
||||
{
|
||||
Assert.AreEqual(expected, TypeExtensions.IsAssignableFrom(target, argument));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(typeof(DerivedList), "Count")] // Go up the type hierarchy
|
||||
[TestCase(typeof(List<string>), "Count")]
|
||||
[TestCase(typeof(List<>), "Count")]
|
||||
[TestCase(typeof(TypeExtensionsTest), "PublicProperty")]
|
||||
public void GetProperty_Success(Type type, string name)
|
||||
{
|
||||
var property = TypeExtensions.GetProperty(type, name);
|
||||
Assert.IsNotNull(property);
|
||||
Assert.AreEqual(name, property.Name);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(typeof(TypeExtensionsTest), "PrivateProperty")]
|
||||
[TestCase(typeof(TypeExtensionsTest), "Garbage")]
|
||||
public void GetProperty_NoSuchProperty(Type type, string name)
|
||||
{
|
||||
var property = TypeExtensions.GetProperty(type, name);
|
||||
Assert.IsNull(property);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(typeof(DerivedList), "RemoveAt")] // Go up the type hierarchy
|
||||
[TestCase(typeof(List<>), "RemoveAt")]
|
||||
[TestCase(typeof(TypeExtensionsTest), "PublicMethod")]
|
||||
public void GetMethod_Success(Type type, string name)
|
||||
{
|
||||
var method = TypeExtensions.GetMethod(type, name);
|
||||
Assert.IsNotNull(method);
|
||||
Assert.AreEqual(name, method.Name);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(typeof(TypeExtensionsTest), "PrivateMethod")]
|
||||
[TestCase(typeof(TypeExtensionsTest), "GarbageMethod")]
|
||||
public void GetMethod_NoSuchMethod(Type type, string name)
|
||||
{
|
||||
var method = TypeExtensions.GetMethod(type, name);
|
||||
Assert.IsNull(method);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(typeof(List<string>), "IndexOf")]
|
||||
public void GetMethod_Ambiguous(Type type, string name)
|
||||
{
|
||||
Assert.Throws<AmbiguousMatchException>(() => TypeExtensions.GetMethod(type, name));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -1,48 +1,55 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System.Reflection;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("Google.Protobuf.Conformance")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Google.Protobuf.Conformance")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
[assembly: AssemblyVersion("3.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("3.0.0.0")]
|
||||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using Google.Protobuf.TestProtos;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
public class DeprecatedMemberTest
|
||||
{
|
||||
private static void AssertIsDeprecated(MemberInfo member)
|
||||
{
|
||||
Assert.NotNull(member);
|
||||
Assert.IsTrue(member.IsDefined(typeof(ObsoleteAttribute), false), "Member not obsolete: " + member);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestDepreatedPrimitiveValue()
|
||||
{
|
||||
AssertIsDeprecated(typeof(TestDeprecatedFields).GetProperty("DeprecatedInt32"));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
/// <summary>
|
||||
/// Helper methods when testing equality. NUnit's Assert.AreEqual and
|
||||
/// Assert.AreNotEqual methods try to be clever with collections, which can
|
||||
/// be annoying...
|
||||
/// </summary>
|
||||
internal static class EqualityTester
|
||||
{
|
||||
public static void AssertEquality<T>(T first, T second) where T : IEquatable<T>
|
||||
{
|
||||
Assert.IsTrue(first.Equals(second));
|
||||
Assert.IsTrue(first.Equals((object) second));
|
||||
Assert.AreEqual(first.GetHashCode(), second.GetHashCode());
|
||||
}
|
||||
|
||||
public static void AssertInequality<T>(T first, T second) where T : IEquatable<T>
|
||||
{
|
||||
Assert.IsFalse(first.Equals(second));
|
||||
Assert.IsFalse(first.Equals((object) second));
|
||||
// While this isn't a requirement, the chances of this test failing due to
|
||||
// coincidence rather than a bug are very small.
|
||||
if (first != null && second != null)
|
||||
{
|
||||
Assert.AreNotEqual(first.GetHashCode(), second.GetHashCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,196 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using Google.Protobuf.TestProtos;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
public class FieldCodecTest
|
||||
{
|
||||
#pragma warning disable 0414 // Used by tests via reflection - do not remove!
|
||||
private static readonly List<ICodecTestData> Codecs = new List<ICodecTestData>
|
||||
{
|
||||
new FieldCodecTestData<bool>(FieldCodec.ForBool(100), true, "Bool"),
|
||||
new FieldCodecTestData<string>(FieldCodec.ForString(100), "sample", "String"),
|
||||
new FieldCodecTestData<ByteString>(FieldCodec.ForBytes(100), ByteString.CopyFrom(1, 2, 3), "Bytes"),
|
||||
new FieldCodecTestData<int>(FieldCodec.ForInt32(100), -1000, "Int32"),
|
||||
new FieldCodecTestData<int>(FieldCodec.ForSInt32(100), -1000, "SInt32"),
|
||||
new FieldCodecTestData<int>(FieldCodec.ForSFixed32(100), -1000, "SFixed32"),
|
||||
new FieldCodecTestData<uint>(FieldCodec.ForUInt32(100), 1234, "UInt32"),
|
||||
new FieldCodecTestData<uint>(FieldCodec.ForFixed32(100), 1234, "Fixed32"),
|
||||
new FieldCodecTestData<long>(FieldCodec.ForInt64(100), -1000, "Int64"),
|
||||
new FieldCodecTestData<long>(FieldCodec.ForSInt64(100), -1000, "SInt64"),
|
||||
new FieldCodecTestData<long>(FieldCodec.ForSFixed64(100), -1000, "SFixed64"),
|
||||
new FieldCodecTestData<ulong>(FieldCodec.ForUInt64(100), 1234, "UInt64"),
|
||||
new FieldCodecTestData<ulong>(FieldCodec.ForFixed64(100), 1234, "Fixed64"),
|
||||
new FieldCodecTestData<float>(FieldCodec.ForFloat(100), 1234.5f, "Float"),
|
||||
new FieldCodecTestData<double>(FieldCodec.ForDouble(100), 1234567890.5d, "Double"),
|
||||
new FieldCodecTestData<ForeignEnum>(
|
||||
FieldCodec.ForEnum(100, t => (int) t, t => (ForeignEnum) t), ForeignEnum.ForeignBaz, "Enum"),
|
||||
new FieldCodecTestData<ForeignMessage>(
|
||||
FieldCodec.ForMessage(100, ForeignMessage.Parser), new ForeignMessage { C = 10 }, "Message"),
|
||||
};
|
||||
#pragma warning restore 0414
|
||||
|
||||
[Test, TestCaseSource("Codecs")]
|
||||
public void RoundTripWithTag(ICodecTestData codec)
|
||||
{
|
||||
codec.TestRoundTripWithTag();
|
||||
}
|
||||
|
||||
[Test, TestCaseSource("Codecs")]
|
||||
public void RoundTripRaw(ICodecTestData codec)
|
||||
{
|
||||
codec.TestRoundTripRaw();
|
||||
}
|
||||
|
||||
[Test, TestCaseSource("Codecs")]
|
||||
public void CalculateSize(ICodecTestData codec)
|
||||
{
|
||||
codec.TestCalculateSizeWithTag();
|
||||
}
|
||||
|
||||
[Test, TestCaseSource("Codecs")]
|
||||
public void DefaultValue(ICodecTestData codec)
|
||||
{
|
||||
codec.TestDefaultValue();
|
||||
}
|
||||
|
||||
[Test, TestCaseSource("Codecs")]
|
||||
public void FixedSize(ICodecTestData codec)
|
||||
{
|
||||
codec.TestFixedSize();
|
||||
}
|
||||
|
||||
// This is ugly, but it means we can have a non-generic interface.
|
||||
// It feels like NUnit should support this better, but I don't know
|
||||
// of any better ways right now.
|
||||
public interface ICodecTestData
|
||||
{
|
||||
void TestRoundTripRaw();
|
||||
void TestRoundTripWithTag();
|
||||
void TestCalculateSizeWithTag();
|
||||
void TestDefaultValue();
|
||||
void TestFixedSize();
|
||||
}
|
||||
|
||||
public class FieldCodecTestData<T> : ICodecTestData
|
||||
{
|
||||
private readonly FieldCodec<T> codec;
|
||||
private readonly T sampleValue;
|
||||
private readonly string name;
|
||||
|
||||
public FieldCodecTestData(FieldCodec<T> codec, T sampleValue, string name)
|
||||
{
|
||||
this.codec = codec;
|
||||
this.sampleValue = sampleValue;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void TestRoundTripRaw()
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
var codedOutput = new CodedOutputStream(stream);
|
||||
codec.ValueWriter(codedOutput, sampleValue);
|
||||
codedOutput.Flush();
|
||||
stream.Position = 0;
|
||||
var codedInput = new CodedInputStream(stream);
|
||||
Assert.AreEqual(sampleValue, codec.ValueReader(codedInput));
|
||||
Assert.IsTrue(codedInput.IsAtEnd);
|
||||
}
|
||||
|
||||
public void TestRoundTripWithTag()
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
var codedOutput = new CodedOutputStream(stream);
|
||||
codec.WriteTagAndValue(codedOutput, sampleValue);
|
||||
codedOutput.Flush();
|
||||
stream.Position = 0;
|
||||
var codedInput = new CodedInputStream(stream);
|
||||
codedInput.AssertNextTag(codec.Tag);
|
||||
Assert.AreEqual(sampleValue, codec.Read(codedInput));
|
||||
Assert.IsTrue(codedInput.IsAtEnd);
|
||||
}
|
||||
|
||||
public void TestCalculateSizeWithTag()
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
var codedOutput = new CodedOutputStream(stream);
|
||||
codec.WriteTagAndValue(codedOutput, sampleValue);
|
||||
codedOutput.Flush();
|
||||
Assert.AreEqual(stream.Position, codec.CalculateSizeWithTag(sampleValue));
|
||||
}
|
||||
|
||||
public void TestDefaultValue()
|
||||
{
|
||||
// WriteTagAndValue ignores default values
|
||||
var stream = new MemoryStream();
|
||||
var codedOutput = new CodedOutputStream(stream);
|
||||
codec.WriteTagAndValue(codedOutput, codec.DefaultValue);
|
||||
codedOutput.Flush();
|
||||
Assert.AreEqual(0, stream.Position);
|
||||
Assert.AreEqual(0, codec.CalculateSizeWithTag(codec.DefaultValue));
|
||||
if (typeof(T).GetTypeInfo().IsValueType)
|
||||
{
|
||||
Assert.AreEqual(default(T), codec.DefaultValue);
|
||||
}
|
||||
|
||||
// The plain ValueWriter/ValueReader delegates don't.
|
||||
if (codec.DefaultValue != null) // This part isn't appropriate for message types.
|
||||
{
|
||||
codedOutput = new CodedOutputStream(stream);
|
||||
codec.ValueWriter(codedOutput, codec.DefaultValue);
|
||||
codedOutput.Flush();
|
||||
Assert.AreNotEqual(0, stream.Position);
|
||||
Assert.AreEqual(stream.Position, codec.ValueSizeCalculator(codec.DefaultValue));
|
||||
stream.Position = 0;
|
||||
var codedInput = new CodedInputStream(stream);
|
||||
Assert.AreEqual(codec.DefaultValue, codec.ValueReader(codedInput));
|
||||
}
|
||||
}
|
||||
|
||||
public void TestFixedSize()
|
||||
{
|
||||
Assert.AreEqual(name.Contains("Fixed"), codec.FixedSize != 0);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,723 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using Google.Protobuf.TestProtos;
|
||||
using NUnit.Framework;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
/// <summary>
|
||||
/// Tests around the generated TestAllTypes message.
|
||||
/// </summary>
|
||||
public class GeneratedMessageTest
|
||||
{
|
||||
[Test]
|
||||
public void EmptyMessageFieldDistinctFromMissingMessageField()
|
||||
{
|
||||
// This demonstrates what we're really interested in...
|
||||
var message1 = new TestAllTypes { SingleForeignMessage = new ForeignMessage() };
|
||||
var message2 = new TestAllTypes(); // SingleForeignMessage is null
|
||||
EqualityTester.AssertInequality(message1, message2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DefaultValues()
|
||||
{
|
||||
// Single fields
|
||||
var message = new TestAllTypes();
|
||||
Assert.AreEqual(false, message.SingleBool);
|
||||
Assert.AreEqual(ByteString.Empty, message.SingleBytes);
|
||||
Assert.AreEqual(0.0, message.SingleDouble);
|
||||
Assert.AreEqual(0, message.SingleFixed32);
|
||||
Assert.AreEqual(0L, message.SingleFixed64);
|
||||
Assert.AreEqual(0.0f, message.SingleFloat);
|
||||
Assert.AreEqual(ForeignEnum.ForeignUnspecified, message.SingleForeignEnum);
|
||||
Assert.IsNull(message.SingleForeignMessage);
|
||||
Assert.AreEqual(ImportEnum.Unspecified, message.SingleImportEnum);
|
||||
Assert.IsNull(message.SingleImportMessage);
|
||||
Assert.AreEqual(0, message.SingleInt32);
|
||||
Assert.AreEqual(0L, message.SingleInt64);
|
||||
Assert.AreEqual(TestAllTypes.Types.NestedEnum.Unspecified, message.SingleNestedEnum);
|
||||
Assert.IsNull(message.SingleNestedMessage);
|
||||
Assert.IsNull(message.SinglePublicImportMessage);
|
||||
Assert.AreEqual(0, message.SingleSfixed32);
|
||||
Assert.AreEqual(0L, message.SingleSfixed64);
|
||||
Assert.AreEqual(0, message.SingleSint32);
|
||||
Assert.AreEqual(0L, message.SingleSint64);
|
||||
Assert.AreEqual("", message.SingleString);
|
||||
Assert.AreEqual(0U, message.SingleUint32);
|
||||
Assert.AreEqual(0UL, message.SingleUint64);
|
||||
|
||||
// Repeated fields
|
||||
Assert.AreEqual(0, message.RepeatedBool.Count);
|
||||
Assert.AreEqual(0, message.RepeatedBytes.Count);
|
||||
Assert.AreEqual(0, message.RepeatedDouble.Count);
|
||||
Assert.AreEqual(0, message.RepeatedFixed32.Count);
|
||||
Assert.AreEqual(0, message.RepeatedFixed64.Count);
|
||||
Assert.AreEqual(0, message.RepeatedFloat.Count);
|
||||
Assert.AreEqual(0, message.RepeatedForeignEnum.Count);
|
||||
Assert.AreEqual(0, message.RepeatedForeignMessage.Count);
|
||||
Assert.AreEqual(0, message.RepeatedImportEnum.Count);
|
||||
Assert.AreEqual(0, message.RepeatedImportMessage.Count);
|
||||
Assert.AreEqual(0, message.RepeatedNestedEnum.Count);
|
||||
Assert.AreEqual(0, message.RepeatedNestedMessage.Count);
|
||||
Assert.AreEqual(0, message.RepeatedPublicImportMessage.Count);
|
||||
Assert.AreEqual(0, message.RepeatedSfixed32.Count);
|
||||
Assert.AreEqual(0, message.RepeatedSfixed64.Count);
|
||||
Assert.AreEqual(0, message.RepeatedSint32.Count);
|
||||
Assert.AreEqual(0, message.RepeatedSint64.Count);
|
||||
Assert.AreEqual(0, message.RepeatedString.Count);
|
||||
Assert.AreEqual(0, message.RepeatedUint32.Count);
|
||||
Assert.AreEqual(0, message.RepeatedUint64.Count);
|
||||
|
||||
// Oneof fields
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
|
||||
Assert.AreEqual(0, message.OneofUint32);
|
||||
Assert.AreEqual("", message.OneofString);
|
||||
Assert.AreEqual(ByteString.Empty, message.OneofBytes);
|
||||
Assert.IsNull(message.OneofNestedMessage);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NullStringAndBytesRejected()
|
||||
{
|
||||
var message = new TestAllTypes();
|
||||
Assert.Throws<ArgumentNullException>(() => message.SingleString = null);
|
||||
Assert.Throws<ArgumentNullException>(() => message.OneofString = null);
|
||||
Assert.Throws<ArgumentNullException>(() => message.SingleBytes = null);
|
||||
Assert.Throws<ArgumentNullException>(() => message.OneofBytes = null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RoundTrip_Empty()
|
||||
{
|
||||
var message = new TestAllTypes();
|
||||
// Without setting any values, there's nothing to write.
|
||||
byte[] bytes = message.ToByteArray();
|
||||
Assert.AreEqual(0, bytes.Length);
|
||||
TestAllTypes parsed = TestAllTypes.Parser.ParseFrom(bytes);
|
||||
Assert.AreEqual(message, parsed);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RoundTrip_SingleValues()
|
||||
{
|
||||
var message = new TestAllTypes
|
||||
{
|
||||
SingleBool = true,
|
||||
SingleBytes = ByteString.CopyFrom(1, 2, 3, 4),
|
||||
SingleDouble = 23.5,
|
||||
SingleFixed32 = 23,
|
||||
SingleFixed64 = 1234567890123,
|
||||
SingleFloat = 12.25f,
|
||||
SingleForeignEnum = ForeignEnum.ForeignBar,
|
||||
SingleForeignMessage = new ForeignMessage { C = 10 },
|
||||
SingleImportEnum = ImportEnum.ImportBaz,
|
||||
SingleImportMessage = new ImportMessage { D = 20 },
|
||||
SingleInt32 = 100,
|
||||
SingleInt64 = 3210987654321,
|
||||
SingleNestedEnum = TestAllTypes.Types.NestedEnum.Foo,
|
||||
SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 35 },
|
||||
SinglePublicImportMessage = new PublicImportMessage { E = 54 },
|
||||
SingleSfixed32 = -123,
|
||||
SingleSfixed64 = -12345678901234,
|
||||
SingleSint32 = -456,
|
||||
SingleSint64 = -12345678901235,
|
||||
SingleString = "test",
|
||||
SingleUint32 = uint.MaxValue,
|
||||
SingleUint64 = ulong.MaxValue
|
||||
};
|
||||
|
||||
byte[] bytes = message.ToByteArray();
|
||||
TestAllTypes parsed = TestAllTypes.Parser.ParseFrom(bytes);
|
||||
Assert.AreEqual(message, parsed);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RoundTrip_RepeatedValues()
|
||||
{
|
||||
var message = new TestAllTypes
|
||||
{
|
||||
RepeatedBool = { true, false },
|
||||
RepeatedBytes = { ByteString.CopyFrom(1, 2, 3, 4), ByteString.CopyFrom(5, 6) },
|
||||
RepeatedDouble = { -12.25, 23.5 },
|
||||
RepeatedFixed32 = { uint.MaxValue, 23 },
|
||||
RepeatedFixed64 = { ulong.MaxValue, 1234567890123 },
|
||||
RepeatedFloat = { 100f, 12.25f },
|
||||
RepeatedForeignEnum = { ForeignEnum.ForeignFoo, ForeignEnum.ForeignBar },
|
||||
RepeatedForeignMessage = { new ForeignMessage(), new ForeignMessage { C = 10 } },
|
||||
RepeatedImportEnum = { ImportEnum.ImportBaz, ImportEnum.Unspecified },
|
||||
RepeatedImportMessage = { new ImportMessage { D = 20 }, new ImportMessage { D = 25 } },
|
||||
RepeatedInt32 = { 100, 200 },
|
||||
RepeatedInt64 = { 3210987654321, long.MaxValue },
|
||||
RepeatedNestedEnum = { TestAllTypes.Types.NestedEnum.Foo, TestAllTypes.Types.NestedEnum.Neg },
|
||||
RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 35 }, new TestAllTypes.Types.NestedMessage { Bb = 10 } },
|
||||
RepeatedPublicImportMessage = { new PublicImportMessage { E = 54 }, new PublicImportMessage { E = -1 } },
|
||||
RepeatedSfixed32 = { -123, 123 },
|
||||
RepeatedSfixed64 = { -12345678901234, 12345678901234 },
|
||||
RepeatedSint32 = { -456, 100 },
|
||||
RepeatedSint64 = { -12345678901235, 123 },
|
||||
RepeatedString = { "foo", "bar" },
|
||||
RepeatedUint32 = { uint.MaxValue, uint.MinValue },
|
||||
RepeatedUint64 = { ulong.MaxValue, uint.MinValue }
|
||||
};
|
||||
|
||||
byte[] bytes = message.ToByteArray();
|
||||
TestAllTypes parsed = TestAllTypes.Parser.ParseFrom(bytes);
|
||||
Assert.AreEqual(message, parsed);
|
||||
}
|
||||
|
||||
// Note that not every map within map_unittest_proto3 is used. They all go through very
|
||||
// similar code paths. The fact that all maps are present is validation that we have codecs
|
||||
// for every type.
|
||||
[Test]
|
||||
public void RoundTrip_Maps()
|
||||
{
|
||||
var message = new TestMap
|
||||
{
|
||||
MapBoolBool = {
|
||||
{ false, true },
|
||||
{ true, false }
|
||||
},
|
||||
MapInt32Bytes = {
|
||||
{ 5, ByteString.CopyFrom(6, 7, 8) },
|
||||
{ 25, ByteString.CopyFrom(1, 2, 3, 4, 5) },
|
||||
{ 10, ByteString.Empty }
|
||||
},
|
||||
MapInt32ForeignMessage = {
|
||||
{ 0, new ForeignMessage { C = 10 } },
|
||||
{ 5, new ForeignMessage() },
|
||||
},
|
||||
MapInt32Enum = {
|
||||
{ 1, MapEnum.Bar },
|
||||
{ 2000, MapEnum.Foo }
|
||||
}
|
||||
};
|
||||
|
||||
byte[] bytes = message.ToByteArray();
|
||||
TestMap parsed = TestMap.Parser.ParseFrom(bytes);
|
||||
Assert.AreEqual(message, parsed);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MapWithEmptyEntry()
|
||||
{
|
||||
var message = new TestMap
|
||||
{
|
||||
MapInt32Bytes = { { 0, ByteString.Empty } }
|
||||
};
|
||||
|
||||
byte[] bytes = message.ToByteArray();
|
||||
Assert.AreEqual(2, bytes.Length); // Tag for field entry (1 byte), length of entry (0; 1 byte)
|
||||
|
||||
var parsed = TestMap.Parser.ParseFrom(bytes);
|
||||
Assert.AreEqual(1, parsed.MapInt32Bytes.Count);
|
||||
Assert.AreEqual(ByteString.Empty, parsed.MapInt32Bytes[0]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MapWithOnlyValue()
|
||||
{
|
||||
// Hand-craft the stream to contain a single entry with just a value.
|
||||
var memoryStream = new MemoryStream();
|
||||
var output = new CodedOutputStream(memoryStream);
|
||||
output.WriteTag(TestMap.MapInt32ForeignMessageFieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
var nestedMessage = new ForeignMessage { C = 20 };
|
||||
// Size of the entry (tag, size written by WriteMessage, data written by WriteMessage)
|
||||
output.WriteLength(2 + nestedMessage.CalculateSize());
|
||||
output.WriteTag(2, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteMessage(nestedMessage);
|
||||
output.Flush();
|
||||
|
||||
var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());
|
||||
Assert.AreEqual(nestedMessage, parsed.MapInt32ForeignMessage[0]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MapWithOnlyKey_PrimitiveValue()
|
||||
{
|
||||
// Hand-craft the stream to contain a single entry with just a key.
|
||||
var memoryStream = new MemoryStream();
|
||||
var output = new CodedOutputStream(memoryStream);
|
||||
output.WriteTag(TestMap.MapInt32DoubleFieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
int key = 10;
|
||||
output.WriteLength(1 + CodedOutputStream.ComputeInt32Size(key));
|
||||
output.WriteTag(1, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(key);
|
||||
output.Flush();
|
||||
|
||||
var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());
|
||||
Assert.AreEqual(0.0, parsed.MapInt32Double[key]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MapWithOnlyKey_MessageValue()
|
||||
{
|
||||
// Hand-craft the stream to contain a single entry with just a key.
|
||||
var memoryStream = new MemoryStream();
|
||||
var output = new CodedOutputStream(memoryStream);
|
||||
output.WriteTag(TestMap.MapInt32ForeignMessageFieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
int key = 10;
|
||||
output.WriteLength(1 + CodedOutputStream.ComputeInt32Size(key));
|
||||
output.WriteTag(1, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(key);
|
||||
output.Flush();
|
||||
|
||||
var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());
|
||||
Assert.AreEqual(new ForeignMessage(), parsed.MapInt32ForeignMessage[key]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MapIgnoresExtraFieldsWithinEntryMessages()
|
||||
{
|
||||
// Hand-craft the stream to contain a single entry with three fields
|
||||
var memoryStream = new MemoryStream();
|
||||
var output = new CodedOutputStream(memoryStream);
|
||||
|
||||
output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
|
||||
var key = 10; // Field 1
|
||||
var value = 20; // Field 2
|
||||
var extra = 30; // Field 3
|
||||
|
||||
// Each field can be represented in a single byte, with a single byte tag.
|
||||
// Total message size: 6 bytes.
|
||||
output.WriteLength(6);
|
||||
output.WriteTag(1, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(key);
|
||||
output.WriteTag(2, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(value);
|
||||
output.WriteTag(3, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(extra);
|
||||
output.Flush();
|
||||
|
||||
var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());
|
||||
Assert.AreEqual(value, parsed.MapInt32Int32[key]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MapFieldOrderIsIrrelevant()
|
||||
{
|
||||
var memoryStream = new MemoryStream();
|
||||
var output = new CodedOutputStream(memoryStream);
|
||||
|
||||
output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
|
||||
var key = 10;
|
||||
var value = 20;
|
||||
|
||||
// Each field can be represented in a single byte, with a single byte tag.
|
||||
// Total message size: 4 bytes.
|
||||
output.WriteLength(4);
|
||||
output.WriteTag(2, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(value);
|
||||
output.WriteTag(1, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(key);
|
||||
output.Flush();
|
||||
|
||||
var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());
|
||||
Assert.AreEqual(value, parsed.MapInt32Int32[key]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MapNonContiguousEntries()
|
||||
{
|
||||
var memoryStream = new MemoryStream();
|
||||
var output = new CodedOutputStream(memoryStream);
|
||||
|
||||
// Message structure:
|
||||
// Entry for MapInt32Int32
|
||||
// Entry for MapStringString
|
||||
// Entry for MapInt32Int32
|
||||
|
||||
// First entry
|
||||
var key1 = 10;
|
||||
var value1 = 20;
|
||||
output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteLength(4);
|
||||
output.WriteTag(1, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(key1);
|
||||
output.WriteTag(2, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(value1);
|
||||
|
||||
// Second entry
|
||||
var key2 = "a";
|
||||
var value2 = "b";
|
||||
output.WriteTag(TestMap.MapStringStringFieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteLength(6); // 3 bytes per entry: tag, size, character
|
||||
output.WriteTag(1, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteString(key2);
|
||||
output.WriteTag(2, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteString(value2);
|
||||
|
||||
// Third entry
|
||||
var key3 = 15;
|
||||
var value3 = 25;
|
||||
output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteLength(4);
|
||||
output.WriteTag(1, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(key3);
|
||||
output.WriteTag(2, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(value3);
|
||||
|
||||
output.Flush();
|
||||
var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());
|
||||
var expected = new TestMap
|
||||
{
|
||||
MapInt32Int32 = { { key1, value1 }, { key3, value3 } },
|
||||
MapStringString = { { key2, value2 } }
|
||||
};
|
||||
Assert.AreEqual(expected, parsed);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DuplicateKeys_LastEntryWins()
|
||||
{
|
||||
var memoryStream = new MemoryStream();
|
||||
var output = new CodedOutputStream(memoryStream);
|
||||
|
||||
var key = 10;
|
||||
var value1 = 20;
|
||||
var value2 = 30;
|
||||
|
||||
// First entry
|
||||
output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteLength(4);
|
||||
output.WriteTag(1, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(key);
|
||||
output.WriteTag(2, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(value1);
|
||||
|
||||
// Second entry - same key, different value
|
||||
output.WriteTag(TestMap.MapInt32Int32FieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteLength(4);
|
||||
output.WriteTag(1, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(key);
|
||||
output.WriteTag(2, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(value2);
|
||||
output.Flush();
|
||||
|
||||
var parsed = TestMap.Parser.ParseFrom(memoryStream.ToArray());
|
||||
Assert.AreEqual(value2, parsed.MapInt32Int32[key]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CloneSingleNonMessageValues()
|
||||
{
|
||||
var original = new TestAllTypes
|
||||
{
|
||||
SingleBool = true,
|
||||
SingleBytes = ByteString.CopyFrom(1, 2, 3, 4),
|
||||
SingleDouble = 23.5,
|
||||
SingleFixed32 = 23,
|
||||
SingleFixed64 = 1234567890123,
|
||||
SingleFloat = 12.25f,
|
||||
SingleInt32 = 100,
|
||||
SingleInt64 = 3210987654321,
|
||||
SingleNestedEnum = TestAllTypes.Types.NestedEnum.Foo,
|
||||
SingleSfixed32 = -123,
|
||||
SingleSfixed64 = -12345678901234,
|
||||
SingleSint32 = -456,
|
||||
SingleSint64 = -12345678901235,
|
||||
SingleString = "test",
|
||||
SingleUint32 = uint.MaxValue,
|
||||
SingleUint64 = ulong.MaxValue
|
||||
};
|
||||
var clone = original.Clone();
|
||||
Assert.AreNotSame(original, clone);
|
||||
Assert.AreEqual(original, clone);
|
||||
// Just as a single example
|
||||
clone.SingleInt32 = 150;
|
||||
Assert.AreNotEqual(original, clone);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CloneRepeatedNonMessageValues()
|
||||
{
|
||||
var original = new TestAllTypes
|
||||
{
|
||||
RepeatedBool = { true, false },
|
||||
RepeatedBytes = { ByteString.CopyFrom(1, 2, 3, 4), ByteString.CopyFrom(5, 6) },
|
||||
RepeatedDouble = { -12.25, 23.5 },
|
||||
RepeatedFixed32 = { uint.MaxValue, 23 },
|
||||
RepeatedFixed64 = { ulong.MaxValue, 1234567890123 },
|
||||
RepeatedFloat = { 100f, 12.25f },
|
||||
RepeatedInt32 = { 100, 200 },
|
||||
RepeatedInt64 = { 3210987654321, long.MaxValue },
|
||||
RepeatedNestedEnum = { TestAllTypes.Types.NestedEnum.Foo, TestAllTypes.Types.NestedEnum.Neg },
|
||||
RepeatedSfixed32 = { -123, 123 },
|
||||
RepeatedSfixed64 = { -12345678901234, 12345678901234 },
|
||||
RepeatedSint32 = { -456, 100 },
|
||||
RepeatedSint64 = { -12345678901235, 123 },
|
||||
RepeatedString = { "foo", "bar" },
|
||||
RepeatedUint32 = { uint.MaxValue, uint.MinValue },
|
||||
RepeatedUint64 = { ulong.MaxValue, uint.MinValue }
|
||||
};
|
||||
|
||||
var clone = original.Clone();
|
||||
Assert.AreNotSame(original, clone);
|
||||
Assert.AreEqual(original, clone);
|
||||
// Just as a single example
|
||||
clone.RepeatedDouble.Add(25.5);
|
||||
Assert.AreNotEqual(original, clone);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CloneSingleMessageField()
|
||||
{
|
||||
var original = new TestAllTypes
|
||||
{
|
||||
SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 20 }
|
||||
};
|
||||
|
||||
var clone = original.Clone();
|
||||
Assert.AreNotSame(original, clone);
|
||||
Assert.AreNotSame(original.SingleNestedMessage, clone.SingleNestedMessage);
|
||||
Assert.AreEqual(original, clone);
|
||||
|
||||
clone.SingleNestedMessage.Bb = 30;
|
||||
Assert.AreNotEqual(original, clone);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CloneRepeatedMessageField()
|
||||
{
|
||||
var original = new TestAllTypes
|
||||
{
|
||||
RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 20 } }
|
||||
};
|
||||
|
||||
var clone = original.Clone();
|
||||
Assert.AreNotSame(original, clone);
|
||||
Assert.AreNotSame(original.RepeatedNestedMessage, clone.RepeatedNestedMessage);
|
||||
Assert.AreNotSame(original.RepeatedNestedMessage[0], clone.RepeatedNestedMessage[0]);
|
||||
Assert.AreEqual(original, clone);
|
||||
|
||||
clone.RepeatedNestedMessage[0].Bb = 30;
|
||||
Assert.AreNotEqual(original, clone);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CloneOneofField()
|
||||
{
|
||||
var original = new TestAllTypes
|
||||
{
|
||||
OneofNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 20 }
|
||||
};
|
||||
|
||||
var clone = original.Clone();
|
||||
Assert.AreNotSame(original, clone);
|
||||
Assert.AreEqual(original, clone);
|
||||
|
||||
// We should have cloned the message
|
||||
original.OneofNestedMessage.Bb = 30;
|
||||
Assert.AreNotEqual(original, clone);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void OneofProperties()
|
||||
{
|
||||
// Switch the oneof case between each of the different options, and check everything behaves
|
||||
// as expected in each case.
|
||||
var message = new TestAllTypes();
|
||||
Assert.AreEqual("", message.OneofString);
|
||||
Assert.AreEqual(0, message.OneofUint32);
|
||||
Assert.AreEqual(ByteString.Empty, message.OneofBytes);
|
||||
Assert.IsNull(message.OneofNestedMessage);
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
|
||||
|
||||
message.OneofString = "sample";
|
||||
Assert.AreEqual("sample", message.OneofString);
|
||||
Assert.AreEqual(0, message.OneofUint32);
|
||||
Assert.AreEqual(ByteString.Empty, message.OneofBytes);
|
||||
Assert.IsNull(message.OneofNestedMessage);
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofString, message.OneofFieldCase);
|
||||
|
||||
var bytes = ByteString.CopyFrom(1, 2, 3);
|
||||
message.OneofBytes = bytes;
|
||||
Assert.AreEqual("", message.OneofString);
|
||||
Assert.AreEqual(0, message.OneofUint32);
|
||||
Assert.AreEqual(bytes, message.OneofBytes);
|
||||
Assert.IsNull(message.OneofNestedMessage);
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofBytes, message.OneofFieldCase);
|
||||
|
||||
message.OneofUint32 = 20;
|
||||
Assert.AreEqual("", message.OneofString);
|
||||
Assert.AreEqual(20, message.OneofUint32);
|
||||
Assert.AreEqual(ByteString.Empty, message.OneofBytes);
|
||||
Assert.IsNull(message.OneofNestedMessage);
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, message.OneofFieldCase);
|
||||
|
||||
var nestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 25 };
|
||||
message.OneofNestedMessage = nestedMessage;
|
||||
Assert.AreEqual("", message.OneofString);
|
||||
Assert.AreEqual(0, message.OneofUint32);
|
||||
Assert.AreEqual(ByteString.Empty, message.OneofBytes);
|
||||
Assert.AreEqual(nestedMessage, message.OneofNestedMessage);
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofNestedMessage, message.OneofFieldCase);
|
||||
|
||||
message.ClearOneofField();
|
||||
Assert.AreEqual("", message.OneofString);
|
||||
Assert.AreEqual(0, message.OneofUint32);
|
||||
Assert.AreEqual(ByteString.Empty, message.OneofBytes);
|
||||
Assert.IsNull(message.OneofNestedMessage);
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Oneof_DefaultValuesNotEqual()
|
||||
{
|
||||
var message1 = new TestAllTypes { OneofString = "" };
|
||||
var message2 = new TestAllTypes { OneofUint32 = 0 };
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofString, message1.OneofFieldCase);
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, message2.OneofFieldCase);
|
||||
Assert.AreNotEqual(message1, message2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void OneofSerialization_NonDefaultValue()
|
||||
{
|
||||
var message = new TestAllTypes();
|
||||
message.OneofString = "this would take a bit of space";
|
||||
message.OneofUint32 = 10;
|
||||
var bytes = message.ToByteArray();
|
||||
Assert.AreEqual(3, bytes.Length); // 2 bytes for the tag + 1 for the value - no string!
|
||||
|
||||
var message2 = TestAllTypes.Parser.ParseFrom(bytes);
|
||||
Assert.AreEqual(message, message2);
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, message2.OneofFieldCase);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void OneofSerialization_DefaultValue()
|
||||
{
|
||||
var message = new TestAllTypes();
|
||||
message.OneofString = "this would take a bit of space";
|
||||
message.OneofUint32 = 0; // This is the default value for UInt32; normally wouldn't be serialized
|
||||
var bytes = message.ToByteArray();
|
||||
Assert.AreEqual(3, bytes.Length); // 2 bytes for the tag + 1 for the value - it's still serialized
|
||||
|
||||
var message2 = TestAllTypes.Parser.ParseFrom(bytes);
|
||||
Assert.AreEqual(message, message2);
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.OneofUint32, message2.OneofFieldCase);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IgnoreUnknownFields_RealDataStillRead()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
var unusedFieldNumber = 23456;
|
||||
Assert.IsFalse(TestAllTypes.Descriptor.Fields.InDeclarationOrder().Select(x => x.FieldNumber).Contains(unusedFieldNumber));
|
||||
output.WriteTag(unusedFieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteString("ignore me");
|
||||
message.WriteTo(output);
|
||||
output.Flush();
|
||||
|
||||
stream.Position = 0;
|
||||
var parsed = TestAllTypes.Parser.ParseFrom(stream);
|
||||
Assert.AreEqual(message, parsed);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IgnoreUnknownFields_AllTypes()
|
||||
{
|
||||
// Simple way of ensuring we can skip all kinds of fields.
|
||||
var data = SampleMessages.CreateFullTestAllTypes().ToByteArray();
|
||||
var empty = Empty.Parser.ParseFrom(data);
|
||||
Assert.AreEqual(new Empty(), empty);
|
||||
}
|
||||
|
||||
// This was originally seen as a conformance test failure.
|
||||
[Test]
|
||||
public void TruncatedMessageFieldThrows()
|
||||
{
|
||||
// 130, 3 is the message tag
|
||||
// 1 is the data length - but there's no data.
|
||||
var data = new byte[] { 130, 3, 1 };
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseFrom(data));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Demonstrates current behaviour with an extraneous end group tag - see issue 688
|
||||
/// for details; we may want to change this.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void ExtraEndGroupThrows()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
|
||||
output.WriteTag(TestAllTypes.SingleFixed32FieldNumber, WireFormat.WireType.Fixed32);
|
||||
output.WriteFixed32(123);
|
||||
output.WriteTag(100, WireFormat.WireType.EndGroup);
|
||||
|
||||
output.Flush();
|
||||
|
||||
stream.Position = 0;
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseFrom(stream));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CustomDiagnosticMessage_DirectToStringCall()
|
||||
{
|
||||
var message = new ForeignMessage { C = 31 };
|
||||
Assert.AreEqual("{ \"c\": 31, \"@cInHex\": \"1f\" }", message.ToString());
|
||||
Assert.AreEqual("{ \"c\": 31 }", JsonFormatter.Default.Format(message));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CustomDiagnosticMessage_Nested()
|
||||
{
|
||||
var message = new TestAllTypes { SingleForeignMessage = new ForeignMessage { C = 16 } };
|
||||
Assert.AreEqual("{ \"singleForeignMessage\": { \"c\": 16, \"@cInHex\": \"10\" } }", message.ToString());
|
||||
Assert.AreEqual("{ \"singleForeignMessage\": { \"c\": 16 } }", JsonFormatter.Default.Format(message));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CustomDiagnosticMessage_DirectToTextWriterCall()
|
||||
{
|
||||
var message = new ForeignMessage { C = 31 };
|
||||
var writer = new StringWriter();
|
||||
JsonFormatter.Default.Format(message, writer);
|
||||
Assert.AreEqual("{ \"c\": 31 }", writer.ToString());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>580eb013-d3c7-4578-b845-015f4a3b0591</ProjectGuid>
|
||||
<RootNamespace>Google.Protobuf.Test</RootNamespace>
|
||||
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
|
||||
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
|
||||
</Project>
|
|
@ -0,0 +1,82 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using Google.Protobuf.Reflection;
|
||||
using UnitTest.Issues.TestProtos;
|
||||
using NUnit.Framework;
|
||||
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
/// <summary>
|
||||
/// Tests for issues which aren't easily compartmentalized into other unit tests.
|
||||
/// </summary>
|
||||
public class IssuesTest
|
||||
{
|
||||
// Issue 45
|
||||
[Test]
|
||||
public void FieldCalledItem()
|
||||
{
|
||||
ItemField message = new ItemField { Item = 3 };
|
||||
FieldDescriptor field = ItemField.Descriptor.FindFieldByName("item");
|
||||
Assert.NotNull(field);
|
||||
Assert.AreEqual(3, (int)field.Accessor.GetValue(message));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ReservedNames()
|
||||
{
|
||||
var message = new ReservedNames { Types_ = 10, Descriptor_ = 20 };
|
||||
// Underscores aren't reflected in the JSON.
|
||||
Assert.AreEqual("{ \"types\": 10, \"descriptor\": 20 }", message.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void JsonNameParseTest()
|
||||
{
|
||||
var settings = new JsonParser.Settings(10, TypeRegistry.FromFiles(UnittestIssuesReflection.Descriptor));
|
||||
var parser = new JsonParser(settings);
|
||||
|
||||
// It is safe to use either original field name or explicitly specified json_name
|
||||
Assert.AreEqual(new TestJsonName { Name = "test", Description = "test2", Guid = "test3" },
|
||||
parser.Parse<TestJsonName>("{ \"name\": \"test\", \"desc\": \"test2\", \"guid\": \"test3\" }"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void JsonNameFormatTest()
|
||||
{
|
||||
var message = new TestJsonName { Name = "test", Description = "test2", Guid = "test3" };
|
||||
Assert.AreEqual("{ \"name\": \"test\", \"desc\": \"test2\", \"exid\": \"test3\" }",
|
||||
JsonFormatter.Default.Format(message));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,939 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using Google.Protobuf.Reflection;
|
||||
using Google.Protobuf.TestProtos;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
/// <summary>
|
||||
/// Unit tests for JSON parsing.
|
||||
/// </summary>
|
||||
public class JsonParserTest
|
||||
{
|
||||
// Sanity smoke test
|
||||
[Test]
|
||||
public void AllTypesRoundtrip()
|
||||
{
|
||||
AssertRoundtrip(SampleMessages.CreateFullTestAllTypes());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Maps()
|
||||
{
|
||||
AssertRoundtrip(new TestMap { MapStringString = { { "with spaces", "bar" }, { "a", "b" } } });
|
||||
AssertRoundtrip(new TestMap { MapInt32Int32 = { { 0, 1 }, { 2, 3 } } });
|
||||
AssertRoundtrip(new TestMap { MapBoolBool = { { false, true }, { true, false } } });
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(" 1 ")]
|
||||
[TestCase("+1")]
|
||||
[TestCase("1,000")]
|
||||
[TestCase("1.5")]
|
||||
public void IntegerMapKeysAreStrict(string keyText)
|
||||
{
|
||||
// Test that integer parsing is strict. We assume that if this is correct for int32,
|
||||
// it's correct for other numeric key types.
|
||||
var json = "{ \"mapInt32Int32\": { \"" + keyText + "\" : \"1\" } }";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => JsonParser.Default.Parse<TestMap>(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void OriginalFieldNameAccepted()
|
||||
{
|
||||
var json = "{ \"single_int32\": 10 }";
|
||||
var expected = new TestAllTypes { SingleInt32 = 10 };
|
||||
Assert.AreEqual(expected, TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SourceContextRoundtrip()
|
||||
{
|
||||
AssertRoundtrip(new SourceContext { FileName = "foo.proto" });
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SingularWrappers_DefaultNonNullValues()
|
||||
{
|
||||
var message = new TestWellKnownTypes
|
||||
{
|
||||
StringField = "",
|
||||
BytesField = ByteString.Empty,
|
||||
BoolField = false,
|
||||
FloatField = 0f,
|
||||
DoubleField = 0d,
|
||||
Int32Field = 0,
|
||||
Int64Field = 0,
|
||||
Uint32Field = 0,
|
||||
Uint64Field = 0
|
||||
};
|
||||
AssertRoundtrip(message);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SingularWrappers_NonDefaultValues()
|
||||
{
|
||||
var message = new TestWellKnownTypes
|
||||
{
|
||||
StringField = "x",
|
||||
BytesField = ByteString.CopyFrom(1, 2, 3),
|
||||
BoolField = true,
|
||||
FloatField = 12.5f,
|
||||
DoubleField = 12.25d,
|
||||
Int32Field = 1,
|
||||
Int64Field = 2,
|
||||
Uint32Field = 3,
|
||||
Uint64Field = 4
|
||||
};
|
||||
AssertRoundtrip(message);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SingularWrappers_ExplicitNulls()
|
||||
{
|
||||
// When we parse the "valueField": null part, we remember it... basically, it's one case
|
||||
// where explicit default values don't fully roundtrip.
|
||||
var message = new TestWellKnownTypes { ValueField = Value.ForNull() };
|
||||
var json = new JsonFormatter(new JsonFormatter.Settings(true)).Format(message);
|
||||
var parsed = JsonParser.Default.Parse<TestWellKnownTypes>(json);
|
||||
Assert.AreEqual(message, parsed);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(typeof(BoolValue), "true", true)]
|
||||
[TestCase(typeof(Int32Value), "32", 32)]
|
||||
[TestCase(typeof(Int64Value), "32", 32L)]
|
||||
[TestCase(typeof(Int64Value), "\"32\"", 32L)]
|
||||
[TestCase(typeof(UInt32Value), "32", 32U)]
|
||||
[TestCase(typeof(UInt64Value), "\"32\"", 32UL)]
|
||||
[TestCase(typeof(UInt64Value), "32", 32UL)]
|
||||
[TestCase(typeof(StringValue), "\"foo\"", "foo")]
|
||||
[TestCase(typeof(FloatValue), "1.5", 1.5f)]
|
||||
[TestCase(typeof(DoubleValue), "1.5", 1.5d)]
|
||||
public void Wrappers_Standalone(System.Type wrapperType, string json, object expectedValue)
|
||||
{
|
||||
IMessage parsed = (IMessage)Activator.CreateInstance(wrapperType);
|
||||
IMessage expected = (IMessage)Activator.CreateInstance(wrapperType);
|
||||
JsonParser.Default.Merge(parsed, "null");
|
||||
Assert.AreEqual(expected, parsed);
|
||||
|
||||
JsonParser.Default.Merge(parsed, json);
|
||||
expected.Descriptor.Fields[WrappersReflection.WrapperValueFieldNumber].Accessor.SetValue(expected, expectedValue);
|
||||
Assert.AreEqual(expected, parsed);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ExplicitNullValue()
|
||||
{
|
||||
string json = "{\"valueField\": null}";
|
||||
var message = JsonParser.Default.Parse<TestWellKnownTypes>(json);
|
||||
Assert.AreEqual(new TestWellKnownTypes { ValueField = Value.ForNull() }, message);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BytesWrapper_Standalone()
|
||||
{
|
||||
ByteString data = ByteString.CopyFrom(1, 2, 3);
|
||||
// Can't do this with attributes...
|
||||
var parsed = JsonParser.Default.Parse<BytesValue>(WrapInQuotes(data.ToBase64()));
|
||||
var expected = new BytesValue { Value = data };
|
||||
Assert.AreEqual(expected, parsed);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RepeatedWrappers()
|
||||
{
|
||||
var message = new RepeatedWellKnownTypes
|
||||
{
|
||||
BoolField = { true, false },
|
||||
BytesField = { ByteString.CopyFrom(1, 2, 3), ByteString.CopyFrom(4, 5, 6), ByteString.Empty },
|
||||
DoubleField = { 12.5, -1.5, 0d },
|
||||
FloatField = { 123.25f, -20f, 0f },
|
||||
Int32Field = { int.MaxValue, int.MinValue, 0 },
|
||||
Int64Field = { long.MaxValue, long.MinValue, 0L },
|
||||
StringField = { "First", "Second", "" },
|
||||
Uint32Field = { uint.MaxValue, uint.MinValue, 0U },
|
||||
Uint64Field = { ulong.MaxValue, ulong.MinValue, 0UL },
|
||||
};
|
||||
AssertRoundtrip(message);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RepeatedField_NullElementProhibited()
|
||||
{
|
||||
string json = "{ \"repeated_foreign_message\": [null] }";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RepeatedField_NullOverallValueAllowed()
|
||||
{
|
||||
string json = "{ \"repeated_foreign_message\": null }";
|
||||
Assert.AreEqual(new TestAllTypes(), TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("{ \"mapInt32Int32\": { \"10\": null }")]
|
||||
[TestCase("{ \"mapStringString\": { \"abc\": null }")]
|
||||
[TestCase("{ \"mapInt32ForeignMessage\": { \"10\": null }")]
|
||||
public void MapField_NullValueProhibited(string json)
|
||||
{
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestMap.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MapField_NullOverallValueAllowed()
|
||||
{
|
||||
string json = "{ \"mapInt32Int32\": null }";
|
||||
Assert.AreEqual(new TestMap(), TestMap.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void IndividualWrapperTypes()
|
||||
{
|
||||
Assert.AreEqual(new StringValue { Value = "foo" }, StringValue.Parser.ParseJson("\"foo\""));
|
||||
Assert.AreEqual(new Int32Value { Value = 1 }, Int32Value.Parser.ParseJson("1"));
|
||||
// Can parse strings directly too
|
||||
Assert.AreEqual(new Int32Value { Value = 1 }, Int32Value.Parser.ParseJson("\"1\""));
|
||||
}
|
||||
|
||||
private static void AssertRoundtrip<T>(T message) where T : IMessage<T>, new()
|
||||
{
|
||||
var clone = message.Clone();
|
||||
var json = JsonFormatter.Default.Format(message);
|
||||
var parsed = JsonParser.Default.Parse<T>(json);
|
||||
Assert.AreEqual(clone, parsed);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0)]
|
||||
[TestCase("-0", 0)] // Not entirely clear whether we intend to allow this...
|
||||
[TestCase("1", 1)]
|
||||
[TestCase("-1", -1)]
|
||||
[TestCase("2147483647", 2147483647)]
|
||||
[TestCase("-2147483648", -2147483648)]
|
||||
public void StringToInt32_Valid(string jsonValue, int expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleInt32\": \"" + jsonValue + "\"}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleInt32);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("+0")]
|
||||
[TestCase(" 1")]
|
||||
[TestCase("1 ")]
|
||||
[TestCase("00")]
|
||||
[TestCase("-00")]
|
||||
[TestCase("--1")]
|
||||
[TestCase("+1")]
|
||||
[TestCase("1.5")]
|
||||
[TestCase("1e10")]
|
||||
[TestCase("2147483648")]
|
||||
[TestCase("-2147483649")]
|
||||
public void StringToInt32_Invalid(string jsonValue)
|
||||
{
|
||||
string json = "{ \"singleInt32\": \"" + jsonValue + "\"}";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0U)]
|
||||
[TestCase("1", 1U)]
|
||||
[TestCase("4294967295", 4294967295U)]
|
||||
public void StringToUInt32_Valid(string jsonValue, uint expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleUint32\": \"" + jsonValue + "\"}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleUint32);
|
||||
}
|
||||
|
||||
// Assume that anything non-bounds-related is covered in the Int32 case
|
||||
[Test]
|
||||
[TestCase("-1")]
|
||||
[TestCase("4294967296")]
|
||||
public void StringToUInt32_Invalid(string jsonValue)
|
||||
{
|
||||
string json = "{ \"singleUint32\": \"" + jsonValue + "\"}";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0L)]
|
||||
[TestCase("1", 1L)]
|
||||
[TestCase("-1", -1L)]
|
||||
[TestCase("9223372036854775807", 9223372036854775807)]
|
||||
[TestCase("-9223372036854775808", -9223372036854775808)]
|
||||
public void StringToInt64_Valid(string jsonValue, long expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleInt64\": \"" + jsonValue + "\"}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleInt64);
|
||||
}
|
||||
|
||||
// Assume that anything non-bounds-related is covered in the Int32 case
|
||||
[Test]
|
||||
[TestCase("-9223372036854775809")]
|
||||
[TestCase("9223372036854775808")]
|
||||
public void StringToInt64_Invalid(string jsonValue)
|
||||
{
|
||||
string json = "{ \"singleInt64\": \"" + jsonValue + "\"}";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0UL)]
|
||||
[TestCase("1", 1UL)]
|
||||
[TestCase("18446744073709551615", 18446744073709551615)]
|
||||
public void StringToUInt64_Valid(string jsonValue, ulong expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleUint64\": \"" + jsonValue + "\"}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleUint64);
|
||||
}
|
||||
|
||||
// Assume that anything non-bounds-related is covered in the Int32 case
|
||||
[Test]
|
||||
[TestCase("-1")]
|
||||
[TestCase("18446744073709551616")]
|
||||
public void StringToUInt64_Invalid(string jsonValue)
|
||||
{
|
||||
string json = "{ \"singleUint64\": \"" + jsonValue + "\"}";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0d)]
|
||||
[TestCase("1", 1d)]
|
||||
[TestCase("1.000000", 1d)]
|
||||
[TestCase("1.0000000000000000000000001", 1d)] // We don't notice that we haven't preserved the exact value
|
||||
[TestCase("-1", -1d)]
|
||||
[TestCase("1e1", 10d)]
|
||||
[TestCase("1e01", 10d)] // Leading decimals are allowed in exponents
|
||||
[TestCase("1E1", 10d)] // Either case is fine
|
||||
[TestCase("-1e1", -10d)]
|
||||
[TestCase("1.5e1", 15d)]
|
||||
[TestCase("-1.5e1", -15d)]
|
||||
[TestCase("15e-1", 1.5d)]
|
||||
[TestCase("-15e-1", -1.5d)]
|
||||
[TestCase("1.79769e308", 1.79769e308)]
|
||||
[TestCase("-1.79769e308", -1.79769e308)]
|
||||
[TestCase("Infinity", double.PositiveInfinity)]
|
||||
[TestCase("-Infinity", double.NegativeInfinity)]
|
||||
[TestCase("NaN", double.NaN)]
|
||||
public void StringToDouble_Valid(string jsonValue, double expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleDouble\": \"" + jsonValue + "\"}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleDouble);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("1.7977e308")]
|
||||
[TestCase("-1.7977e308")]
|
||||
[TestCase("1e309")]
|
||||
[TestCase("1,0")]
|
||||
[TestCase("1.0.0")]
|
||||
[TestCase("+1")]
|
||||
[TestCase("00")]
|
||||
[TestCase("01")]
|
||||
[TestCase("-00")]
|
||||
[TestCase("-01")]
|
||||
[TestCase("--1")]
|
||||
[TestCase(" Infinity")]
|
||||
[TestCase(" -Infinity")]
|
||||
[TestCase("NaN ")]
|
||||
[TestCase("Infinity ")]
|
||||
[TestCase("-Infinity ")]
|
||||
[TestCase(" NaN")]
|
||||
[TestCase("INFINITY")]
|
||||
[TestCase("nan")]
|
||||
[TestCase("\u00BD")] // 1/2 as a single Unicode character. Just sanity checking...
|
||||
public void StringToDouble_Invalid(string jsonValue)
|
||||
{
|
||||
string json = "{ \"singleDouble\": \"" + jsonValue + "\"}";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0f)]
|
||||
[TestCase("1", 1f)]
|
||||
[TestCase("1.000000", 1f)]
|
||||
[TestCase("-1", -1f)]
|
||||
[TestCase("3.402823e38", 3.402823e38f)]
|
||||
[TestCase("-3.402823e38", -3.402823e38f)]
|
||||
[TestCase("1.5e1", 15f)]
|
||||
[TestCase("15e-1", 1.5f)]
|
||||
public void StringToFloat_Valid(string jsonValue, float expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleFloat\": \"" + jsonValue + "\"}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleFloat);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("3.402824e38")]
|
||||
[TestCase("-3.402824e38")]
|
||||
[TestCase("1,0")]
|
||||
[TestCase("1.0.0")]
|
||||
[TestCase("+1")]
|
||||
[TestCase("00")]
|
||||
[TestCase("--1")]
|
||||
public void StringToFloat_Invalid(string jsonValue)
|
||||
{
|
||||
string json = "{ \"singleFloat\": \"" + jsonValue + "\"}";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0)]
|
||||
[TestCase("-0", 0)] // Not entirely clear whether we intend to allow this...
|
||||
[TestCase("1", 1)]
|
||||
[TestCase("-1", -1)]
|
||||
[TestCase("2147483647", 2147483647)]
|
||||
[TestCase("-2147483648", -2147483648)]
|
||||
[TestCase("1e1", 10)]
|
||||
[TestCase("-1e1", -10)]
|
||||
[TestCase("10.00", 10)]
|
||||
[TestCase("-10.00", -10)]
|
||||
public void NumberToInt32_Valid(string jsonValue, int expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleInt32\": " + jsonValue + "}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleInt32);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("+0", typeof(InvalidJsonException))]
|
||||
[TestCase("00", typeof(InvalidJsonException))]
|
||||
[TestCase("-00", typeof(InvalidJsonException))]
|
||||
[TestCase("--1", typeof(InvalidJsonException))]
|
||||
[TestCase("+1", typeof(InvalidJsonException))]
|
||||
[TestCase("1.5", typeof(InvalidProtocolBufferException))]
|
||||
// Value is out of range
|
||||
[TestCase("1e10", typeof(InvalidProtocolBufferException))]
|
||||
[TestCase("2147483648", typeof(InvalidProtocolBufferException))]
|
||||
[TestCase("-2147483649", typeof(InvalidProtocolBufferException))]
|
||||
public void NumberToInt32_Invalid(string jsonValue, System.Type expectedExceptionType)
|
||||
{
|
||||
string json = "{ \"singleInt32\": " + jsonValue + "}";
|
||||
Assert.Throws(expectedExceptionType, () => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0U)]
|
||||
[TestCase("1", 1U)]
|
||||
[TestCase("4294967295", 4294967295U)]
|
||||
public void NumberToUInt32_Valid(string jsonValue, uint expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleUint32\": " + jsonValue + "}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleUint32);
|
||||
}
|
||||
|
||||
// Assume that anything non-bounds-related is covered in the Int32 case
|
||||
[Test]
|
||||
[TestCase("-1")]
|
||||
[TestCase("4294967296")]
|
||||
public void NumberToUInt32_Invalid(string jsonValue)
|
||||
{
|
||||
string json = "{ \"singleUint32\": " + jsonValue + "}";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0L)]
|
||||
[TestCase("1", 1L)]
|
||||
[TestCase("-1", -1L)]
|
||||
// long.MaxValue isn't actually representable as a double. This string value is the highest
|
||||
// representable value which isn't greater than long.MaxValue.
|
||||
[TestCase("9223372036854774784", 9223372036854774784)]
|
||||
[TestCase("-9223372036854775808", -9223372036854775808)]
|
||||
public void NumberToInt64_Valid(string jsonValue, long expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleInt64\": " + jsonValue + "}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleInt64);
|
||||
}
|
||||
|
||||
// Assume that anything non-bounds-related is covered in the Int32 case
|
||||
[Test]
|
||||
[TestCase("9223372036854775808")]
|
||||
// Theoretical bound would be -9223372036854775809, but when that is parsed to a double
|
||||
// we end up with the exact value of long.MinValue due to lack of precision. The value here
|
||||
// is the "next double down".
|
||||
[TestCase("-9223372036854780000")]
|
||||
public void NumberToInt64_Invalid(string jsonValue)
|
||||
{
|
||||
string json = "{ \"singleInt64\": " + jsonValue + "}";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0UL)]
|
||||
[TestCase("1", 1UL)]
|
||||
// ulong.MaxValue isn't representable as a double. This value is the largest double within
|
||||
// the range of ulong.
|
||||
[TestCase("18446744073709549568", 18446744073709549568UL)]
|
||||
public void NumberToUInt64_Valid(string jsonValue, ulong expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleUint64\": " + jsonValue + "}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleUint64);
|
||||
}
|
||||
|
||||
// Assume that anything non-bounds-related is covered in the Int32 case
|
||||
[Test]
|
||||
[TestCase("-1")]
|
||||
[TestCase("18446744073709551616")]
|
||||
public void NumberToUInt64_Invalid(string jsonValue)
|
||||
{
|
||||
string json = "{ \"singleUint64\": " + jsonValue + "}";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0d)]
|
||||
[TestCase("1", 1d)]
|
||||
[TestCase("1.000000", 1d)]
|
||||
[TestCase("1.0000000000000000000000001", 1d)] // We don't notice that we haven't preserved the exact value
|
||||
[TestCase("-1", -1d)]
|
||||
[TestCase("1e1", 10d)]
|
||||
[TestCase("1e01", 10d)] // Leading decimals are allowed in exponents
|
||||
[TestCase("1E1", 10d)] // Either case is fine
|
||||
[TestCase("-1e1", -10d)]
|
||||
[TestCase("1.5e1", 15d)]
|
||||
[TestCase("-1.5e1", -15d)]
|
||||
[TestCase("15e-1", 1.5d)]
|
||||
[TestCase("-15e-1", -1.5d)]
|
||||
[TestCase("1.79769e308", 1.79769e308)]
|
||||
[TestCase("-1.79769e308", -1.79769e308)]
|
||||
public void NumberToDouble_Valid(string jsonValue, double expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleDouble\": " + jsonValue + "}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleDouble);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("1.7977e308")]
|
||||
[TestCase("-1.7977e308")]
|
||||
[TestCase("1e309")]
|
||||
[TestCase("1,0")]
|
||||
[TestCase("1.0.0")]
|
||||
[TestCase("+1")]
|
||||
[TestCase("00")]
|
||||
[TestCase("--1")]
|
||||
[TestCase("\u00BD")] // 1/2 as a single Unicode character. Just sanity checking...
|
||||
public void NumberToDouble_Invalid(string jsonValue)
|
||||
{
|
||||
string json = "{ \"singleDouble\": " + jsonValue + "}";
|
||||
Assert.Throws<InvalidJsonException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0f)]
|
||||
[TestCase("1", 1f)]
|
||||
[TestCase("1.000000", 1f)]
|
||||
[TestCase("-1", -1f)]
|
||||
[TestCase("3.402823e38", 3.402823e38f)]
|
||||
[TestCase("-3.402823e38", -3.402823e38f)]
|
||||
[TestCase("1.5e1", 15f)]
|
||||
[TestCase("15e-1", 1.5f)]
|
||||
public void NumberToFloat_Valid(string jsonValue, float expectedParsedValue)
|
||||
{
|
||||
string json = "{ \"singleFloat\": " + jsonValue + "}";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(expectedParsedValue, parsed.SingleFloat);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("3.402824e38", typeof(InvalidProtocolBufferException))]
|
||||
[TestCase("-3.402824e38", typeof(InvalidProtocolBufferException))]
|
||||
[TestCase("1,0", typeof(InvalidJsonException))]
|
||||
[TestCase("1.0.0", typeof(InvalidJsonException))]
|
||||
[TestCase("+1", typeof(InvalidJsonException))]
|
||||
[TestCase("00", typeof(InvalidJsonException))]
|
||||
[TestCase("--1", typeof(InvalidJsonException))]
|
||||
public void NumberToFloat_Invalid(string jsonValue, System.Type expectedExceptionType)
|
||||
{
|
||||
string json = "{ \"singleFloat\": " + jsonValue + "}";
|
||||
Assert.Throws(expectedExceptionType, () => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
// The simplest way of testing that the value has parsed correctly is to reformat it,
|
||||
// as we trust the formatting. In many cases that will give the same result as the input,
|
||||
// so in those cases we accept an expectedFormatted value of null. Sometimes the results
|
||||
// will be different though, due to a different number of digits being provided.
|
||||
[Test]
|
||||
// Z offset
|
||||
[TestCase("2015-10-09T14:46:23.123456789Z", null)]
|
||||
[TestCase("2015-10-09T14:46:23.123456Z", null)]
|
||||
[TestCase("2015-10-09T14:46:23.123Z", null)]
|
||||
[TestCase("2015-10-09T14:46:23Z", null)]
|
||||
[TestCase("2015-10-09T14:46:23.123456000Z", "2015-10-09T14:46:23.123456Z")]
|
||||
[TestCase("2015-10-09T14:46:23.1234560Z", "2015-10-09T14:46:23.123456Z")]
|
||||
[TestCase("2015-10-09T14:46:23.123000000Z", "2015-10-09T14:46:23.123Z")]
|
||||
[TestCase("2015-10-09T14:46:23.1230Z", "2015-10-09T14:46:23.123Z")]
|
||||
[TestCase("2015-10-09T14:46:23.00Z", "2015-10-09T14:46:23Z")]
|
||||
|
||||
// +00:00 offset
|
||||
[TestCase("2015-10-09T14:46:23.123456789+00:00", "2015-10-09T14:46:23.123456789Z")]
|
||||
[TestCase("2015-10-09T14:46:23.123456+00:00", "2015-10-09T14:46:23.123456Z")]
|
||||
[TestCase("2015-10-09T14:46:23.123+00:00", "2015-10-09T14:46:23.123Z")]
|
||||
[TestCase("2015-10-09T14:46:23+00:00", "2015-10-09T14:46:23Z")]
|
||||
[TestCase("2015-10-09T14:46:23.123456000+00:00", "2015-10-09T14:46:23.123456Z")]
|
||||
[TestCase("2015-10-09T14:46:23.1234560+00:00", "2015-10-09T14:46:23.123456Z")]
|
||||
[TestCase("2015-10-09T14:46:23.123000000+00:00", "2015-10-09T14:46:23.123Z")]
|
||||
[TestCase("2015-10-09T14:46:23.1230+00:00", "2015-10-09T14:46:23.123Z")]
|
||||
[TestCase("2015-10-09T14:46:23.00+00:00", "2015-10-09T14:46:23Z")]
|
||||
|
||||
// Other offsets (assume by now that the subsecond handling is okay)
|
||||
[TestCase("2015-10-09T15:46:23.123456789+01:00", "2015-10-09T14:46:23.123456789Z")]
|
||||
[TestCase("2015-10-09T13:46:23.123456789-01:00", "2015-10-09T14:46:23.123456789Z")]
|
||||
[TestCase("2015-10-09T15:16:23.123456789+00:30", "2015-10-09T14:46:23.123456789Z")]
|
||||
[TestCase("2015-10-09T14:16:23.123456789-00:30", "2015-10-09T14:46:23.123456789Z")]
|
||||
[TestCase("2015-10-09T16:31:23.123456789+01:45", "2015-10-09T14:46:23.123456789Z")]
|
||||
[TestCase("2015-10-09T13:01:23.123456789-01:45", "2015-10-09T14:46:23.123456789Z")]
|
||||
[TestCase("2015-10-10T08:46:23.123456789+18:00", "2015-10-09T14:46:23.123456789Z")]
|
||||
[TestCase("2015-10-08T20:46:23.123456789-18:00", "2015-10-09T14:46:23.123456789Z")]
|
||||
|
||||
// Leap years and min/max
|
||||
[TestCase("2016-02-29T14:46:23.123456789Z", null)]
|
||||
[TestCase("2000-02-29T14:46:23.123456789Z", null)]
|
||||
[TestCase("0001-01-01T00:00:00Z", null)]
|
||||
[TestCase("9999-12-31T23:59:59.999999999Z", null)]
|
||||
public void Timestamp_Valid(string jsonValue, string expectedFormatted)
|
||||
{
|
||||
expectedFormatted = expectedFormatted ?? jsonValue;
|
||||
string json = WrapInQuotes(jsonValue);
|
||||
var parsed = Timestamp.Parser.ParseJson(json);
|
||||
Assert.AreEqual(WrapInQuotes(expectedFormatted), parsed.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("2015-10-09 14:46:23.123456789Z", Description = "No T between date and time")]
|
||||
[TestCase("2015/10/09T14:46:23.123456789Z", Description = "Wrong date separators")]
|
||||
[TestCase("2015-10-09T14.46.23.123456789Z", Description = "Wrong time separators")]
|
||||
[TestCase("2015-10-09T14:46:23,123456789Z", Description = "Wrong fractional second separators (valid ISO-8601 though)")]
|
||||
[TestCase(" 2015-10-09T14:46:23.123456789Z", Description = "Whitespace at start")]
|
||||
[TestCase("2015-10-09T14:46:23.123456789Z ", Description = "Whitespace at end")]
|
||||
[TestCase("2015-10-09T14:46:23.1234567890", Description = "Too many digits")]
|
||||
[TestCase("2015-10-09T14:46:23.123456789", Description = "No offset")]
|
||||
[TestCase("2015-13-09T14:46:23.123456789Z", Description = "Invalid month")]
|
||||
[TestCase("2015-10-32T14:46:23.123456789Z", Description = "Invalid day")]
|
||||
[TestCase("2015-10-09T24:00:00.000000000Z", Description = "Invalid hour (valid ISO-8601 though)")]
|
||||
[TestCase("2015-10-09T14:60:23.123456789Z", Description = "Invalid minutes")]
|
||||
[TestCase("2015-10-09T14:46:60.123456789Z", Description = "Invalid seconds")]
|
||||
[TestCase("2015-10-09T14:46:23.123456789+18:01", Description = "Offset too large (positive)")]
|
||||
[TestCase("2015-10-09T14:46:23.123456789-18:01", Description = "Offset too large (negative)")]
|
||||
[TestCase("2015-10-09T14:46:23.123456789-00:00", Description = "Local offset (-00:00) makes no sense here")]
|
||||
[TestCase("0001-01-01T00:00:00+00:01", Description = "Value before earliest when offset applied")]
|
||||
[TestCase("9999-12-31T23:59:59.999999999-00:01", Description = "Value after latest when offset applied")]
|
||||
[TestCase("2100-02-29T14:46:23.123456789Z", Description = "Feb 29th on a non-leap-year")]
|
||||
public void Timestamp_Invalid(string jsonValue)
|
||||
{
|
||||
string json = WrapInQuotes(jsonValue);
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => Timestamp.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StructValue_Null()
|
||||
{
|
||||
Assert.AreEqual(new Value { NullValue = 0 }, Value.Parser.ParseJson("null"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StructValue_String()
|
||||
{
|
||||
Assert.AreEqual(new Value { StringValue = "hi" }, Value.Parser.ParseJson("\"hi\""));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StructValue_Bool()
|
||||
{
|
||||
Assert.AreEqual(new Value { BoolValue = true }, Value.Parser.ParseJson("true"));
|
||||
Assert.AreEqual(new Value { BoolValue = false }, Value.Parser.ParseJson("false"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StructValue_List()
|
||||
{
|
||||
Assert.AreEqual(Value.ForList(Value.ForNumber(1), Value.ForString("x")), Value.Parser.ParseJson("[1, \"x\"]"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ParseListValue()
|
||||
{
|
||||
Assert.AreEqual(new ListValue { Values = { Value.ForNumber(1), Value.ForString("x") } }, ListValue.Parser.ParseJson("[1, \"x\"]"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void StructValue_Struct()
|
||||
{
|
||||
Assert.AreEqual(
|
||||
Value.ForStruct(new Struct { Fields = { { "x", Value.ForNumber(1) }, { "y", Value.ForString("z") } } }),
|
||||
Value.Parser.ParseJson("{ \"x\": 1, \"y\": \"z\" }"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ParseStruct()
|
||||
{
|
||||
Assert.AreEqual(new Struct { Fields = { { "x", Value.ForNumber(1) }, { "y", Value.ForString("z") } } },
|
||||
Struct.Parser.ParseJson("{ \"x\": 1, \"y\": \"z\" }"));
|
||||
}
|
||||
|
||||
// TODO for duration parsing: upper and lower bounds.
|
||||
// +/- 315576000000 seconds
|
||||
|
||||
[Test]
|
||||
[TestCase("1.123456789s", null)]
|
||||
[TestCase("1.123456s", null)]
|
||||
[TestCase("1.123s", null)]
|
||||
[TestCase("1.12300s", "1.123s")]
|
||||
[TestCase("1.12345s", "1.123450s")]
|
||||
[TestCase("1s", null)]
|
||||
[TestCase("-1.123456789s", null)]
|
||||
[TestCase("-1.123456s", null)]
|
||||
[TestCase("-1.123s", null)]
|
||||
[TestCase("-1s", null)]
|
||||
[TestCase("0.123s", null)]
|
||||
[TestCase("-0.123s", null)]
|
||||
[TestCase("123456.123s", null)]
|
||||
[TestCase("-123456.123s", null)]
|
||||
// Upper and lower bounds
|
||||
[TestCase("315576000000s", null)]
|
||||
[TestCase("-315576000000s", null)]
|
||||
public void Duration_Valid(string jsonValue, string expectedFormatted)
|
||||
{
|
||||
expectedFormatted = expectedFormatted ?? jsonValue;
|
||||
string json = WrapInQuotes(jsonValue);
|
||||
var parsed = Duration.Parser.ParseJson(json);
|
||||
Assert.AreEqual(WrapInQuotes(expectedFormatted), parsed.ToString());
|
||||
}
|
||||
|
||||
// The simplest way of testing that the value has parsed correctly is to reformat it,
|
||||
// as we trust the formatting. In many cases that will give the same result as the input,
|
||||
// so in those cases we accept an expectedFormatted value of null. Sometimes the results
|
||||
// will be different though, due to a different number of digits being provided.
|
||||
[Test]
|
||||
[TestCase("1.1234567890s", Description = "Too many digits")]
|
||||
[TestCase("1.123456789", Description = "No suffix")]
|
||||
[TestCase("1.123456789ss", Description = "Too much suffix")]
|
||||
[TestCase("1.123456789S", Description = "Upper case suffix")]
|
||||
[TestCase("+1.123456789s", Description = "Leading +")]
|
||||
[TestCase(".123456789s", Description = "No integer before the fraction")]
|
||||
[TestCase("1,123456789s", Description = "Comma as decimal separator")]
|
||||
[TestCase("1x1.123456789s", Description = "Non-digit in integer part")]
|
||||
[TestCase("1.1x3456789s", Description = "Non-digit in fractional part")]
|
||||
[TestCase(" 1.123456789s", Description = "Whitespace before fraction")]
|
||||
[TestCase("1.123456789s ", Description = "Whitespace after value")]
|
||||
[TestCase("01.123456789s", Description = "Leading zero (positive)")]
|
||||
[TestCase("-01.123456789s", Description = "Leading zero (negative)")]
|
||||
[TestCase("--0.123456789s", Description = "Double minus sign")]
|
||||
// Violate upper/lower bounds in various ways
|
||||
[TestCase("315576000001s", Description = "Integer part too large")]
|
||||
[TestCase("3155760000000s", Description = "Integer part too long (positive)")]
|
||||
[TestCase("-3155760000000s", Description = "Integer part too long (negative)")]
|
||||
public void Duration_Invalid(string jsonValue)
|
||||
{
|
||||
string json = WrapInQuotes(jsonValue);
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => Duration.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
// Not as many tests for field masks as I'd like; more to be added when we have more
|
||||
// detailed specifications.
|
||||
|
||||
[Test]
|
||||
[TestCase("")]
|
||||
[TestCase("foo", "foo")]
|
||||
[TestCase("foo,bar", "foo", "bar")]
|
||||
[TestCase("foo.bar", "foo.bar")]
|
||||
[TestCase("fooBar", "foo_bar")]
|
||||
[TestCase("fooBar.bazQux", "foo_bar.baz_qux")]
|
||||
public void FieldMask_Valid(string jsonValue, params string[] expectedPaths)
|
||||
{
|
||||
string json = WrapInQuotes(jsonValue);
|
||||
var parsed = FieldMask.Parser.ParseJson(json);
|
||||
CollectionAssert.AreEqual(expectedPaths, parsed.Paths);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("foo_bar")]
|
||||
public void FieldMask_Invalid(string jsonValue)
|
||||
{
|
||||
string json = WrapInQuotes(jsonValue);
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => FieldMask.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Any_RegularMessage()
|
||||
{
|
||||
var registry = TypeRegistry.FromMessages(TestAllTypes.Descriptor);
|
||||
var formatter = new JsonFormatter(new JsonFormatter.Settings(false, TypeRegistry.FromMessages(TestAllTypes.Descriptor)));
|
||||
var message = new TestAllTypes { SingleInt32 = 10, SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 20 } };
|
||||
var original = Any.Pack(message);
|
||||
var json = formatter.Format(original); // This is tested in JsonFormatterTest
|
||||
var parser = new JsonParser(new JsonParser.Settings(10, registry));
|
||||
Assert.AreEqual(original, parser.Parse<Any>(json));
|
||||
string valueFirstJson = "{ \"singleInt32\": 10, \"singleNestedMessage\": { \"bb\": 20 }, \"@type\": \"type.googleapis.com/protobuf_unittest.TestAllTypes\" }";
|
||||
Assert.AreEqual(original, parser.Parse<Any>(valueFirstJson));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Any_CustomPrefix()
|
||||
{
|
||||
var registry = TypeRegistry.FromMessages(TestAllTypes.Descriptor);
|
||||
var message = new TestAllTypes { SingleInt32 = 10 };
|
||||
var original = Any.Pack(message, "custom.prefix/middle-part");
|
||||
var parser = new JsonParser(new JsonParser.Settings(10, registry));
|
||||
string json = "{ \"@type\": \"custom.prefix/middle-part/protobuf_unittest.TestAllTypes\", \"singleInt32\": 10 }";
|
||||
Assert.AreEqual(original, parser.Parse<Any>(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Any_UnknownType()
|
||||
{
|
||||
string json = "{ \"@type\": \"type.googleapis.com/bogus\" }";
|
||||
Assert.Throws<InvalidOperationException>(() => Any.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Any_NoTypeUrl()
|
||||
{
|
||||
string json = "{ \"foo\": \"bar\" }";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => Any.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Any_WellKnownType()
|
||||
{
|
||||
var registry = TypeRegistry.FromMessages(Timestamp.Descriptor);
|
||||
var formatter = new JsonFormatter(new JsonFormatter.Settings(false, registry));
|
||||
var timestamp = new DateTime(1673, 6, 19, 12, 34, 56, DateTimeKind.Utc).ToTimestamp();
|
||||
var original = Any.Pack(timestamp);
|
||||
var json = formatter.Format(original); // This is tested in JsonFormatterTest
|
||||
var parser = new JsonParser(new JsonParser.Settings(10, registry));
|
||||
Assert.AreEqual(original, parser.Parse<Any>(json));
|
||||
string valueFirstJson = "{ \"value\": \"1673-06-19T12:34:56Z\", \"@type\": \"type.googleapis.com/google.protobuf.Timestamp\" }";
|
||||
Assert.AreEqual(original, parser.Parse<Any>(valueFirstJson));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Any_Nested()
|
||||
{
|
||||
var registry = TypeRegistry.FromMessages(TestWellKnownTypes.Descriptor, TestAllTypes.Descriptor);
|
||||
var formatter = new JsonFormatter(new JsonFormatter.Settings(false, registry));
|
||||
var parser = new JsonParser(new JsonParser.Settings(10, registry));
|
||||
var doubleNestedMessage = new TestAllTypes { SingleInt32 = 20 };
|
||||
var nestedMessage = Any.Pack(doubleNestedMessage);
|
||||
var message = new TestWellKnownTypes { AnyField = Any.Pack(nestedMessage) };
|
||||
var json = formatter.Format(message);
|
||||
// Use the descriptor-based parser just for a change.
|
||||
Assert.AreEqual(message, parser.Parse(json, TestWellKnownTypes.Descriptor));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DataAfterObject()
|
||||
{
|
||||
string json = "{} 10";
|
||||
Assert.Throws<InvalidJsonException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON equivalent to <see cref="CodedInputStreamTest.MaliciousRecursion"/>
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void MaliciousRecursion()
|
||||
{
|
||||
string data64 = CodedInputStreamTest.MakeRecursiveMessage(64).ToString();
|
||||
string data65 = CodedInputStreamTest.MakeRecursiveMessage(65).ToString();
|
||||
|
||||
var parser64 = new JsonParser(new JsonParser.Settings(64));
|
||||
CodedInputStreamTest.AssertMessageDepth(parser64.Parse<TestRecursiveMessage>(data64), 64);
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => parser64.Parse<TestRecursiveMessage>(data65));
|
||||
|
||||
var parser63 = new JsonParser(new JsonParser.Settings(63));
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => parser63.Parse<TestRecursiveMessage>(data64));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("AQI")]
|
||||
[TestCase("_-==")]
|
||||
public void Bytes_InvalidBase64(string badBase64)
|
||||
{
|
||||
string json = "{ \"singleBytes\": \"" + badBase64 + "\" }";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("\"FOREIGN_BAR\"", ForeignEnum.ForeignBar)]
|
||||
[TestCase("5", ForeignEnum.ForeignBar)]
|
||||
[TestCase("100", (ForeignEnum)100)]
|
||||
public void EnumValid(string value, ForeignEnum expectedValue)
|
||||
{
|
||||
string json = "{ \"singleForeignEnum\": " + value + " }";
|
||||
var parsed = TestAllTypes.Parser.ParseJson(json);
|
||||
Assert.AreEqual(new TestAllTypes { SingleForeignEnum = expectedValue }, parsed);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("\"NOT_A_VALID_VALUE\"")]
|
||||
[TestCase("5.5")]
|
||||
public void Enum_Invalid(string value)
|
||||
{
|
||||
string json = "{ \"singleForeignEnum\": " + value + " }";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void OneofDuplicate_Invalid()
|
||||
{
|
||||
string json = "{ \"oneofString\": \"x\", \"oneofUint32\": 10 }";
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => TestAllTypes.Parser.ParseJson(json));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Various tests use strings which have quotes round them for parsing or as the result
|
||||
/// of formatting, but without those quotes being specified in the tests (for the sake of readability).
|
||||
/// This method simply returns the input, wrapped in double quotes.
|
||||
/// </summary>
|
||||
internal static string WrapInQuotes(string text)
|
||||
{
|
||||
return '"' + text + '"';
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,408 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
public class JsonTokenizerTest
|
||||
{
|
||||
[Test]
|
||||
public void EmptyObjectValue()
|
||||
{
|
||||
AssertTokens("{}", JsonToken.StartObject, JsonToken.EndObject);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EmptyArrayValue()
|
||||
{
|
||||
AssertTokens("[]", JsonToken.StartArray, JsonToken.EndArray);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("foo", "foo")]
|
||||
[TestCase("tab\\t", "tab\t")]
|
||||
[TestCase("line\\nfeed", "line\nfeed")]
|
||||
[TestCase("carriage\\rreturn", "carriage\rreturn")]
|
||||
[TestCase("back\\bspace", "back\bspace")]
|
||||
[TestCase("form\\ffeed", "form\ffeed")]
|
||||
[TestCase("escaped\\/slash", "escaped/slash")]
|
||||
[TestCase("escaped\\\\backslash", "escaped\\backslash")]
|
||||
[TestCase("escaped\\\"quote", "escaped\"quote")]
|
||||
[TestCase("foo {}[] bar", "foo {}[] bar")]
|
||||
[TestCase("foo\\u09aFbar", "foo\u09afbar")] // Digits, upper hex, lower hex
|
||||
[TestCase("ab\ud800\udc00cd", "ab\ud800\udc00cd")]
|
||||
[TestCase("ab\\ud800\\udc00cd", "ab\ud800\udc00cd")]
|
||||
public void StringValue(string json, string expectedValue)
|
||||
{
|
||||
AssertTokensNoReplacement("\"" + json + "\"", JsonToken.Value(expectedValue));
|
||||
}
|
||||
|
||||
// Valid surrogate pairs, with mixed escaping. These test cases can't be expressed
|
||||
// using TestCase as they have no valid UTF-8 representation.
|
||||
// It's unclear exactly how we should handle a mixture of escaped or not: that can't
|
||||
// come from UTF-8 text, but could come from a .NET string. For the moment,
|
||||
// treat it as valid in the obvious way.
|
||||
[Test]
|
||||
public void MixedSurrogatePairs()
|
||||
{
|
||||
string expected = "\ud800\udc00";
|
||||
AssertTokens("'\\ud800\udc00'", JsonToken.Value(expected));
|
||||
AssertTokens("'\ud800\\udc00'", JsonToken.Value(expected));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ObjectDepth()
|
||||
{
|
||||
string json = "{ \"foo\": { \"x\": 1, \"y\": [ 0 ] } }";
|
||||
var tokenizer = JsonTokenizer.FromTextReader(new StringReader(json));
|
||||
// If we had more tests like this, I'd introduce a helper method... but for one test, it's not worth it.
|
||||
Assert.AreEqual(0, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.StartObject, tokenizer.Next());
|
||||
Assert.AreEqual(1, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.Name("foo"), tokenizer.Next());
|
||||
Assert.AreEqual(1, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.StartObject, tokenizer.Next());
|
||||
Assert.AreEqual(2, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.Name("x"), tokenizer.Next());
|
||||
Assert.AreEqual(2, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.Value(1), tokenizer.Next());
|
||||
Assert.AreEqual(2, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.Name("y"), tokenizer.Next());
|
||||
Assert.AreEqual(2, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.StartArray, tokenizer.Next());
|
||||
Assert.AreEqual(2, tokenizer.ObjectDepth); // Depth hasn't changed in array
|
||||
Assert.AreEqual(JsonToken.Value(0), tokenizer.Next());
|
||||
Assert.AreEqual(2, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.EndArray, tokenizer.Next());
|
||||
Assert.AreEqual(2, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.EndObject, tokenizer.Next());
|
||||
Assert.AreEqual(1, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.EndObject, tokenizer.Next());
|
||||
Assert.AreEqual(0, tokenizer.ObjectDepth);
|
||||
Assert.AreEqual(JsonToken.EndDocument, tokenizer.Next());
|
||||
Assert.AreEqual(0, tokenizer.ObjectDepth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ObjectDepth_WithPushBack()
|
||||
{
|
||||
string json = "{}";
|
||||
var tokenizer = JsonTokenizer.FromTextReader(new StringReader(json));
|
||||
Assert.AreEqual(0, tokenizer.ObjectDepth);
|
||||
var token = tokenizer.Next();
|
||||
Assert.AreEqual(1, tokenizer.ObjectDepth);
|
||||
// When we push back a "start object", we should effectively be back to the previous depth.
|
||||
tokenizer.PushBack(token);
|
||||
Assert.AreEqual(0, tokenizer.ObjectDepth);
|
||||
// Read the same token again, and get back to depth 1
|
||||
token = tokenizer.Next();
|
||||
Assert.AreEqual(1, tokenizer.ObjectDepth);
|
||||
|
||||
// Now the same in reverse, with EndObject
|
||||
token = tokenizer.Next();
|
||||
Assert.AreEqual(0, tokenizer.ObjectDepth);
|
||||
tokenizer.PushBack(token);
|
||||
Assert.AreEqual(1, tokenizer.ObjectDepth);
|
||||
tokenizer.Next();
|
||||
Assert.AreEqual(0, tokenizer.ObjectDepth);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("embedded tab\t")]
|
||||
[TestCase("embedded CR\r")]
|
||||
[TestCase("embedded LF\n")]
|
||||
[TestCase("embedded bell\u0007")]
|
||||
[TestCase("bad escape\\a")]
|
||||
[TestCase("incomplete escape\\")]
|
||||
[TestCase("incomplete Unicode escape\\u000")]
|
||||
[TestCase("invalid Unicode escape\\u000H")]
|
||||
// Surrogate pair handling, both in raw .NET strings and escaped. We only need
|
||||
// to detect this in strings, as non-ASCII characters anywhere other than in strings
|
||||
// will already lead to parsing errors.
|
||||
[TestCase("\\ud800")]
|
||||
[TestCase("\\udc00")]
|
||||
[TestCase("\\ud800x")]
|
||||
[TestCase("\\udc00x")]
|
||||
[TestCase("\\udc00\\ud800y")]
|
||||
public void InvalidStringValue(string json)
|
||||
{
|
||||
AssertThrowsAfter("\"" + json + "\"");
|
||||
}
|
||||
|
||||
// Tests for invalid strings that can't be expressed in attributes,
|
||||
// as the constants can't be expressed as UTF-8 strings.
|
||||
[Test]
|
||||
public void InvalidSurrogatePairs()
|
||||
{
|
||||
AssertThrowsAfter("\"\ud800x\"");
|
||||
AssertThrowsAfter("\"\udc00y\"");
|
||||
AssertThrowsAfter("\"\udc00\ud800y\"");
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("0", 0)]
|
||||
[TestCase("-0", 0)] // We don't distinguish between positive and negative 0
|
||||
[TestCase("1", 1)]
|
||||
[TestCase("-1", -1)]
|
||||
// From here on, assume leading sign is okay...
|
||||
[TestCase("1.125", 1.125)]
|
||||
[TestCase("1.0", 1)]
|
||||
[TestCase("1e5", 100000)]
|
||||
[TestCase("1e000000", 1)] // Weird, but not prohibited by the spec
|
||||
[TestCase("1E5", 100000)]
|
||||
[TestCase("1e+5", 100000)]
|
||||
[TestCase("1E-5", 0.00001)]
|
||||
[TestCase("123E-2", 1.23)]
|
||||
[TestCase("123.45E3", 123450)]
|
||||
[TestCase(" 1 ", 1)]
|
||||
public void NumberValue(string json, double expectedValue)
|
||||
{
|
||||
AssertTokens(json, JsonToken.Value(expectedValue));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("00")]
|
||||
[TestCase(".5")]
|
||||
[TestCase("1.")]
|
||||
[TestCase("1e")]
|
||||
[TestCase("1e-")]
|
||||
[TestCase("--")]
|
||||
[TestCase("--1")]
|
||||
[TestCase("-1.7977e308")]
|
||||
[TestCase("1.7977e308")]
|
||||
public void InvalidNumberValue(string json)
|
||||
{
|
||||
AssertThrowsAfter(json);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("nul")]
|
||||
[TestCase("nothing")]
|
||||
[TestCase("truth")]
|
||||
[TestCase("fALSEhood")]
|
||||
public void InvalidLiterals(string json)
|
||||
{
|
||||
AssertThrowsAfter(json);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NullValue()
|
||||
{
|
||||
AssertTokens("null", JsonToken.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TrueValue()
|
||||
{
|
||||
AssertTokens("true", JsonToken.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FalseValue()
|
||||
{
|
||||
AssertTokens("false", JsonToken.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SimpleObject()
|
||||
{
|
||||
AssertTokens("{'x': 'y'}",
|
||||
JsonToken.StartObject, JsonToken.Name("x"), JsonToken.Value("y"), JsonToken.EndObject);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("[10, 20", 3)]
|
||||
[TestCase("[10,", 2)]
|
||||
[TestCase("[10:20]", 2)]
|
||||
[TestCase("[", 1)]
|
||||
[TestCase("[,", 1)]
|
||||
[TestCase("{", 1)]
|
||||
[TestCase("{,", 1)]
|
||||
[TestCase("{[", 1)]
|
||||
[TestCase("{{", 1)]
|
||||
[TestCase("{0", 1)]
|
||||
[TestCase("{null", 1)]
|
||||
[TestCase("{false", 1)]
|
||||
[TestCase("{true", 1)]
|
||||
[TestCase("}", 0)]
|
||||
[TestCase("]", 0)]
|
||||
[TestCase(",", 0)]
|
||||
[TestCase("'foo' 'bar'", 1)]
|
||||
[TestCase(":", 0)]
|
||||
[TestCase("'foo", 0)] // Incomplete string
|
||||
[TestCase("{ 'foo' }", 2)]
|
||||
[TestCase("{ x:1", 1)] // Property names must be quoted
|
||||
[TestCase("{]", 1)]
|
||||
[TestCase("[}", 1)]
|
||||
[TestCase("[1,", 2)]
|
||||
[TestCase("{'x':0]", 3)]
|
||||
[TestCase("{ 'foo': }", 2)]
|
||||
[TestCase("{ 'foo':'bar', }", 3)]
|
||||
public void InvalidStructure(string json, int expectedValidTokens)
|
||||
{
|
||||
// Note: we don't test that the earlier tokens are exactly as expected,
|
||||
// partly because that's hard to parameterize.
|
||||
var reader = new StringReader(json.Replace('\'', '"'));
|
||||
var tokenizer = JsonTokenizer.FromTextReader(reader);
|
||||
for (int i = 0; i < expectedValidTokens; i++)
|
||||
{
|
||||
Assert.IsNotNull(tokenizer.Next());
|
||||
}
|
||||
Assert.Throws<InvalidJsonException>(() => tokenizer.Next());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ArrayMixedType()
|
||||
{
|
||||
AssertTokens("[1, 'foo', null, false, true, [2], {'x':'y' }]",
|
||||
JsonToken.StartArray,
|
||||
JsonToken.Value(1),
|
||||
JsonToken.Value("foo"),
|
||||
JsonToken.Null,
|
||||
JsonToken.False,
|
||||
JsonToken.True,
|
||||
JsonToken.StartArray,
|
||||
JsonToken.Value(2),
|
||||
JsonToken.EndArray,
|
||||
JsonToken.StartObject,
|
||||
JsonToken.Name("x"),
|
||||
JsonToken.Value("y"),
|
||||
JsonToken.EndObject,
|
||||
JsonToken.EndArray);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ObjectMixedType()
|
||||
{
|
||||
AssertTokens(@"{'a': 1, 'b': 'bar', 'c': null, 'd': false, 'e': true,
|
||||
'f': [2], 'g': {'x':'y' }}",
|
||||
JsonToken.StartObject,
|
||||
JsonToken.Name("a"),
|
||||
JsonToken.Value(1),
|
||||
JsonToken.Name("b"),
|
||||
JsonToken.Value("bar"),
|
||||
JsonToken.Name("c"),
|
||||
JsonToken.Null,
|
||||
JsonToken.Name("d"),
|
||||
JsonToken.False,
|
||||
JsonToken.Name("e"),
|
||||
JsonToken.True,
|
||||
JsonToken.Name("f"),
|
||||
JsonToken.StartArray,
|
||||
JsonToken.Value(2),
|
||||
JsonToken.EndArray,
|
||||
JsonToken.Name("g"),
|
||||
JsonToken.StartObject,
|
||||
JsonToken.Name("x"),
|
||||
JsonToken.Value("y"),
|
||||
JsonToken.EndObject,
|
||||
JsonToken.EndObject);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NextAfterEndDocumentThrows()
|
||||
{
|
||||
var tokenizer = JsonTokenizer.FromTextReader(new StringReader("null"));
|
||||
Assert.AreEqual(JsonToken.Null, tokenizer.Next());
|
||||
Assert.AreEqual(JsonToken.EndDocument, tokenizer.Next());
|
||||
Assert.Throws<InvalidOperationException>(() => tokenizer.Next());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CanPushBackEndDocument()
|
||||
{
|
||||
var tokenizer = JsonTokenizer.FromTextReader(new StringReader("null"));
|
||||
Assert.AreEqual(JsonToken.Null, tokenizer.Next());
|
||||
Assert.AreEqual(JsonToken.EndDocument, tokenizer.Next());
|
||||
tokenizer.PushBack(JsonToken.EndDocument);
|
||||
Assert.AreEqual(JsonToken.EndDocument, tokenizer.Next());
|
||||
Assert.Throws<InvalidOperationException>(() => tokenizer.Next());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Asserts that the specified JSON is tokenized into the given sequence of tokens.
|
||||
/// All apostrophes are first converted to double quotes, allowing any tests
|
||||
/// that don't need to check actual apostrophe handling to use apostrophes in the JSON, avoiding
|
||||
/// messy string literal escaping. The "end document" token is not specified in the list of
|
||||
/// expected tokens, but is implicit.
|
||||
/// </summary>
|
||||
private static void AssertTokens(string json, params JsonToken[] expectedTokens)
|
||||
{
|
||||
AssertTokensNoReplacement(json.Replace('\'', '"'), expectedTokens);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Asserts that the specified JSON is tokenized into the given sequence of tokens.
|
||||
/// Unlike <see cref="AssertTokens(string, JsonToken[])"/>, this does not perform any character
|
||||
/// replacement on the specified JSON, and should be used when the text contains apostrophes which
|
||||
/// are expected to be used *as* apostrophes. The "end document" token is not specified in the list of
|
||||
/// expected tokens, but is implicit.
|
||||
/// </summary>
|
||||
private static void AssertTokensNoReplacement(string json, params JsonToken[] expectedTokens)
|
||||
{
|
||||
var reader = new StringReader(json);
|
||||
var tokenizer = JsonTokenizer.FromTextReader(reader);
|
||||
for (int i = 0; i < expectedTokens.Length; i++)
|
||||
{
|
||||
var actualToken = tokenizer.Next();
|
||||
if (actualToken == JsonToken.EndDocument)
|
||||
{
|
||||
Assert.Fail("Expected {0} but reached end of token stream", expectedTokens[i]);
|
||||
}
|
||||
Assert.AreEqual(expectedTokens[i], actualToken);
|
||||
}
|
||||
var finalToken = tokenizer.Next();
|
||||
if (finalToken != JsonToken.EndDocument)
|
||||
{
|
||||
Assert.Fail("Expected token stream to be exhausted; received {0}", finalToken);
|
||||
}
|
||||
}
|
||||
|
||||
private static void AssertThrowsAfter(string json, params JsonToken[] expectedTokens)
|
||||
{
|
||||
var reader = new StringReader(json);
|
||||
var tokenizer = JsonTokenizer.FromTextReader(reader);
|
||||
for (int i = 0; i < expectedTokens.Length; i++)
|
||||
{
|
||||
var actualToken = tokenizer.Next();
|
||||
if (actualToken == JsonToken.EndDocument)
|
||||
{
|
||||
Assert.Fail("Expected {0} but reached end of document", expectedTokens[i]);
|
||||
}
|
||||
Assert.AreEqual(expectedTokens[i], actualToken);
|
||||
}
|
||||
Assert.Throws<InvalidJsonException>(() => tokenizer.Next());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,259 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System.Linq;
|
||||
using Google.Protobuf.TestProtos;
|
||||
using NUnit.Framework;
|
||||
using UnitTest.Issues.TestProtos;
|
||||
|
||||
namespace Google.Protobuf.Reflection
|
||||
{
|
||||
/// <summary>
|
||||
/// Tests for descriptors. (Not in its own namespace or broken up into individual classes as the
|
||||
/// size doesn't warrant it. On the other hand, this makes me feel a bit dirty...)
|
||||
/// </summary>
|
||||
public class DescriptorsTest
|
||||
{
|
||||
[Test]
|
||||
public void FileDescriptor()
|
||||
{
|
||||
FileDescriptor file = UnittestProto3Reflection.Descriptor;
|
||||
|
||||
Assert.AreEqual("google/protobuf/unittest_proto3.proto", file.Name);
|
||||
Assert.AreEqual("protobuf_unittest", file.Package);
|
||||
|
||||
Assert.AreEqual("UnittestProto", file.Proto.Options.JavaOuterClassname);
|
||||
Assert.AreEqual("google/protobuf/unittest_proto3.proto", file.Proto.Name);
|
||||
|
||||
// unittest.proto doesn't have any public imports, but unittest_import.proto does.
|
||||
Assert.AreEqual(0, file.PublicDependencies.Count);
|
||||
Assert.AreEqual(1, UnittestImportProto3Reflection.Descriptor.PublicDependencies.Count);
|
||||
Assert.AreEqual(UnittestImportPublicProto3Reflection.Descriptor, UnittestImportProto3Reflection.Descriptor.PublicDependencies[0]);
|
||||
|
||||
Assert.AreEqual(1, file.Dependencies.Count);
|
||||
Assert.AreEqual(UnittestImportProto3Reflection.Descriptor, file.Dependencies[0]);
|
||||
|
||||
MessageDescriptor messageType = TestAllTypes.Descriptor;
|
||||
Assert.AreSame(typeof(TestAllTypes), messageType.ClrType);
|
||||
Assert.AreSame(TestAllTypes.Parser, messageType.Parser);
|
||||
Assert.AreEqual(messageType, file.MessageTypes[0]);
|
||||
Assert.AreEqual(messageType, file.FindTypeByName<MessageDescriptor>("TestAllTypes"));
|
||||
Assert.Null(file.FindTypeByName<MessageDescriptor>("NoSuchType"));
|
||||
Assert.Null(file.FindTypeByName<MessageDescriptor>("protobuf_unittest.TestAllTypes"));
|
||||
for (int i = 0; i < file.MessageTypes.Count; i++)
|
||||
{
|
||||
Assert.AreEqual(i, file.MessageTypes[i].Index);
|
||||
}
|
||||
|
||||
Assert.AreEqual(file.EnumTypes[0], file.FindTypeByName<EnumDescriptor>("ForeignEnum"));
|
||||
Assert.Null(file.FindTypeByName<EnumDescriptor>("NoSuchType"));
|
||||
Assert.Null(file.FindTypeByName<EnumDescriptor>("protobuf_unittest.ForeignEnum"));
|
||||
Assert.AreEqual(1, UnittestImportProto3Reflection.Descriptor.EnumTypes.Count);
|
||||
Assert.AreEqual("ImportEnum", UnittestImportProto3Reflection.Descriptor.EnumTypes[0].Name);
|
||||
for (int i = 0; i < file.EnumTypes.Count; i++)
|
||||
{
|
||||
Assert.AreEqual(i, file.EnumTypes[i].Index);
|
||||
}
|
||||
|
||||
Assert.AreEqual(10, file.SerializedData[0]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MessageDescriptor()
|
||||
{
|
||||
MessageDescriptor messageType = TestAllTypes.Descriptor;
|
||||
MessageDescriptor nestedType = TestAllTypes.Types.NestedMessage.Descriptor;
|
||||
|
||||
Assert.AreEqual("TestAllTypes", messageType.Name);
|
||||
Assert.AreEqual("protobuf_unittest.TestAllTypes", messageType.FullName);
|
||||
Assert.AreEqual(UnittestProto3Reflection.Descriptor, messageType.File);
|
||||
Assert.IsNull(messageType.ContainingType);
|
||||
Assert.IsNull(messageType.Proto.Options);
|
||||
|
||||
Assert.AreEqual("TestAllTypes", messageType.Name);
|
||||
|
||||
Assert.AreEqual("NestedMessage", nestedType.Name);
|
||||
Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedMessage", nestedType.FullName);
|
||||
Assert.AreEqual(UnittestProto3Reflection.Descriptor, nestedType.File);
|
||||
Assert.AreEqual(messageType, nestedType.ContainingType);
|
||||
|
||||
FieldDescriptor field = messageType.Fields.InDeclarationOrder()[0];
|
||||
Assert.AreEqual("single_int32", field.Name);
|
||||
Assert.AreEqual(field, messageType.FindDescriptor<FieldDescriptor>("single_int32"));
|
||||
Assert.Null(messageType.FindDescriptor<FieldDescriptor>("no_such_field"));
|
||||
Assert.AreEqual(field, messageType.FindFieldByNumber(1));
|
||||
Assert.Null(messageType.FindFieldByNumber(571283));
|
||||
var fieldsInDeclarationOrder = messageType.Fields.InDeclarationOrder();
|
||||
for (int i = 0; i < fieldsInDeclarationOrder.Count; i++)
|
||||
{
|
||||
Assert.AreEqual(i, fieldsInDeclarationOrder[i].Index);
|
||||
}
|
||||
|
||||
Assert.AreEqual(nestedType, messageType.NestedTypes[0]);
|
||||
Assert.AreEqual(nestedType, messageType.FindDescriptor<MessageDescriptor>("NestedMessage"));
|
||||
Assert.Null(messageType.FindDescriptor<MessageDescriptor>("NoSuchType"));
|
||||
for (int i = 0; i < messageType.NestedTypes.Count; i++)
|
||||
{
|
||||
Assert.AreEqual(i, messageType.NestedTypes[i].Index);
|
||||
}
|
||||
|
||||
Assert.AreEqual(messageType.EnumTypes[0], messageType.FindDescriptor<EnumDescriptor>("NestedEnum"));
|
||||
Assert.Null(messageType.FindDescriptor<EnumDescriptor>("NoSuchType"));
|
||||
for (int i = 0; i < messageType.EnumTypes.Count; i++)
|
||||
{
|
||||
Assert.AreEqual(i, messageType.EnumTypes[i].Index);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FieldDescriptor()
|
||||
{
|
||||
MessageDescriptor messageType = TestAllTypes.Descriptor;
|
||||
FieldDescriptor primitiveField = messageType.FindDescriptor<FieldDescriptor>("single_int32");
|
||||
FieldDescriptor enumField = messageType.FindDescriptor<FieldDescriptor>("single_nested_enum");
|
||||
FieldDescriptor messageField = messageType.FindDescriptor<FieldDescriptor>("single_foreign_message");
|
||||
|
||||
Assert.AreEqual("single_int32", primitiveField.Name);
|
||||
Assert.AreEqual("protobuf_unittest.TestAllTypes.single_int32",
|
||||
primitiveField.FullName);
|
||||
Assert.AreEqual(1, primitiveField.FieldNumber);
|
||||
Assert.AreEqual(messageType, primitiveField.ContainingType);
|
||||
Assert.AreEqual(UnittestProto3Reflection.Descriptor, primitiveField.File);
|
||||
Assert.AreEqual(FieldType.Int32, primitiveField.FieldType);
|
||||
Assert.IsNull(primitiveField.Proto.Options);
|
||||
|
||||
Assert.AreEqual("single_nested_enum", enumField.Name);
|
||||
Assert.AreEqual(FieldType.Enum, enumField.FieldType);
|
||||
// Assert.AreEqual(TestAllTypes.Types.NestedEnum.DescriptorProtoFile, enumField.EnumType);
|
||||
|
||||
Assert.AreEqual("single_foreign_message", messageField.Name);
|
||||
Assert.AreEqual(FieldType.Message, messageField.FieldType);
|
||||
Assert.AreEqual(ForeignMessage.Descriptor, messageField.MessageType);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FieldDescriptorLabel()
|
||||
{
|
||||
FieldDescriptor singleField =
|
||||
TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("single_int32");
|
||||
FieldDescriptor repeatedField =
|
||||
TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("repeated_int32");
|
||||
|
||||
Assert.IsFalse(singleField.IsRepeated);
|
||||
Assert.IsTrue(repeatedField.IsRepeated);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void EnumDescriptor()
|
||||
{
|
||||
// Note: this test is a bit different to the Java version because there's no static way of getting to the descriptor
|
||||
EnumDescriptor enumType = UnittestProto3Reflection.Descriptor.FindTypeByName<EnumDescriptor>("ForeignEnum");
|
||||
EnumDescriptor nestedType = TestAllTypes.Descriptor.FindDescriptor<EnumDescriptor>("NestedEnum");
|
||||
|
||||
Assert.AreEqual("ForeignEnum", enumType.Name);
|
||||
Assert.AreEqual("protobuf_unittest.ForeignEnum", enumType.FullName);
|
||||
Assert.AreEqual(UnittestProto3Reflection.Descriptor, enumType.File);
|
||||
Assert.Null(enumType.ContainingType);
|
||||
Assert.Null(enumType.Proto.Options);
|
||||
|
||||
Assert.AreEqual("NestedEnum", nestedType.Name);
|
||||
Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedEnum",
|
||||
nestedType.FullName);
|
||||
Assert.AreEqual(UnittestProto3Reflection.Descriptor, nestedType.File);
|
||||
Assert.AreEqual(TestAllTypes.Descriptor, nestedType.ContainingType);
|
||||
|
||||
EnumValueDescriptor value = enumType.FindValueByName("FOREIGN_FOO");
|
||||
Assert.AreEqual(value, enumType.Values[1]);
|
||||
Assert.AreEqual("FOREIGN_FOO", value.Name);
|
||||
Assert.AreEqual(4, value.Number);
|
||||
Assert.AreEqual((int) ForeignEnum.ForeignFoo, value.Number);
|
||||
Assert.AreEqual(value, enumType.FindValueByNumber(4));
|
||||
Assert.Null(enumType.FindValueByName("NO_SUCH_VALUE"));
|
||||
for (int i = 0; i < enumType.Values.Count; i++)
|
||||
{
|
||||
Assert.AreEqual(i, enumType.Values[i].Index);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void OneofDescriptor()
|
||||
{
|
||||
OneofDescriptor descriptor = TestAllTypes.Descriptor.FindDescriptor<OneofDescriptor>("oneof_field");
|
||||
Assert.AreEqual("oneof_field", descriptor.Name);
|
||||
Assert.AreEqual("protobuf_unittest.TestAllTypes.oneof_field", descriptor.FullName);
|
||||
|
||||
var expectedFields = new[] {
|
||||
TestAllTypes.OneofBytesFieldNumber,
|
||||
TestAllTypes.OneofNestedMessageFieldNumber,
|
||||
TestAllTypes.OneofStringFieldNumber,
|
||||
TestAllTypes.OneofUint32FieldNumber }
|
||||
.Select(fieldNumber => TestAllTypes.Descriptor.FindFieldByNumber(fieldNumber))
|
||||
.ToList();
|
||||
foreach (var field in expectedFields)
|
||||
{
|
||||
Assert.AreSame(descriptor, field.ContainingOneof);
|
||||
}
|
||||
|
||||
CollectionAssert.AreEquivalent(expectedFields, descriptor.Fields);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MapEntryMessageDescriptor()
|
||||
{
|
||||
var descriptor = MapWellKnownTypes.Descriptor.NestedTypes[0];
|
||||
Assert.IsNull(descriptor.Parser);
|
||||
Assert.IsNull(descriptor.ClrType);
|
||||
Assert.IsNull(descriptor.Fields[1].Accessor);
|
||||
}
|
||||
|
||||
// From TestFieldOrdering:
|
||||
// string my_string = 11;
|
||||
// int64 my_int = 1;
|
||||
// float my_float = 101;
|
||||
// NestedMessage single_nested_message = 200;
|
||||
[Test]
|
||||
public void FieldListOrderings()
|
||||
{
|
||||
var fields = TestFieldOrderings.Descriptor.Fields;
|
||||
Assert.AreEqual(new[] { 11, 1, 101, 200 }, fields.InDeclarationOrder().Select(x => x.FieldNumber));
|
||||
Assert.AreEqual(new[] { 1, 11, 101, 200 }, fields.InFieldNumberOrder().Select(x => x.FieldNumber));
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void DescriptorProtoFileDescriptor()
|
||||
{
|
||||
var descriptor = Google.Protobuf.Reflection.FileDescriptor.DescriptorProtoFileDescriptor;
|
||||
Assert.AreEqual("google/protobuf/descriptor.proto", descriptor.Name);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,218 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using Google.Protobuf.TestProtos;
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Google.Protobuf.Reflection
|
||||
{
|
||||
public class FieldAccessTest
|
||||
{
|
||||
[Test]
|
||||
public void GetValue()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var fields = TestAllTypes.Descriptor.Fields;
|
||||
Assert.AreEqual(message.SingleBool, fields[TestAllTypes.SingleBoolFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleBytes, fields[TestAllTypes.SingleBytesFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleDouble, fields[TestAllTypes.SingleDoubleFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleFixed32, fields[TestAllTypes.SingleFixed32FieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleFixed64, fields[TestAllTypes.SingleFixed64FieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleFloat, fields[TestAllTypes.SingleFloatFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleForeignEnum, fields[TestAllTypes.SingleForeignEnumFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleForeignMessage, fields[TestAllTypes.SingleForeignMessageFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleImportEnum, fields[TestAllTypes.SingleImportEnumFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleImportMessage, fields[TestAllTypes.SingleImportMessageFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleInt32, fields[TestAllTypes.SingleInt32FieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleInt64, fields[TestAllTypes.SingleInt64FieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleNestedEnum, fields[TestAllTypes.SingleNestedEnumFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleNestedMessage, fields[TestAllTypes.SingleNestedMessageFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SinglePublicImportMessage, fields[TestAllTypes.SinglePublicImportMessageFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleSint32, fields[TestAllTypes.SingleSint32FieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleSint64, fields[TestAllTypes.SingleSint64FieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleString, fields[TestAllTypes.SingleStringFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleSfixed32, fields[TestAllTypes.SingleSfixed32FieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleSfixed64, fields[TestAllTypes.SingleSfixed64FieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleUint32, fields[TestAllTypes.SingleUint32FieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.SingleUint64, fields[TestAllTypes.SingleUint64FieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.OneofBytes, fields[TestAllTypes.OneofBytesFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.OneofString, fields[TestAllTypes.OneofStringFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.OneofNestedMessage, fields[TestAllTypes.OneofNestedMessageFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(message.OneofUint32, fields[TestAllTypes.OneofUint32FieldNumber].Accessor.GetValue(message));
|
||||
|
||||
// Just one example for repeated fields - they're all just returning the list
|
||||
var list = (IList) fields[TestAllTypes.RepeatedInt32FieldNumber].Accessor.GetValue(message);
|
||||
Assert.AreEqual(message.RepeatedInt32, list);
|
||||
Assert.AreEqual(message.RepeatedInt32[0], list[0]); // Just in case there was any doubt...
|
||||
|
||||
// Just a single map field, for the same reason
|
||||
var mapMessage = new TestMap { MapStringString = { { "key1", "value1" }, { "key2", "value2" } } };
|
||||
fields = TestMap.Descriptor.Fields;
|
||||
var dictionary = (IDictionary) fields[TestMap.MapStringStringFieldNumber].Accessor.GetValue(mapMessage);
|
||||
Assert.AreEqual(mapMessage.MapStringString, dictionary);
|
||||
Assert.AreEqual("value1", dictionary["key1"]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Clear()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var fields = TestAllTypes.Descriptor.Fields;
|
||||
fields[TestAllTypes.SingleBoolFieldNumber].Accessor.Clear(message);
|
||||
fields[TestAllTypes.SingleInt32FieldNumber].Accessor.Clear(message);
|
||||
fields[TestAllTypes.SingleStringFieldNumber].Accessor.Clear(message);
|
||||
fields[TestAllTypes.SingleBytesFieldNumber].Accessor.Clear(message);
|
||||
fields[TestAllTypes.SingleForeignEnumFieldNumber].Accessor.Clear(message);
|
||||
fields[TestAllTypes.SingleForeignMessageFieldNumber].Accessor.Clear(message);
|
||||
fields[TestAllTypes.RepeatedDoubleFieldNumber].Accessor.Clear(message);
|
||||
|
||||
var expected = new TestAllTypes(SampleMessages.CreateFullTestAllTypes())
|
||||
{
|
||||
SingleBool = false,
|
||||
SingleInt32 = 0,
|
||||
SingleString = "",
|
||||
SingleBytes = ByteString.Empty,
|
||||
SingleForeignEnum = 0,
|
||||
SingleForeignMessage = null,
|
||||
};
|
||||
expected.RepeatedDouble.Clear();
|
||||
|
||||
Assert.AreEqual(expected, message);
|
||||
|
||||
// Separately, maps.
|
||||
var mapMessage = new TestMap { MapStringString = { { "key1", "value1" }, { "key2", "value2" } } };
|
||||
fields = TestMap.Descriptor.Fields;
|
||||
fields[TestMap.MapStringStringFieldNumber].Accessor.Clear(mapMessage);
|
||||
Assert.AreEqual(0, mapMessage.MapStringString.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SetValue_SingleFields()
|
||||
{
|
||||
// Just a sample (primitives, messages, enums, strings, byte strings)
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var fields = TestAllTypes.Descriptor.Fields;
|
||||
fields[TestAllTypes.SingleBoolFieldNumber].Accessor.SetValue(message, false);
|
||||
fields[TestAllTypes.SingleInt32FieldNumber].Accessor.SetValue(message, 500);
|
||||
fields[TestAllTypes.SingleStringFieldNumber].Accessor.SetValue(message, "It's a string");
|
||||
fields[TestAllTypes.SingleBytesFieldNumber].Accessor.SetValue(message, ByteString.CopyFrom(99, 98, 97));
|
||||
fields[TestAllTypes.SingleForeignEnumFieldNumber].Accessor.SetValue(message, ForeignEnum.ForeignFoo);
|
||||
fields[TestAllTypes.SingleForeignMessageFieldNumber].Accessor.SetValue(message, new ForeignMessage { C = 12345 });
|
||||
fields[TestAllTypes.SingleDoubleFieldNumber].Accessor.SetValue(message, 20150701.5);
|
||||
|
||||
var expected = new TestAllTypes(SampleMessages.CreateFullTestAllTypes())
|
||||
{
|
||||
SingleBool = false,
|
||||
SingleInt32 = 500,
|
||||
SingleString = "It's a string",
|
||||
SingleBytes = ByteString.CopyFrom(99, 98, 97),
|
||||
SingleForeignEnum = ForeignEnum.ForeignFoo,
|
||||
SingleForeignMessage = new ForeignMessage { C = 12345 },
|
||||
SingleDouble = 20150701.5
|
||||
};
|
||||
|
||||
Assert.AreEqual(expected, message);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SetValue_SingleFields_WrongType()
|
||||
{
|
||||
IMessage message = SampleMessages.CreateFullTestAllTypes();
|
||||
var fields = message.Descriptor.Fields;
|
||||
Assert.Throws<InvalidCastException>(() => fields[TestAllTypes.SingleBoolFieldNumber].Accessor.SetValue(message, "This isn't a bool"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SetValue_MapFields()
|
||||
{
|
||||
IMessage message = new TestMap();
|
||||
var fields = message.Descriptor.Fields;
|
||||
Assert.Throws<InvalidOperationException>(() => fields[TestMap.MapStringStringFieldNumber].Accessor.SetValue(message, new Dictionary<string, string>()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SetValue_RepeatedFields()
|
||||
{
|
||||
IMessage message = SampleMessages.CreateFullTestAllTypes();
|
||||
var fields = message.Descriptor.Fields;
|
||||
Assert.Throws<InvalidOperationException>(() => fields[TestAllTypes.RepeatedDoubleFieldNumber].Accessor.SetValue(message, new double[10]));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetValue_IncorrectType()
|
||||
{
|
||||
IMessage message = SampleMessages.CreateFullTestAllTypes();
|
||||
var fields = message.Descriptor.Fields;
|
||||
Assert.Throws<InvalidCastException>(() => fields[TestAllTypes.SingleBoolFieldNumber].Accessor.GetValue(new TestMap()));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Oneof()
|
||||
{
|
||||
var message = new TestAllTypes();
|
||||
var descriptor = TestAllTypes.Descriptor;
|
||||
Assert.AreEqual(1, descriptor.Oneofs.Count);
|
||||
var oneof = descriptor.Oneofs[0];
|
||||
Assert.AreEqual("oneof_field", oneof.Name);
|
||||
Assert.IsNull(oneof.Accessor.GetCaseFieldDescriptor(message));
|
||||
|
||||
message.OneofString = "foo";
|
||||
Assert.AreSame(descriptor.Fields[TestAllTypes.OneofStringFieldNumber], oneof.Accessor.GetCaseFieldDescriptor(message));
|
||||
|
||||
message.OneofUint32 = 10;
|
||||
Assert.AreSame(descriptor.Fields[TestAllTypes.OneofUint32FieldNumber], oneof.Accessor.GetCaseFieldDescriptor(message));
|
||||
|
||||
oneof.Accessor.Clear(message);
|
||||
Assert.AreEqual(TestAllTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FieldDescriptor_ByName()
|
||||
{
|
||||
var descriptor = TestAllTypes.Descriptor;
|
||||
Assert.AreSame(
|
||||
descriptor.Fields[TestAllTypes.SingleBoolFieldNumber],
|
||||
descriptor.Fields["single_bool"]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FieldDescriptor_NotFound()
|
||||
{
|
||||
var descriptor = TestAllTypes.Descriptor;
|
||||
Assert.Throws<KeyNotFoundException>(() => descriptor.Fields[999999].ToString());
|
||||
Assert.Throws<KeyNotFoundException>(() => descriptor.Fields["not found"].ToString());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using Google.Protobuf.TestProtos;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf.Reflection
|
||||
{
|
||||
public class TypeRegistryTest
|
||||
{
|
||||
// Most of our tests use messages. Simple test that we really can use files...
|
||||
[Test]
|
||||
public void CreateWithFileDescriptor()
|
||||
{
|
||||
var registry = TypeRegistry.FromFiles(DurationReflection.Descriptor, StructReflection.Descriptor);
|
||||
AssertDescriptorPresent(registry, Duration.Descriptor);
|
||||
AssertDescriptorPresent(registry, ListValue.Descriptor);
|
||||
AssertDescriptorAbsent(registry, Timestamp.Descriptor);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TypesFromSameFile()
|
||||
{
|
||||
// Just for kicks, let's start with a nested type
|
||||
var registry = TypeRegistry.FromMessages(TestAllTypes.Types.NestedMessage.Descriptor);
|
||||
// Top-level...
|
||||
AssertDescriptorPresent(registry, TestFieldOrderings.Descriptor);
|
||||
// ... and nested (not the same as the original NestedMessage!)
|
||||
AssertDescriptorPresent(registry, TestFieldOrderings.Types.NestedMessage.Descriptor);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DependenciesAreIncluded()
|
||||
{
|
||||
var registry = TypeRegistry.FromMessages(TestAllTypes.Descriptor);
|
||||
// Direct dependencies
|
||||
AssertDescriptorPresent(registry, ImportMessage.Descriptor);
|
||||
// Public dependencies
|
||||
AssertDescriptorPresent(registry, PublicImportMessage.Descriptor);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DuplicateFiles()
|
||||
{
|
||||
// Duplicates via dependencies and simply via repetition
|
||||
var registry = TypeRegistry.FromFiles(
|
||||
UnittestProto3Reflection.Descriptor, UnittestImportProto3Reflection.Descriptor,
|
||||
TimestampReflection.Descriptor, TimestampReflection.Descriptor);
|
||||
AssertDescriptorPresent(registry, TestAllTypes.Descriptor);
|
||||
AssertDescriptorPresent(registry, ImportMessage.Descriptor);
|
||||
AssertDescriptorPresent(registry, Timestamp.Descriptor);
|
||||
}
|
||||
|
||||
private static void AssertDescriptorPresent(TypeRegistry registry, MessageDescriptor descriptor)
|
||||
{
|
||||
Assert.AreSame(descriptor, registry.Find(descriptor.FullName));
|
||||
}
|
||||
|
||||
private static void AssertDescriptorAbsent(TypeRegistry registry, MessageDescriptor descriptor)
|
||||
{
|
||||
Assert.IsNull(registry.Find(descriptor.FullName));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
// Just a sample enum with positive and negative values to be used in tests.
|
||||
internal enum SampleEnum
|
||||
{
|
||||
NegativeValue = -2,
|
||||
None = 0,
|
||||
PositiveValue = 3
|
||||
}
|
||||
}
|
|
@ -0,0 +1,99 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using Google.Protobuf.TestProtos;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
/// <summary>
|
||||
/// Helper methods to create sample instances of types generated from unit test messages.
|
||||
/// </summary>
|
||||
public class SampleMessages
|
||||
{
|
||||
/// <summary>
|
||||
/// Creates a new sample TestAllTypes message with all fields populated.
|
||||
/// The "oneof" field is populated with the string property (OneofString).
|
||||
/// </summary>
|
||||
public static TestAllTypes CreateFullTestAllTypes()
|
||||
{
|
||||
return new TestAllTypes
|
||||
{
|
||||
SingleBool = true,
|
||||
SingleBytes = ByteString.CopyFrom(1, 2, 3, 4),
|
||||
SingleDouble = 23.5,
|
||||
SingleFixed32 = 23,
|
||||
SingleFixed64 = 1234567890123,
|
||||
SingleFloat = 12.25f,
|
||||
SingleForeignEnum = ForeignEnum.ForeignBar,
|
||||
SingleForeignMessage = new ForeignMessage { C = 10 },
|
||||
SingleImportEnum = ImportEnum.ImportBaz,
|
||||
SingleImportMessage = new ImportMessage { D = 20 },
|
||||
SingleInt32 = 100,
|
||||
SingleInt64 = 3210987654321,
|
||||
SingleNestedEnum = TestAllTypes.Types.NestedEnum.Foo,
|
||||
SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 35 },
|
||||
SinglePublicImportMessage = new PublicImportMessage { E = 54 },
|
||||
SingleSfixed32 = -123,
|
||||
SingleSfixed64 = -12345678901234,
|
||||
SingleSint32 = -456,
|
||||
SingleSint64 = -12345678901235,
|
||||
SingleString = "test",
|
||||
SingleUint32 = UInt32.MaxValue,
|
||||
SingleUint64 = UInt64.MaxValue,
|
||||
RepeatedBool = { true, false },
|
||||
RepeatedBytes = { ByteString.CopyFrom(1, 2, 3, 4), ByteString.CopyFrom(5, 6), ByteString.CopyFrom(new byte[1000]) },
|
||||
RepeatedDouble = { -12.25, 23.5 },
|
||||
RepeatedFixed32 = { UInt32.MaxValue, 23 },
|
||||
RepeatedFixed64 = { UInt64.MaxValue, 1234567890123 },
|
||||
RepeatedFloat = { 100f, 12.25f },
|
||||
RepeatedForeignEnum = { ForeignEnum.ForeignFoo, ForeignEnum.ForeignBar },
|
||||
RepeatedForeignMessage = { new ForeignMessage(), new ForeignMessage { C = 10 } },
|
||||
RepeatedImportEnum = { ImportEnum.ImportBaz, ImportEnum.Unspecified },
|
||||
RepeatedImportMessage = { new ImportMessage { D = 20 }, new ImportMessage { D = 25 } },
|
||||
RepeatedInt32 = { 100, 200 },
|
||||
RepeatedInt64 = { 3210987654321, Int64.MaxValue },
|
||||
RepeatedNestedEnum = { TestAllTypes.Types.NestedEnum.Foo, TestAllTypes.Types.NestedEnum.Neg },
|
||||
RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 35 }, new TestAllTypes.Types.NestedMessage { Bb = 10 } },
|
||||
RepeatedPublicImportMessage = { new PublicImportMessage { E = 54 }, new PublicImportMessage { E = -1 } },
|
||||
RepeatedSfixed32 = { -123, 123 },
|
||||
RepeatedSfixed64 = { -12345678901234, 12345678901234 },
|
||||
RepeatedSint32 = { -456, 100 },
|
||||
RepeatedSint64 = { -12345678901235, 123 },
|
||||
RepeatedString = { "foo", "bar" },
|
||||
RepeatedUint32 = { UInt32.MaxValue, UInt32.MinValue },
|
||||
RepeatedUint64 = { UInt64.MaxValue, UInt32.MinValue },
|
||||
OneofString = "Oneof string"
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using UnitTest.Issues.TestProtos;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf
|
||||
{
|
||||
public class TestCornerCases
|
||||
{
|
||||
[Test]
|
||||
public void TestRoundTripNegativeEnums()
|
||||
{
|
||||
NegativeEnumMessage msg = new NegativeEnumMessage
|
||||
{
|
||||
Value = NegativeEnum.MinusOne,
|
||||
Values = { NegativeEnum.Zero, NegativeEnum.MinusOne, NegativeEnum.FiveBelow },
|
||||
PackedValues = { NegativeEnum.Zero, NegativeEnum.MinusOne, NegativeEnum.FiveBelow }
|
||||
};
|
||||
|
||||
Assert.AreEqual(58, msg.CalculateSize());
|
||||
|
||||
byte[] bytes = new byte[58];
|
||||
CodedOutputStream output = new CodedOutputStream(bytes);
|
||||
|
||||
msg.WriteTo(output);
|
||||
Assert.AreEqual(0, output.SpaceLeft);
|
||||
|
||||
NegativeEnumMessage copy = NegativeEnumMessage.Parser.ParseFrom(bytes);
|
||||
Assert.AreEqual(msg, copy);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2016 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
namespace Google.Protobuf.TestProtos
|
||||
{
|
||||
/// <summary>
|
||||
/// A message with custom diagnostics (to test that they work).
|
||||
/// </summary>
|
||||
public partial class ForeignMessage : ICustomDiagnosticMessage
|
||||
{
|
||||
public string ToDiagnosticString()
|
||||
{
|
||||
return $"{{ \"c\": {C}, \"@cInHex\": \"{C:x}\" }}";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,116 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using Google.Protobuf.TestProtos;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf.WellKnownTypes
|
||||
{
|
||||
public class AnyTest
|
||||
{
|
||||
[Test]
|
||||
public void Pack()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var any = Any.Pack(message);
|
||||
Assert.AreEqual("type.googleapis.com/protobuf_unittest.TestAllTypes", any.TypeUrl);
|
||||
Assert.AreEqual(message.CalculateSize(), any.Value.Length);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Pack_WithCustomPrefix()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var any = Any.Pack(message, "foo.bar/baz");
|
||||
Assert.AreEqual("foo.bar/baz/protobuf_unittest.TestAllTypes", any.TypeUrl);
|
||||
Assert.AreEqual(message.CalculateSize(), any.Value.Length);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Pack_WithCustomPrefixTrailingSlash()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var any = Any.Pack(message, "foo.bar/baz/");
|
||||
Assert.AreEqual("foo.bar/baz/protobuf_unittest.TestAllTypes", any.TypeUrl);
|
||||
Assert.AreEqual(message.CalculateSize(), any.Value.Length);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Unpack_WrongType()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var any = Any.Pack(message);
|
||||
Assert.Throws<InvalidProtocolBufferException>(() => any.Unpack<TestOneof>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Unpack_Success()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var any = Any.Pack(message);
|
||||
var unpacked = any.Unpack<TestAllTypes>();
|
||||
Assert.AreEqual(message, unpacked);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Unpack_CustomPrefix_Success()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var any = Any.Pack(message, "foo.bar/baz");
|
||||
var unpacked = any.Unpack<TestAllTypes>();
|
||||
Assert.AreEqual(message, unpacked);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_WithValues()
|
||||
{
|
||||
var message = SampleMessages.CreateFullTestAllTypes();
|
||||
var any = Any.Pack(message);
|
||||
var text = any.ToString();
|
||||
Assert.That(text, Does.Contain("\"@value\": \"" + message.ToByteString().ToBase64() + "\""));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_Empty()
|
||||
{
|
||||
var any = new Any();
|
||||
Assert.AreEqual("{ \"@type\": \"\", \"@value\": \"\" }", any.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_MessageContainingAny()
|
||||
{
|
||||
var message = new TestWellKnownTypes { AnyField = new Any() };
|
||||
Assert.AreEqual("{ \"anyField\": { \"@type\": \"\", \"@value\": \"\" } }", message.ToString());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,132 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
|
||||
namespace Google.Protobuf.WellKnownTypes
|
||||
{
|
||||
public class DurationTest
|
||||
{
|
||||
[Test]
|
||||
public void ToTimeSpan()
|
||||
{
|
||||
Assert.AreEqual(TimeSpan.FromSeconds(1), new Duration { Seconds = 1 }.ToTimeSpan());
|
||||
Assert.AreEqual(TimeSpan.FromSeconds(-1), new Duration { Seconds = -1 }.ToTimeSpan());
|
||||
Assert.AreEqual(TimeSpan.FromMilliseconds(1), new Duration { Nanos = 1000000 }.ToTimeSpan());
|
||||
Assert.AreEqual(TimeSpan.FromMilliseconds(-1), new Duration { Nanos = -1000000 }.ToTimeSpan());
|
||||
Assert.AreEqual(TimeSpan.FromTicks(1), new Duration { Nanos = 100 }.ToTimeSpan());
|
||||
Assert.AreEqual(TimeSpan.FromTicks(-1), new Duration { Nanos = -100 }.ToTimeSpan());
|
||||
|
||||
// Rounding is towards 0
|
||||
Assert.AreEqual(TimeSpan.FromTicks(2), new Duration { Nanos = 250 }.ToTimeSpan());
|
||||
Assert.AreEqual(TimeSpan.FromTicks(-2), new Duration { Nanos = -250 }.ToTimeSpan());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Addition()
|
||||
{
|
||||
Assert.AreEqual(new Duration { Seconds = 2, Nanos = 100000000 },
|
||||
new Duration { Seconds = 1, Nanos = 600000000 } + new Duration { Nanos = 500000000 });
|
||||
Assert.AreEqual(new Duration { Seconds = -2, Nanos = -100000000 },
|
||||
new Duration { Seconds = -1, Nanos = -600000000 } + new Duration { Nanos = -500000000 });
|
||||
Assert.AreEqual(new Duration { Seconds = 1, Nanos = 100000000 },
|
||||
new Duration { Seconds = 1, Nanos = 600000000 } + new Duration { Nanos = -500000000 });
|
||||
|
||||
// Non-normalized durations, or non-normalized intermediate results
|
||||
Assert.AreEqual(new Duration { Seconds = 1 },
|
||||
new Duration { Seconds = 1, Nanos = -500000000 } + new Duration { Nanos = 500000000 });
|
||||
|
||||
Assert.AreEqual(new Duration { Nanos = -900000000 },
|
||||
new Duration { Seconds = -1, Nanos = -100000000 } + new Duration { Nanos = 200000000 });
|
||||
Assert.AreEqual(new Duration { Nanos = 900000000 },
|
||||
new Duration { Seconds = 1, Nanos = 100000000 } + new Duration { Nanos = -200000000 });
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Subtraction()
|
||||
{
|
||||
Assert.AreEqual(new Duration { Seconds = 1, Nanos = 100000000 },
|
||||
new Duration { Seconds = 1, Nanos = 600000000 } - new Duration { Nanos = 500000000 });
|
||||
Assert.AreEqual(new Duration { Seconds = -1, Nanos = -100000000 },
|
||||
new Duration { Seconds = -1, Nanos = -600000000 } - new Duration { Nanos = -500000000 });
|
||||
Assert.AreEqual(new Duration { Seconds = 2, Nanos = 100000000 },
|
||||
new Duration { Seconds = 1, Nanos = 600000000 } - new Duration { Nanos = -500000000 });
|
||||
|
||||
// Non-normalized durations
|
||||
Assert.AreEqual(new Duration(),
|
||||
new Duration { Seconds = 1, Nanos = -500000000 } - new Duration { Nanos = 500000000 });
|
||||
Assert.AreEqual(new Duration { Seconds = 1 },
|
||||
new Duration { Nanos = 2000000000 } - new Duration { Nanos = 1000000000 });
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void FromTimeSpan()
|
||||
{
|
||||
Assert.AreEqual(new Duration { Seconds = 1 }, Duration.FromTimeSpan(TimeSpan.FromSeconds(1)));
|
||||
Assert.AreEqual(new Duration { Nanos = Duration.NanosecondsPerTick }, Duration.FromTimeSpan(TimeSpan.FromTicks(1)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(0, Duration.MaxNanoseconds + 1)]
|
||||
[TestCase(0, Duration.MinNanoseconds - 1)]
|
||||
[TestCase(Duration.MinSeconds - 1, 0)]
|
||||
[TestCase(Duration.MaxSeconds + 1, 0)]
|
||||
[TestCase(1, -1)]
|
||||
[TestCase(-1, 1)]
|
||||
public void ToTimeSpan_Invalid(long seconds, int nanoseconds)
|
||||
{
|
||||
var duration = new Duration { Seconds = seconds, Nanos = nanoseconds };
|
||||
Assert.Throws<InvalidOperationException>(() => duration.ToTimeSpan());
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(0, Duration.MaxNanoseconds)]
|
||||
[TestCase(0, Duration.MinNanoseconds)]
|
||||
[TestCase(Duration.MinSeconds, Duration.MinNanoseconds)]
|
||||
[TestCase(Duration.MaxSeconds, Duration.MaxNanoseconds)]
|
||||
public void ToTimeSpan_Valid(long seconds, int nanoseconds)
|
||||
{
|
||||
// Only testing that these values don't throw, unlike their similar tests in ToTimeSpan_Invalid
|
||||
var duration = new Duration { Seconds = seconds, Nanos = nanoseconds };
|
||||
duration.ToTimeSpan();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_NonNormalized()
|
||||
{
|
||||
// Just a single example should be sufficient...
|
||||
var duration = new Duration { Seconds = 1, Nanos = -1 };
|
||||
Assert.AreEqual("{ \"@warning\": \"Invalid Duration\", \"seconds\": \"1\", \"nanos\": -1 }", duration.ToString());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2016 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace Google.Protobuf.WellKnownTypes
|
||||
{
|
||||
public class FieldMaskTest
|
||||
{
|
||||
[Test]
|
||||
[TestCase("foo__bar")]
|
||||
[TestCase("foo_3_ar")]
|
||||
[TestCase("fooBar")]
|
||||
public void ToString_Invalid(string input)
|
||||
{
|
||||
var mask = new FieldMask { Paths = { input } };
|
||||
var text = mask.ToString();
|
||||
// More specific test below
|
||||
Assert.That(text, Does.Contain("@warning"));
|
||||
Assert.That(text, Does.Contain(input));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_Invalid_Precise()
|
||||
{
|
||||
var mask = new FieldMask { Paths = { "x", "foo__bar", @"x\y" } };
|
||||
Assert.AreEqual(
|
||||
"{ \"@warning\": \"Invalid FieldMask\", \"paths\": [ \"x\", \"foo__bar\", \"x\\\\y\" ] }",
|
||||
mask.ToString());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,115 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using NUnit.Framework;
|
||||
using System;
|
||||
|
||||
namespace Google.Protobuf.WellKnownTypes
|
||||
{
|
||||
public class TimestampTest
|
||||
{
|
||||
[Test]
|
||||
public void FromAndToDateTime()
|
||||
{
|
||||
DateTime utcMin = DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc);
|
||||
DateTime utcMax = DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.Utc);
|
||||
AssertRoundtrip(new Timestamp { Seconds = -62135596800 }, utcMin);
|
||||
AssertRoundtrip(new Timestamp { Seconds = 253402300799, Nanos = 999999900 }, utcMax);
|
||||
AssertRoundtrip(new Timestamp(), new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc));
|
||||
AssertRoundtrip(new Timestamp { Nanos = 1000000}, new DateTime(1970, 1, 1, 0, 0, 0, 1, DateTimeKind.Utc));
|
||||
AssertRoundtrip(new Timestamp { Seconds = -1, Nanos = 999000000 }, new DateTime(1969, 12, 31, 23, 59, 59, 999, DateTimeKind.Utc));
|
||||
AssertRoundtrip(new Timestamp { Seconds = 3600 }, new DateTime(1970, 1, 1, 1, 0, 0, DateTimeKind.Utc));
|
||||
AssertRoundtrip(new Timestamp { Seconds = -3600 }, new DateTime(1969, 12, 31, 23, 0, 0, DateTimeKind.Utc));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToDateTimeTruncation()
|
||||
{
|
||||
var t1 = new Timestamp { Seconds = 1, Nanos = 1000000 + Duration.NanosecondsPerTick - 1 };
|
||||
Assert.AreEqual(new DateTime(1970, 1, 1, 0, 0, 1, DateTimeKind.Utc).AddMilliseconds(1), t1.ToDateTime());
|
||||
|
||||
var t2 = new Timestamp { Seconds = -1, Nanos = 1000000 + Duration.NanosecondsPerTick - 1 };
|
||||
Assert.AreEqual(new DateTime(1969, 12, 31, 23, 59, 59).AddMilliseconds(1), t2.ToDateTime());
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase(Timestamp.UnixSecondsAtBclMinValue - 1, Timestamp.MaxNanos)]
|
||||
[TestCase(Timestamp.UnixSecondsAtBclMaxValue + 1, 0)]
|
||||
[TestCase(0, -1)]
|
||||
[TestCase(0, Timestamp.MaxNanos + 1)]
|
||||
public void ToDateTime_OutOfRange(long seconds, int nanoseconds)
|
||||
{
|
||||
var value = new Timestamp { Seconds = seconds, Nanos = nanoseconds };
|
||||
Assert.Throws<InvalidOperationException>(() => value.ToDateTime());
|
||||
}
|
||||
|
||||
// 1ns larger or smaller than the above values
|
||||
[Test]
|
||||
[TestCase(Timestamp.UnixSecondsAtBclMinValue, 0)]
|
||||
[TestCase(Timestamp.UnixSecondsAtBclMaxValue, Timestamp.MaxNanos)]
|
||||
[TestCase(0, 0)]
|
||||
[TestCase(0, Timestamp.MaxNanos)]
|
||||
public void ToDateTime_ValidBoundaries(long seconds, int nanoseconds)
|
||||
{
|
||||
var value = new Timestamp { Seconds = seconds, Nanos = nanoseconds };
|
||||
value.ToDateTime();
|
||||
}
|
||||
|
||||
private static void AssertRoundtrip(Timestamp timestamp, DateTime dateTime)
|
||||
{
|
||||
Assert.AreEqual(timestamp, Timestamp.FromDateTime(dateTime));
|
||||
Assert.AreEqual(dateTime, timestamp.ToDateTime());
|
||||
Assert.AreEqual(DateTimeKind.Utc, timestamp.ToDateTime().Kind);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Arithmetic()
|
||||
{
|
||||
Timestamp t1 = new Timestamp { Seconds = 10000, Nanos = 5000 };
|
||||
Timestamp t2 = new Timestamp { Seconds = 8000, Nanos = 10000 };
|
||||
Duration difference = new Duration { Seconds = 1999, Nanos = Duration.NanosecondsPerSecond - 5000 };
|
||||
Assert.AreEqual(difference, t1 - t2);
|
||||
Assert.AreEqual(-difference, t2 - t1);
|
||||
|
||||
Assert.AreEqual(t1, t2 + difference);
|
||||
Assert.AreEqual(t2, t1 - difference);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ToString_NonNormalized()
|
||||
{
|
||||
// Just a single example should be sufficient...
|
||||
var duration = new Timestamp { Seconds = 1, Nanos = -1 };
|
||||
Assert.AreEqual("{ \"@warning\": \"Invalid Timestamp\", \"seconds\": \"1\", \"nanos\": -1 }", duration.ToString());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,421 @@
|
|||
#region Copyright notice and license
|
||||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2015 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using Google.Protobuf.TestProtos;
|
||||
using NUnit.Framework;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
|
||||
namespace Google.Protobuf.WellKnownTypes
|
||||
{
|
||||
public class WrappersTest
|
||||
{
|
||||
[Test]
|
||||
public void NullIsDefault()
|
||||
{
|
||||
var message = new TestWellKnownTypes();
|
||||
Assert.IsNull(message.StringField);
|
||||
Assert.IsNull(message.BytesField);
|
||||
Assert.IsNull(message.BoolField);
|
||||
Assert.IsNull(message.FloatField);
|
||||
Assert.IsNull(message.DoubleField);
|
||||
Assert.IsNull(message.Int32Field);
|
||||
Assert.IsNull(message.Int64Field);
|
||||
Assert.IsNull(message.Uint32Field);
|
||||
Assert.IsNull(message.Uint64Field);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NonDefaultSingleValues()
|
||||
{
|
||||
var message = new TestWellKnownTypes
|
||||
{
|
||||
StringField = "x",
|
||||
BytesField = ByteString.CopyFrom(1, 2, 3),
|
||||
BoolField = true,
|
||||
FloatField = 12.5f,
|
||||
DoubleField = 12.25d,
|
||||
Int32Field = 1,
|
||||
Int64Field = 2,
|
||||
Uint32Field = 3,
|
||||
Uint64Field = 4
|
||||
};
|
||||
|
||||
var bytes = message.ToByteArray();
|
||||
var parsed = TestWellKnownTypes.Parser.ParseFrom(bytes);
|
||||
|
||||
Assert.AreEqual("x", parsed.StringField);
|
||||
Assert.AreEqual(ByteString.CopyFrom(1, 2, 3), parsed.BytesField);
|
||||
Assert.AreEqual(true, parsed.BoolField);
|
||||
Assert.AreEqual(12.5f, parsed.FloatField);
|
||||
Assert.AreEqual(12.25d, parsed.DoubleField);
|
||||
Assert.AreEqual(1, parsed.Int32Field);
|
||||
Assert.AreEqual(2L, parsed.Int64Field);
|
||||
Assert.AreEqual(3U, parsed.Uint32Field);
|
||||
Assert.AreEqual(4UL, parsed.Uint64Field);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NonNullDefaultIsPreservedThroughSerialization()
|
||||
{
|
||||
var message = new TestWellKnownTypes
|
||||
{
|
||||
StringField = "",
|
||||
BytesField = ByteString.Empty,
|
||||
BoolField = false,
|
||||
FloatField = 0f,
|
||||
DoubleField = 0d,
|
||||
Int32Field = 0,
|
||||
Int64Field = 0,
|
||||
Uint32Field = 0,
|
||||
Uint64Field = 0
|
||||
};
|
||||
|
||||
var bytes = message.ToByteArray();
|
||||
var parsed = TestWellKnownTypes.Parser.ParseFrom(bytes);
|
||||
|
||||
Assert.AreEqual("", parsed.StringField);
|
||||
Assert.AreEqual(ByteString.Empty, parsed.BytesField);
|
||||
Assert.AreEqual(false, parsed.BoolField);
|
||||
Assert.AreEqual(0f, parsed.FloatField);
|
||||
Assert.AreEqual(0d, parsed.DoubleField);
|
||||
Assert.AreEqual(0, parsed.Int32Field);
|
||||
Assert.AreEqual(0L, parsed.Int64Field);
|
||||
Assert.AreEqual(0U, parsed.Uint32Field);
|
||||
Assert.AreEqual(0UL, parsed.Uint64Field);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RepeatedWrappersProhibitNullItems()
|
||||
{
|
||||
var message = new RepeatedWellKnownTypes();
|
||||
Assert.Throws<ArgumentNullException>(() => message.BoolField.Add((bool?) null));
|
||||
Assert.Throws<ArgumentNullException>(() => message.Int32Field.Add((int?) null));
|
||||
Assert.Throws<ArgumentNullException>(() => message.StringField.Add((string) null));
|
||||
Assert.Throws<ArgumentNullException>(() => message.BytesField.Add((ByteString) null));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RepeatedWrappersSerializeDeserialize()
|
||||
{
|
||||
var message = new RepeatedWellKnownTypes
|
||||
{
|
||||
BoolField = { true, false },
|
||||
BytesField = { ByteString.CopyFrom(1, 2, 3), ByteString.CopyFrom(4, 5, 6), ByteString.Empty },
|
||||
DoubleField = { 12.5, -1.5, 0d },
|
||||
FloatField = { 123.25f, -20f, 0f },
|
||||
Int32Field = { int.MaxValue, int.MinValue, 0 },
|
||||
Int64Field = { long.MaxValue, long.MinValue, 0L },
|
||||
StringField = { "First", "Second", "" },
|
||||
Uint32Field = { uint.MaxValue, uint.MinValue, 0U },
|
||||
Uint64Field = { ulong.MaxValue, ulong.MinValue, 0UL },
|
||||
};
|
||||
var bytes = message.ToByteArray();
|
||||
var parsed = RepeatedWellKnownTypes.Parser.ParseFrom(bytes);
|
||||
|
||||
Assert.AreEqual(message, parsed);
|
||||
// Just to test a single value for sanity...
|
||||
Assert.AreEqual("Second", message.StringField[1]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RepeatedWrappersBinaryFormat()
|
||||
{
|
||||
// At one point we accidentally used a packed format for repeated wrappers, which is wrong (and weird).
|
||||
// This test is just to prove that we use the right format.
|
||||
|
||||
var rawOutput = new MemoryStream();
|
||||
var output = new CodedOutputStream(rawOutput);
|
||||
// Write a value of 5
|
||||
output.WriteTag(RepeatedWellKnownTypes.Int32FieldFieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteLength(2);
|
||||
output.WriteTag(WrappersReflection.WrapperValueFieldNumber, WireFormat.WireType.Varint);
|
||||
output.WriteInt32(5);
|
||||
// Write a value of 0 (empty message)
|
||||
output.WriteTag(RepeatedWellKnownTypes.Int32FieldFieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
output.WriteLength(0);
|
||||
output.Flush();
|
||||
var expectedBytes = rawOutput.ToArray();
|
||||
|
||||
var message = new RepeatedWellKnownTypes { Int32Field = { 5, 0 } };
|
||||
var actualBytes = message.ToByteArray();
|
||||
Assert.AreEqual(expectedBytes, actualBytes);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MapWrappersSerializeDeserialize()
|
||||
{
|
||||
// Note: no null values here, as they are prohibited in map fields
|
||||
// (despite being representable).
|
||||
var message = new MapWellKnownTypes
|
||||
{
|
||||
BoolField = { { 10, false }, { 20, true } },
|
||||
BytesField = {
|
||||
{ -1, ByteString.CopyFrom(1, 2, 3) },
|
||||
{ 10, ByteString.CopyFrom(4, 5, 6) },
|
||||
{ 1000, ByteString.Empty },
|
||||
},
|
||||
DoubleField = { { 1, 12.5 }, { 10, -1.5 }, { 20, 0d } },
|
||||
FloatField = { { 2, 123.25f }, { 3, -20f }, { 4, 0f } },
|
||||
Int32Field = { { 5, int.MaxValue }, { 6, int.MinValue }, { 7, 0 } },
|
||||
Int64Field = { { 8, long.MaxValue }, { 9, long.MinValue }, { 10, 0L } },
|
||||
StringField = { { 11, "First" }, { 12, "Second" }, { 13, "" } },
|
||||
Uint32Field = { { 15, uint.MaxValue }, { 16, uint.MinValue }, { 17, 0U } },
|
||||
Uint64Field = { { 18, ulong.MaxValue }, { 19, ulong.MinValue }, { 20, 0UL } },
|
||||
};
|
||||
|
||||
var bytes = message.ToByteArray();
|
||||
var parsed = MapWellKnownTypes.Parser.ParseFrom(bytes);
|
||||
|
||||
Assert.AreEqual(message, parsed);
|
||||
// Just to test a single value for sanity...
|
||||
Assert.AreEqual("Second", message.StringField[12]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Reflection_SingleValues()
|
||||
{
|
||||
var message = new TestWellKnownTypes
|
||||
{
|
||||
StringField = "x",
|
||||
BytesField = ByteString.CopyFrom(1, 2, 3),
|
||||
BoolField = true,
|
||||
FloatField = 12.5f,
|
||||
DoubleField = 12.25d,
|
||||
Int32Field = 1,
|
||||
Int64Field = 2,
|
||||
Uint32Field = 3,
|
||||
Uint64Field = 4
|
||||
};
|
||||
var fields = TestWellKnownTypes.Descriptor.Fields;
|
||||
|
||||
Assert.AreEqual("x", fields[TestWellKnownTypes.StringFieldFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(ByteString.CopyFrom(1, 2, 3), fields[TestWellKnownTypes.BytesFieldFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(true, fields[TestWellKnownTypes.BoolFieldFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(12.5f, fields[TestWellKnownTypes.FloatFieldFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(12.25d, fields[TestWellKnownTypes.DoubleFieldFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(1, fields[TestWellKnownTypes.Int32FieldFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(2L, fields[TestWellKnownTypes.Int64FieldFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(3U, fields[TestWellKnownTypes.Uint32FieldFieldNumber].Accessor.GetValue(message));
|
||||
Assert.AreEqual(4UL, fields[TestWellKnownTypes.Uint64FieldFieldNumber].Accessor.GetValue(message));
|
||||
|
||||
// And a couple of null fields...
|
||||
message.StringField = null;
|
||||
message.FloatField = null;
|
||||
Assert.IsNull(fields[TestWellKnownTypes.StringFieldFieldNumber].Accessor.GetValue(message));
|
||||
Assert.IsNull(fields[TestWellKnownTypes.FloatFieldFieldNumber].Accessor.GetValue(message));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Reflection_RepeatedFields()
|
||||
{
|
||||
// Just a single example... note that we can't have a null value here
|
||||
var message = new RepeatedWellKnownTypes { Int32Field = { 1, 2 } };
|
||||
var fields = RepeatedWellKnownTypes.Descriptor.Fields;
|
||||
var list = (IList) fields[RepeatedWellKnownTypes.Int32FieldFieldNumber].Accessor.GetValue(message);
|
||||
CollectionAssert.AreEqual(new[] { 1, 2 }, list);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Reflection_MapFields()
|
||||
{
|
||||
// Just a single example... note that we can't have a null value here despite the value type being int?
|
||||
var message = new MapWellKnownTypes { Int32Field = { { 1, 2 } } };
|
||||
var fields = MapWellKnownTypes.Descriptor.Fields;
|
||||
var dictionary = (IDictionary) fields[MapWellKnownTypes.Int32FieldFieldNumber].Accessor.GetValue(message);
|
||||
Assert.AreEqual(2, dictionary[1]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Oneof()
|
||||
{
|
||||
var message = new OneofWellKnownTypes { EmptyField = new Empty() };
|
||||
// Start off with a non-wrapper
|
||||
Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.EmptyField, message.OneofFieldCase);
|
||||
AssertOneofRoundTrip(message);
|
||||
|
||||
message.StringField = "foo";
|
||||
Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.StringField, message.OneofFieldCase);
|
||||
AssertOneofRoundTrip(message);
|
||||
|
||||
message.StringField = "foo";
|
||||
Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.StringField, message.OneofFieldCase);
|
||||
AssertOneofRoundTrip(message);
|
||||
|
||||
message.DoubleField = 0.0f;
|
||||
Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.DoubleField, message.OneofFieldCase);
|
||||
AssertOneofRoundTrip(message);
|
||||
|
||||
message.DoubleField = 1.0f;
|
||||
Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.DoubleField, message.OneofFieldCase);
|
||||
AssertOneofRoundTrip(message);
|
||||
|
||||
message.ClearOneofField();
|
||||
Assert.AreEqual(OneofWellKnownTypes.OneofFieldOneofCase.None, message.OneofFieldCase);
|
||||
AssertOneofRoundTrip(message);
|
||||
}
|
||||
|
||||
private void AssertOneofRoundTrip(OneofWellKnownTypes message)
|
||||
{
|
||||
// Normal roundtrip, but explicitly checking the case...
|
||||
var bytes = message.ToByteArray();
|
||||
var parsed = OneofWellKnownTypes.Parser.ParseFrom(bytes);
|
||||
Assert.AreEqual(message, parsed);
|
||||
Assert.AreEqual(message.OneofFieldCase, parsed.OneofFieldCase);
|
||||
}
|
||||
|
||||
[Test]
|
||||
[TestCase("x", "y", "y")]
|
||||
[TestCase("x", "", "x")]
|
||||
[TestCase("x", null, "x")]
|
||||
[TestCase("", "y", "y")]
|
||||
[TestCase("", "", "")]
|
||||
[TestCase("", null, "")]
|
||||
[TestCase(null, "y", "y")]
|
||||
[TestCase(null, "", "")]
|
||||
[TestCase(null, null, null)]
|
||||
public void Merging(string original, string merged, string expected)
|
||||
{
|
||||
var originalMessage = new TestWellKnownTypes { StringField = original };
|
||||
var mergingMessage = new TestWellKnownTypes { StringField = merged };
|
||||
originalMessage.MergeFrom(mergingMessage);
|
||||
Assert.AreEqual(expected, originalMessage.StringField);
|
||||
|
||||
// Try it using MergeFrom(CodedInputStream) too...
|
||||
originalMessage = new TestWellKnownTypes { StringField = original };
|
||||
originalMessage.MergeFrom(mergingMessage.ToByteArray());
|
||||
Assert.AreEqual(expected, originalMessage.StringField);
|
||||
}
|
||||
|
||||
// Merging is odd with wrapper types, due to the way that default values aren't emitted in
|
||||
// the binary stream. In fact we cheat a little bit - a message with an explicitly present default
|
||||
// value will have that default value ignored. See issue 615. Fixing this would require significant upheaval to
|
||||
// the FieldCodec side of things.
|
||||
[Test]
|
||||
public void MergingStreamExplicitValue()
|
||||
{
|
||||
var message = new TestWellKnownTypes { Int32Field = 5 };
|
||||
|
||||
// Create a byte array which has the data of an Int32Value explicitly containing a value of 0.
|
||||
// This wouldn't normally happen.
|
||||
byte[] bytes;
|
||||
var wrapperTag = WireFormat.MakeTag(TestWellKnownTypes.Int32FieldFieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
var valueTag = WireFormat.MakeTag(Int32Value.ValueFieldNumber, WireFormat.WireType.Varint);
|
||||
using (var stream = new MemoryStream())
|
||||
{
|
||||
var coded = new CodedOutputStream(stream);
|
||||
coded.WriteTag(wrapperTag);
|
||||
coded.WriteLength(2); // valueTag + a value 0, each one byte
|
||||
coded.WriteTag(valueTag);
|
||||
coded.WriteInt32(0);
|
||||
coded.Flush();
|
||||
bytes = stream.ToArray();
|
||||
}
|
||||
|
||||
message.MergeFrom(bytes);
|
||||
// A normal implementation would have 0 now, as the explicit default would have been overwritten the 5.
|
||||
// With the FieldCodec for Nullable<int>, we can't tell the difference between an implicit 0 and an explicit 0.
|
||||
Assert.AreEqual(5, message.Int32Field);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MergingStreamNoValue()
|
||||
{
|
||||
var message = new TestWellKnownTypes { Int32Field = 5 };
|
||||
|
||||
// Create a byte array which an Int32 field, but with no value.
|
||||
var bytes = new TestWellKnownTypes { Int32Field = 0 }.ToByteArray();
|
||||
Assert.AreEqual(2, bytes.Length); // The tag for Int32Field is a single byte, then a byte indicating a 0-length message.
|
||||
message.MergeFrom(bytes);
|
||||
|
||||
// The "implicit" 0 did *not* overwrite the value.
|
||||
// (This is the correct behaviour.)
|
||||
Assert.AreEqual(5, message.Int32Field);
|
||||
}
|
||||
|
||||
// All permutations of origin/merging value being null, zero (default) or non-default.
|
||||
// As this is the in-memory version, we don't need to worry about the difference between implicit and explicit 0.
|
||||
[Test]
|
||||
[TestCase(null, null, null)]
|
||||
[TestCase(null, 0, 0)]
|
||||
[TestCase(null, 5, 5)]
|
||||
[TestCase(0, null, 0)]
|
||||
[TestCase(0, 0, 0)]
|
||||
[TestCase(0, 5, 5)]
|
||||
[TestCase(5, null, 5)]
|
||||
[TestCase(5, 0, 5)]
|
||||
[TestCase(5, 10, 10)]
|
||||
public void MergingMessageWithZero(int? originValue, int? mergingValue, int? expectedResult)
|
||||
{
|
||||
// This differs from the MergingStreamCornerCase because when we merge message *objects*,
|
||||
// we ignore default values from the "source".
|
||||
var message1 = new TestWellKnownTypes { Int32Field = originValue };
|
||||
var message2 = new TestWellKnownTypes { Int32Field = mergingValue };
|
||||
message1.MergeFrom(message2);
|
||||
Assert.AreEqual(expectedResult, message1.Int32Field);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void UnknownFieldInWrapper()
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
var output = new CodedOutputStream(stream);
|
||||
var wrapperTag = WireFormat.MakeTag(TestWellKnownTypes.Int32FieldFieldNumber, WireFormat.WireType.LengthDelimited);
|
||||
var unknownTag = WireFormat.MakeTag(15, WireFormat.WireType.Varint);
|
||||
var valueTag = WireFormat.MakeTag(Int32Value.ValueFieldNumber, WireFormat.WireType.Varint);
|
||||
|
||||
output.WriteTag(wrapperTag);
|
||||
output.WriteLength(4); // unknownTag + value 5 + valueType + value 6, each 1 byte
|
||||
output.WriteTag(unknownTag);
|
||||
output.WriteInt32((int) valueTag); // Sneakily "pretend" it's a tag when it's really a value
|
||||
output.WriteTag(valueTag);
|
||||
output.WriteInt32(6);
|
||||
|
||||
output.Flush();
|
||||
stream.Position = 0;
|
||||
|
||||
var message = TestWellKnownTypes.Parser.ParseFrom(stream);
|
||||
Assert.AreEqual(6, message.Int32Field);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ClearWithReflection()
|
||||
{
|
||||
// String and Bytes are the tricky ones here, as the CLR type of the property
|
||||
// is the same between the wrapper and non-wrapper types.
|
||||
var message = new TestWellKnownTypes { StringField = "foo" };
|
||||
TestWellKnownTypes.Descriptor.Fields[TestWellKnownTypes.StringFieldFieldNumber].Accessor.Clear(message);
|
||||
Assert.IsNull(message.StringField);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
"buildOptions": {
|
||||
"debugType": "portable",
|
||||
"keyFile": "../../keys/Google.Protobuf.snk"
|
||||
},
|
||||
|
||||
"configurations": {
|
||||
"Debug": {
|
||||
"buildOptions": {
|
||||
"define": [ "DEBUG", "TRACE" ]
|
||||
}
|
||||
},
|
||||
"Release": {
|
||||
"buildOptions": {
|
||||
"define": [ "RELEASE", "TRACE" ],
|
||||
"optimize": true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"dependencies": {
|
||||
"Google.Protobuf": { "target": "project" },
|
||||
"NUnit": "3.4.0",
|
||||
"dotnet-test-nunit": "3.4.0-alpha-2",
|
||||
},
|
||||
|
||||
"testRunner": "nunit",
|
||||
|
||||
"frameworks": {
|
||||
"netcoreapp1.0": {
|
||||
"imports" : [ "dnxcore50", "netcoreapp1.0", "portable-net45+win8" ],
|
||||
"buildOptions": {
|
||||
"define": [ "PCL" ]
|
||||
},
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.App": {
|
||||
"version": "1.0.0",
|
||||
"type": "platform"
|
||||
},
|
||||
"System.Console": "4.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
102
csharp/compatibility_tests/v3.0.0/test.sh
Executable file
102
csharp/compatibility_tests/v3.0.0/test.sh
Executable file
|
@ -0,0 +1,102 @@
|
|||
#!/bin/bash
|
||||
|
||||
function run_test() {
|
||||
# Generate test proto files.
|
||||
./protoc_1 -Iprotos/src -I../../../src/ --csharp_out=src/Google.Protobuf.Test \
|
||||
--csharp_opt=base_namespace=Google.Protobuf \
|
||||
protos/src/google/protobuf/unittest_import_proto3.proto \
|
||||
protos/src/google/protobuf/unittest_import_public_proto3.proto \
|
||||
protos/src/google/protobuf/unittest_well_known_types.proto
|
||||
|
||||
./protoc_1 -Iprotos/csharp --csharp_out=src/Google.Protobuf.Test \
|
||||
--csharp_opt=base_namespace=UnitTest.Issues \
|
||||
protos/csharp/protos/unittest_issues.proto
|
||||
|
||||
./protoc_2 -Iprotos/src --csharp_out=src/Google.Protobuf.Test \
|
||||
--csharp_opt=base_namespace=Google.Protobuf \
|
||||
protos/src/google/protobuf/unittest_proto3.proto \
|
||||
protos/src/google/protobuf/map_unittest_proto3.proto
|
||||
|
||||
# Build and test.
|
||||
dotnet build -c release src/Google.Protobuf src/Google.Protobuf.Test
|
||||
dotnet test -c release -f netcoreapp1.0 src/Google.Protobuf.Test
|
||||
}
|
||||
|
||||
set -ex
|
||||
|
||||
# Change to the script's directory.
|
||||
cd $(dirname $0)
|
||||
|
||||
# Version of the tests (i.e., the version of protobuf from where we extracted
|
||||
# these tests).
|
||||
TEST_VERSION=3.0.0
|
||||
|
||||
# The old version of protobuf that we are testing compatibility against. This
|
||||
# is usually the same as TEST_VERSION (i.e., we use the tests extracted from
|
||||
# that version to test compatibility of the newest runtime against it), but it
|
||||
# is also possible to use this same test set to test the compatibiilty of the
|
||||
# latest version against other versions.
|
||||
case "$1" in
|
||||
""|3.0.0)
|
||||
OLD_VERSION=3.0.0
|
||||
OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.0/protoc-3.0.0-linux-x86_64.exe
|
||||
;;
|
||||
3.0.2)
|
||||
OLD_VERSION=3.0.2
|
||||
OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.0.2/protoc-3.0.2-linux-x86_64.exe
|
||||
;;
|
||||
3.1.0)
|
||||
OLD_VERSION=3.1.0
|
||||
OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.1.0/protoc-3.1.0-linux-x86_64.exe
|
||||
;;
|
||||
*)
|
||||
echo "[ERROR]: Unknown version number: $1"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "Running compatibility tests with $OLD_VERSION"
|
||||
|
||||
# Check protoc
|
||||
[ -f ../../../src/protoc ] || {
|
||||
echo "[ERROR]: Please build protoc first."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Download old version protoc compiler (for linux).
|
||||
wget $OLD_VERSION_PROTOC -O old_protoc
|
||||
chmod +x old_protoc
|
||||
|
||||
# Test source compatibility. In these tests we recompile everything against
|
||||
# the new runtime (including old version generated code).
|
||||
# Copy the new runtime and keys.
|
||||
cp ../../src/Google.Protobuf src/Google.Protobuf -r
|
||||
cp ../../keys . -r
|
||||
dotnet restore
|
||||
|
||||
# Test A.1:
|
||||
# proto set 1: use old version
|
||||
# proto set 2 which may import protos in set 1: use old version
|
||||
cp old_protoc protoc_1
|
||||
cp old_protoc protoc_2
|
||||
run_test
|
||||
|
||||
# Test A.2:
|
||||
# proto set 1: use new version
|
||||
# proto set 2 which may import protos in set 1: use old version
|
||||
cp ../../../src/protoc protoc_1
|
||||
cp old_protoc protoc_2
|
||||
run_test
|
||||
|
||||
# Test A.3:
|
||||
# proto set 1: use old version
|
||||
# proto set 2 which may import protos in set 1: use new version
|
||||
cp old_protoc protoc_1
|
||||
cp ../../../src/protoc protoc_2
|
||||
run_test
|
||||
|
||||
rm protoc_1
|
||||
rm protoc_2
|
||||
rm old_protoc
|
||||
rm keys -r
|
||||
rm src/Google.Protobuf -r
|
|
@ -50,9 +50,15 @@ $PROTOC -Isrc --csharp_out=csharp/src/Google.Protobuf.Test \
|
|||
src/google/protobuf/unittest_well_known_types.proto
|
||||
|
||||
# Different base namespace to the protos above
|
||||
$PROTOC -Icsharp/protos --csharp_out=csharp/src/Google.Protobuf.Test \
|
||||
$PROTOC -Isrc -Icsharp/protos --csharp_out=csharp/src/Google.Protobuf.Test \
|
||||
--csharp_opt=base_namespace=UnitTest.Issues \
|
||||
csharp/protos/unittest_issues.proto
|
||||
csharp/protos/unittest_issues.proto \
|
||||
csharp/protos/unittest_custom_options_proto3.proto
|
||||
|
||||
# Don't specify a base namespace at all; we just want to make sure the
|
||||
# results end up in TestProtos.
|
||||
$PROTOC -Isrc --csharp_out=csharp/src/Google.Protobuf.Test/TestProtos \
|
||||
src/google/protobuf/test_messages_proto3.proto
|
||||
|
||||
# AddressBook sample protos
|
||||
$PROTOC -Iexamples --csharp_out=csharp/src/AddressBook \
|
||||
|
|
336
csharp/protos/unittest_custom_options_proto3.proto
Normal file
336
csharp/protos/unittest_custom_options_proto3.proto
Normal file
|
@ -0,0 +1,336 @@
|
|||
// Protocol Buffers - Google's data interchange format
|
||||
// Copyright 2008 Google Inc. All rights reserved.
|
||||
// https://developers.google.com/protocol-buffers/
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Author: benjy@google.com (Benjy Weinberger)
|
||||
// Based on original Protocol Buffers design by
|
||||
// Sanjay Ghemawat, Jeff Dean, and others.
|
||||
//
|
||||
// A proto file used to test the "custom options" feature of google.protobuf.
|
||||
|
||||
// This file is based on unittest_custom_options.proto in
|
||||
// src/google/protobuf, but is modified for proto3. It could
|
||||
// potentially be moved into src/google/protobuf, but currently C#
|
||||
// is the only language that really needs it, as we don't support
|
||||
// proto2 syntax. It's cut down significantly as proto3 only supports
|
||||
// extensions for options.
|
||||
|
||||
|
||||
syntax = "proto3";
|
||||
|
||||
// A custom file option (defined below).
|
||||
option (file_opt1) = 9876543210;
|
||||
|
||||
import "google/protobuf/descriptor.proto";
|
||||
|
||||
// We don't put this in a package within proto2 because we need to make sure
|
||||
// that the generated code doesn't depend on being in the proto2 namespace.
|
||||
package protobuf_unittest;
|
||||
option csharp_namespace = "UnitTest.Issues.TestProtos";
|
||||
|
||||
// Some simple test custom options of various types.
|
||||
|
||||
extend google.protobuf.FileOptions {
|
||||
uint64 file_opt1 = 7736974;
|
||||
}
|
||||
|
||||
extend google.protobuf.MessageOptions {
|
||||
int32 message_opt1 = 7739036;
|
||||
}
|
||||
|
||||
extend google.protobuf.FieldOptions {
|
||||
fixed64 field_opt1 = 7740936;
|
||||
}
|
||||
|
||||
extend google.protobuf.OneofOptions {
|
||||
int32 oneof_opt1 = 7740111;
|
||||
}
|
||||
|
||||
extend google.protobuf.EnumOptions {
|
||||
sfixed32 enum_opt1 = 7753576;
|
||||
}
|
||||
|
||||
extend google.protobuf.EnumValueOptions {
|
||||
int32 enum_value_opt1 = 1560678;
|
||||
}
|
||||
|
||||
extend google.protobuf.ServiceOptions {
|
||||
sint64 service_opt1 = 7887650;
|
||||
}
|
||||
|
||||
enum MethodOpt1 {
|
||||
METHODOPT1_UNSPECIFIED = 0;
|
||||
METHODOPT1_VAL1 = 1;
|
||||
METHODOPT1_VAL2 = 2;
|
||||
}
|
||||
|
||||
extend google.protobuf.MethodOptions {
|
||||
MethodOpt1 method_opt1 = 7890860;
|
||||
}
|
||||
|
||||
// A test message with custom options at all possible locations (and also some
|
||||
// regular options, to make sure they interact nicely).
|
||||
message TestMessageWithCustomOptions {
|
||||
option message_set_wire_format = false;
|
||||
|
||||
option (message_opt1) = -56;
|
||||
|
||||
string field1 = 1 [ctype=CORD,
|
||||
(field_opt1)=8765432109];
|
||||
|
||||
oneof AnOneof {
|
||||
option (oneof_opt1) = -99;
|
||||
int32 oneof_field = 2;
|
||||
}
|
||||
|
||||
enum AnEnum {
|
||||
option (enum_opt1) = -789;
|
||||
ANENUM_UNSPECIFIED = 0;
|
||||
ANENUM_VAL1 = 1;
|
||||
ANENUM_VAL2 = 2 [(enum_value_opt1) = 123];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// A test RPC service with custom options at all possible locations (and also
|
||||
// some regular options, to make sure they interact nicely).
|
||||
message CustomOptionFooRequest {
|
||||
}
|
||||
|
||||
message CustomOptionFooResponse {
|
||||
}
|
||||
|
||||
message CustomOptionFooClientMessage {
|
||||
}
|
||||
|
||||
message CustomOptionFooServerMessage {
|
||||
}
|
||||
|
||||
service TestServiceWithCustomOptions {
|
||||
option (service_opt1) = -9876543210;
|
||||
|
||||
rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) {
|
||||
option (method_opt1) = METHODOPT1_VAL2;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Options of every possible field type, so we can test them all exhaustively.
|
||||
|
||||
message DummyMessageContainingEnum {
|
||||
enum TestEnumType {
|
||||
TEST_OPTION_ENUM_UNSPECIFIED = 0;
|
||||
TEST_OPTION_ENUM_TYPE1 = 22;
|
||||
TEST_OPTION_ENUM_TYPE2 = -23;
|
||||
}
|
||||
}
|
||||
|
||||
message DummyMessageInvalidAsOptionType {
|
||||
}
|
||||
|
||||
extend google.protobuf.MessageOptions {
|
||||
bool bool_opt = 7706090;
|
||||
int32 int32_opt = 7705709;
|
||||
int64 int64_opt = 7705542;
|
||||
uint32 uint32_opt = 7704880;
|
||||
uint64 uint64_opt = 7702367;
|
||||
sint32 sint32_opt = 7701568;
|
||||
sint64 sint64_opt = 7700863;
|
||||
fixed32 fixed32_opt = 7700307;
|
||||
fixed64 fixed64_opt = 7700194;
|
||||
sfixed32 sfixed32_opt = 7698645;
|
||||
sfixed64 sfixed64_opt = 7685475;
|
||||
float float_opt = 7675390;
|
||||
double double_opt = 7673293;
|
||||
string string_opt = 7673285;
|
||||
bytes bytes_opt = 7673238;
|
||||
DummyMessageContainingEnum.TestEnumType enum_opt = 7673233;
|
||||
DummyMessageInvalidAsOptionType message_type_opt = 7665967;
|
||||
}
|
||||
|
||||
message CustomOptionMinIntegerValues {
|
||||
option (bool_opt) = false;
|
||||
option (int32_opt) = -0x80000000;
|
||||
option (int64_opt) = -0x8000000000000000;
|
||||
option (uint32_opt) = 0;
|
||||
option (uint64_opt) = 0;
|
||||
option (sint32_opt) = -0x80000000;
|
||||
option (sint64_opt) = -0x8000000000000000;
|
||||
option (fixed32_opt) = 0;
|
||||
option (fixed64_opt) = 0;
|
||||
option (sfixed32_opt) = -0x80000000;
|
||||
option (sfixed64_opt) = -0x8000000000000000;
|
||||
}
|
||||
|
||||
message CustomOptionMaxIntegerValues {
|
||||
option (bool_opt) = true;
|
||||
option (int32_opt) = 0x7FFFFFFF;
|
||||
option (int64_opt) = 0x7FFFFFFFFFFFFFFF;
|
||||
option (uint32_opt) = 0xFFFFFFFF;
|
||||
option (uint64_opt) = 0xFFFFFFFFFFFFFFFF;
|
||||
option (sint32_opt) = 0x7FFFFFFF;
|
||||
option (sint64_opt) = 0x7FFFFFFFFFFFFFFF;
|
||||
option (fixed32_opt) = 0xFFFFFFFF;
|
||||
option (fixed64_opt) = 0xFFFFFFFFFFFFFFFF;
|
||||
option (sfixed32_opt) = 0x7FFFFFFF;
|
||||
option (sfixed64_opt) = 0x7FFFFFFFFFFFFFFF;
|
||||
}
|
||||
|
||||
message CustomOptionOtherValues {
|
||||
option (int32_opt) = -100; // To test sign-extension.
|
||||
option (float_opt) = 12.3456789;
|
||||
option (double_opt) = 1.234567890123456789;
|
||||
option (string_opt) = "Hello, \"World\"";
|
||||
option (bytes_opt) = "Hello\0World";
|
||||
option (enum_opt) = TEST_OPTION_ENUM_TYPE2;
|
||||
}
|
||||
|
||||
message SettingRealsFromPositiveInts {
|
||||
option (float_opt) = 12;
|
||||
option (double_opt) = 154;
|
||||
}
|
||||
|
||||
message SettingRealsFromNegativeInts {
|
||||
option (float_opt) = -12;
|
||||
option (double_opt) = -154;
|
||||
}
|
||||
|
||||
// Options of complex message types, themselves combined and extended in
|
||||
// various ways.
|
||||
|
||||
message ComplexOptionType1 {
|
||||
int32 foo = 1;
|
||||
int32 foo2 = 2;
|
||||
int32 foo3 = 3;
|
||||
repeated int32 foo4 = 4;
|
||||
}
|
||||
|
||||
message ComplexOptionType2 {
|
||||
ComplexOptionType1 bar = 1;
|
||||
int32 baz = 2;
|
||||
|
||||
message ComplexOptionType4 {
|
||||
int32 waldo = 1;
|
||||
|
||||
extend google.protobuf.MessageOptions {
|
||||
ComplexOptionType4 complex_opt4 = 7633546;
|
||||
}
|
||||
}
|
||||
|
||||
ComplexOptionType4 fred = 3;
|
||||
repeated ComplexOptionType4 barney = 4;
|
||||
}
|
||||
|
||||
message ComplexOptionType3 {
|
||||
int32 qux = 1;
|
||||
}
|
||||
|
||||
extend google.protobuf.MessageOptions {
|
||||
protobuf_unittest.ComplexOptionType1 complex_opt1 = 7646756;
|
||||
ComplexOptionType2 complex_opt2 = 7636949;
|
||||
ComplexOptionType3 complex_opt3 = 7636463;
|
||||
}
|
||||
|
||||
// Note that we try various different ways of naming the same extension.
|
||||
message VariousComplexOptions {
|
||||
option (.protobuf_unittest.complex_opt1).foo = 42;
|
||||
option (protobuf_unittest.complex_opt1).foo4 = 99;
|
||||
option (protobuf_unittest.complex_opt1).foo4 = 88;
|
||||
option (complex_opt2).baz = 987;
|
||||
option (complex_opt2).bar.foo = 743;
|
||||
option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971;
|
||||
option (complex_opt2).fred.waldo = 321;
|
||||
option (complex_opt2).barney = { waldo: 101 };
|
||||
option (complex_opt2).barney = { waldo: 212 };
|
||||
option (protobuf_unittest.complex_opt3).qux = 9;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------
|
||||
// Definitions for testing aggregate option parsing.
|
||||
// See descriptor_unittest.cc.
|
||||
|
||||
// A helper type used to test aggregate option parsing
|
||||
message Aggregate {
|
||||
int32 i = 1;
|
||||
string s = 2;
|
||||
|
||||
// A nested object
|
||||
Aggregate sub = 3;
|
||||
}
|
||||
|
||||
// Allow Aggregate to be used as an option at all possible locations
|
||||
// in the .proto grammer.
|
||||
extend google.protobuf.FileOptions { Aggregate fileopt = 15478479; }
|
||||
extend google.protobuf.MessageOptions { Aggregate msgopt = 15480088; }
|
||||
extend google.protobuf.FieldOptions { Aggregate fieldopt = 15481374; }
|
||||
extend google.protobuf.EnumOptions { Aggregate enumopt = 15483218; }
|
||||
extend google.protobuf.EnumValueOptions { Aggregate enumvalopt = 15486921; }
|
||||
extend google.protobuf.ServiceOptions { Aggregate serviceopt = 15497145; }
|
||||
extend google.protobuf.MethodOptions { Aggregate methodopt = 15512713; }
|
||||
|
||||
// Try using AggregateOption at different points in the proto grammar
|
||||
option (fileopt) = {
|
||||
s: 'FileAnnotation'
|
||||
// Also test the handling of comments
|
||||
/* of both types */ i: 100
|
||||
|
||||
sub { s: 'NestedFileAnnotation' }
|
||||
};
|
||||
|
||||
message AggregateMessage {
|
||||
option (msgopt) = { i:101 s:'MessageAnnotation' };
|
||||
int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }];
|
||||
}
|
||||
|
||||
service AggregateService {
|
||||
option (serviceopt) = { s:'ServiceAnnotation' };
|
||||
rpc Method (AggregateMessage) returns (AggregateMessage) {
|
||||
option (methodopt) = { s:'MethodAnnotation' };
|
||||
}
|
||||
}
|
||||
|
||||
enum AggregateEnum {
|
||||
option (enumopt) = { s:'EnumAnnotation' };
|
||||
UNSPECIFIED = 0;
|
||||
VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }];
|
||||
}
|
||||
|
||||
// Test custom options for nested type.
|
||||
message NestedOptionType {
|
||||
message NestedMessage {
|
||||
option (message_opt1) = 1001;
|
||||
int32 nested_field = 1 [(field_opt1) = 1002];
|
||||
}
|
||||
enum NestedEnum {
|
||||
UNSPECIFIED = 0;
|
||||
option (enum_opt1) = 1003;
|
||||
NESTED_ENUM_VALUE = 1 [(enum_value_opt1) = 1004];
|
||||
}
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{A31F5FB2-4FF3-432A-B35B-5CD203606311}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Google.Protobuf.Examples.AddressBook</RootNamespace>
|
||||
<AssemblyName>AddressBook</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<StartupObject>Google.Protobuf.Examples.AddressBook.Program</StartupObject>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug</OutputPath>
|
||||
<IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<NoStdLib>true</NoStdLib>
|
||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release</OutputPath>
|
||||
<IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<NoStdLib>true</NoStdLib>
|
||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="mscorlib" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="AddPerson.cs" />
|
||||
<Compile Include="Addressbook.cs" />
|
||||
<Compile Include="SampleUsage.cs" />
|
||||
<Compile Include="ListPeople.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Google.Protobuf\Google.Protobuf.csproj">
|
||||
<Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
|
||||
<Name>Google.Protobuf</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue