prototest.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. // Copyright 2019 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // Package prototest exercises protobuf reflection.
  5. package prototest
  6. import (
  7. "bytes"
  8. "fmt"
  9. "math"
  10. "sort"
  11. "testing"
  12. "google.golang.org/protobuf/encoding/prototext"
  13. "google.golang.org/protobuf/internal/encoding/wire"
  14. "google.golang.org/protobuf/proto"
  15. pref "google.golang.org/protobuf/reflect/protoreflect"
  16. preg "google.golang.org/protobuf/reflect/protoregistry"
  17. )
  18. // TODO: Test read-only properties of unpopulated composite values.
  19. // TODO: Test invalid field descriptors or oneof descriptors.
  20. // TODO: This should test the functionality that can be provided by fast-paths.
  21. // MessageOptions configure message tests.
  22. type MessageOptions struct {
  23. // ExtensionTypes is a list of types to test with.
  24. //
  25. // If nil, TestMessage will look for extension types in the global registry.
  26. ExtensionTypes []pref.ExtensionType
  27. }
  28. // TestMessage runs the provided m through a series of tests
  29. // exercising the protobuf reflection API.
  30. func TestMessage(t testing.TB, m proto.Message, opts MessageOptions) {
  31. md := m.ProtoReflect().Descriptor()
  32. m1 := m.ProtoReflect().New()
  33. for i := 0; i < md.Fields().Len(); i++ {
  34. fd := md.Fields().Get(i)
  35. testField(t, m1, fd)
  36. }
  37. if opts.ExtensionTypes == nil {
  38. preg.GlobalTypes.RangeExtensionsByMessage(md.FullName(), func(e pref.ExtensionType) bool {
  39. opts.ExtensionTypes = append(opts.ExtensionTypes, e)
  40. return true
  41. })
  42. }
  43. for _, xt := range opts.ExtensionTypes {
  44. testField(t, m1, xt)
  45. }
  46. for i := 0; i < md.Oneofs().Len(); i++ {
  47. testOneof(t, m1, md.Oneofs().Get(i))
  48. }
  49. testUnknown(t, m1)
  50. // Test round-trip marshal/unmarshal.
  51. m2 := m.ProtoReflect().New().Interface()
  52. populateMessage(m2.ProtoReflect(), 1, nil)
  53. b, err := proto.Marshal(m2)
  54. if err != nil {
  55. t.Errorf("Marshal() = %v, want nil\n%v", err, marshalText(m2))
  56. }
  57. m3 := m.ProtoReflect().New().Interface()
  58. if err := proto.Unmarshal(b, m3); err != nil {
  59. t.Errorf("Unmarshal() = %v, want nil\n%v", err, marshalText(m2))
  60. }
  61. if !proto.Equal(m2, m3) {
  62. t.Errorf("round-trip marshal/unmarshal did not preserve message\nOriginal:\n%v\nNew:\n%v", marshalText(m2), marshalText(m3))
  63. }
  64. }
  65. func marshalText(m proto.Message) string {
  66. b, _ := prototext.MarshalOptions{Indent: " "}.Marshal(m)
  67. return string(b)
  68. }
  69. // testField exercises set/get/has/clear of a field.
  70. func testField(t testing.TB, m pref.Message, fd pref.FieldDescriptor) {
  71. name := fd.FullName()
  72. num := fd.Number()
  73. switch {
  74. case fd.IsList():
  75. testFieldList(t, m, fd)
  76. case fd.IsMap():
  77. testFieldMap(t, m, fd)
  78. case fd.Kind() == pref.FloatKind || fd.Kind() == pref.DoubleKind:
  79. testFieldFloat(t, m, fd)
  80. }
  81. // Set to a non-zero value, the zero value, different non-zero values.
  82. for _, n := range []seed{1, 0, minVal, maxVal} {
  83. v := newValue(m, fd, n, nil)
  84. m.Set(fd, v)
  85. wantHas := true
  86. if n == 0 {
  87. if fd.Syntax() == pref.Proto3 && fd.Message() == nil {
  88. wantHas = false
  89. }
  90. if fd.Cardinality() == pref.Repeated {
  91. wantHas = false
  92. }
  93. if fd.IsExtension() {
  94. wantHas = true
  95. }
  96. if fd.ContainingOneof() != nil {
  97. wantHas = true
  98. }
  99. }
  100. if got, want := m.Has(fd), wantHas; got != want {
  101. t.Errorf("after setting %q to %v:\nMessage.Has(%v) = %v, want %v", name, formatValue(v), num, got, want)
  102. }
  103. if got, want := m.Get(fd), v; !valueEqual(got, want) {
  104. t.Errorf("after setting %q:\nMessage.Get(%v) = %v, want %v", name, num, formatValue(got), formatValue(want))
  105. }
  106. found := false
  107. m.Range(func(d pref.FieldDescriptor, got pref.Value) bool {
  108. if fd != d {
  109. return true
  110. }
  111. found = true
  112. if want := v; !valueEqual(got, want) {
  113. t.Errorf("after setting %q:\nMessage.Range got value %v, want %v", name, formatValue(got), formatValue(want))
  114. }
  115. return true
  116. })
  117. if got, want := wantHas, found; got != want {
  118. t.Errorf("after setting %q:\nMessageRange saw field: %v, want %v", name, got, want)
  119. }
  120. }
  121. m.Clear(fd)
  122. if got, want := m.Has(fd), false; got != want {
  123. t.Errorf("after clearing %q:\nMessage.Has(%v) = %v, want %v", name, num, got, want)
  124. }
  125. switch {
  126. case fd.IsList():
  127. if got := m.Get(fd); got.List().Len() != 0 {
  128. t.Errorf("after clearing %q:\nMessage.Get(%v) = %v, want empty list", name, num, formatValue(got))
  129. }
  130. case fd.IsMap():
  131. if got := m.Get(fd); got.Map().Len() != 0 {
  132. t.Errorf("after clearing %q:\nMessage.Get(%v) = %v, want empty list", name, num, formatValue(got))
  133. }
  134. case fd.Message() == nil:
  135. if got, want := m.Get(fd), fd.Default(); !valueEqual(got, want) {
  136. t.Errorf("after clearing %q:\nMessage.Get(%v) = %v, want default %v", name, num, formatValue(got), formatValue(want))
  137. }
  138. }
  139. // Set to the wrong type.
  140. v := pref.ValueOf("")
  141. if fd.Kind() == pref.StringKind {
  142. v = pref.ValueOf(int32(0))
  143. }
  144. if !panics(func() {
  145. m.Set(fd, v)
  146. }) {
  147. t.Errorf("setting %v to %T succeeds, want panic", name, v.Interface())
  148. }
  149. }
  150. // testFieldMap tests set/get/has/clear of entries in a map field.
  151. func testFieldMap(t testing.TB, m pref.Message, fd pref.FieldDescriptor) {
  152. name := fd.FullName()
  153. num := fd.Number()
  154. m.Clear(fd) // start with an empty map
  155. mapv := m.Mutable(fd).Map()
  156. // Add values.
  157. want := make(testMap)
  158. for i, n := range []seed{1, 0, minVal, maxVal} {
  159. if got, want := m.Has(fd), i > 0; got != want {
  160. t.Errorf("after inserting %d elements to %q:\nMessage.Has(%v) = %v, want %v", i, name, num, got, want)
  161. }
  162. k := newMapKey(fd, n)
  163. v := newMapValue(fd, mapv, n, nil)
  164. mapv.Set(k, v)
  165. want.Set(k, v)
  166. if got, want := m.Get(fd), pref.ValueOf(want); !valueEqual(got, want) {
  167. t.Errorf("after inserting %d elements to %q:\nMessage.Get(%v) = %v, want %v", i, name, num, formatValue(got), formatValue(want))
  168. }
  169. }
  170. // Set values.
  171. want.Range(func(k pref.MapKey, v pref.Value) bool {
  172. nv := newMapValue(fd, mapv, 10, nil)
  173. mapv.Set(k, nv)
  174. want.Set(k, nv)
  175. if got, want := m.Get(fd), pref.ValueOf(want); !valueEqual(got, want) {
  176. t.Errorf("after setting element %v of %q:\nMessage.Get(%v) = %v, want %v", formatValue(k.Value()), name, num, formatValue(got), formatValue(want))
  177. }
  178. return true
  179. })
  180. // Clear values.
  181. want.Range(func(k pref.MapKey, v pref.Value) bool {
  182. mapv.Clear(k)
  183. want.Clear(k)
  184. if got, want := m.Has(fd), want.Len() > 0; got != want {
  185. t.Errorf("after clearing elements of %q:\nMessage.Has(%v) = %v, want %v", name, num, got, want)
  186. }
  187. if got, want := m.Get(fd), pref.ValueOf(want); !valueEqual(got, want) {
  188. t.Errorf("after clearing elements of %q:\nMessage.Get(%v) = %v, want %v", name, num, formatValue(got), formatValue(want))
  189. }
  190. return true
  191. })
  192. // Non-existent map keys.
  193. missingKey := newMapKey(fd, 1)
  194. if got, want := mapv.Has(missingKey), false; got != want {
  195. t.Errorf("non-existent map key in %q: Map.Has(%v) = %v, want %v", name, formatValue(missingKey.Value()), got, want)
  196. }
  197. if got, want := mapv.Get(missingKey).IsValid(), false; got != want {
  198. t.Errorf("non-existent map key in %q: Map.Get(%v).IsValid() = %v, want %v", name, formatValue(missingKey.Value()), got, want)
  199. }
  200. mapv.Clear(missingKey) // noop
  201. }
  202. type testMap map[interface{}]pref.Value
  203. func (m testMap) Get(k pref.MapKey) pref.Value { return m[k.Interface()] }
  204. func (m testMap) Set(k pref.MapKey, v pref.Value) { m[k.Interface()] = v }
  205. func (m testMap) Has(k pref.MapKey) bool { return m.Get(k).IsValid() }
  206. func (m testMap) Clear(k pref.MapKey) { delete(m, k.Interface()) }
  207. func (m testMap) Len() int { return len(m) }
  208. func (m testMap) NewMessage() pref.Message { panic("unimplemented") }
  209. func (m testMap) Range(f func(pref.MapKey, pref.Value) bool) {
  210. for k, v := range m {
  211. if !f(pref.ValueOf(k).MapKey(), v) {
  212. return
  213. }
  214. }
  215. }
  216. // testFieldList exercises set/get/append/truncate of values in a list.
  217. func testFieldList(t testing.TB, m pref.Message, fd pref.FieldDescriptor) {
  218. name := fd.FullName()
  219. num := fd.Number()
  220. m.Clear(fd) // start with an empty list
  221. list := m.Mutable(fd).List()
  222. // Append values.
  223. var want pref.List = &testList{}
  224. for i, n := range []seed{1, 0, minVal, maxVal} {
  225. if got, want := m.Has(fd), i > 0 || fd.IsExtension(); got != want {
  226. t.Errorf("after appending %d elements to %q:\nMessage.Has(%v) = %v, want %v", i, name, num, got, want)
  227. }
  228. v := newListElement(fd, list, n, nil)
  229. want.Append(v)
  230. list.Append(v)
  231. if got, want := m.Get(fd), pref.ValueOf(want); !valueEqual(got, want) {
  232. t.Errorf("after appending %d elements to %q:\nMessage.Get(%v) = %v, want %v", i+1, name, num, formatValue(got), formatValue(want))
  233. }
  234. }
  235. // Set values.
  236. for i := 0; i < want.Len(); i++ {
  237. v := newListElement(fd, list, seed(i+10), nil)
  238. want.Set(i, v)
  239. list.Set(i, v)
  240. if got, want := m.Get(fd), pref.ValueOf(want); !valueEqual(got, want) {
  241. t.Errorf("after setting element %d of %q:\nMessage.Get(%v) = %v, want %v", i, name, num, formatValue(got), formatValue(want))
  242. }
  243. }
  244. // Truncate.
  245. for want.Len() > 0 {
  246. n := want.Len() - 1
  247. want.Truncate(n)
  248. list.Truncate(n)
  249. if got, want := m.Has(fd), want.Len() > 0 || fd.IsExtension(); got != want {
  250. t.Errorf("after truncating %q to %d:\nMessage.Has(%v) = %v, want %v", name, n, num, got, want)
  251. }
  252. if got, want := m.Get(fd), pref.ValueOf(want); !valueEqual(got, want) {
  253. t.Errorf("after truncating %q to %d:\nMessage.Get(%v) = %v, want %v", name, n, num, formatValue(got), formatValue(want))
  254. }
  255. }
  256. }
  257. type testList struct {
  258. a []pref.Value
  259. }
  260. func (l *testList) Append(v pref.Value) { l.a = append(l.a, v) }
  261. func (l *testList) Get(n int) pref.Value { return l.a[n] }
  262. func (l *testList) Len() int { return len(l.a) }
  263. func (l *testList) Set(n int, v pref.Value) { l.a[n] = v }
  264. func (l *testList) Truncate(n int) { l.a = l.a[:n] }
  265. func (l *testList) NewMessage() pref.Message { panic("unimplemented") }
  266. // testFieldFloat exercises some interesting floating-point scalar field values.
  267. func testFieldFloat(t testing.TB, m pref.Message, fd pref.FieldDescriptor) {
  268. name := fd.FullName()
  269. num := fd.Number()
  270. for _, v := range []float64{math.Inf(-1), math.Inf(1), math.NaN(), math.Copysign(0, -1)} {
  271. var val pref.Value
  272. if fd.Kind() == pref.FloatKind {
  273. val = pref.ValueOf(float32(v))
  274. } else {
  275. val = pref.ValueOf(v)
  276. }
  277. m.Set(fd, val)
  278. // Note that Has is true for -0.
  279. if got, want := m.Has(fd), true; got != want {
  280. t.Errorf("after setting %v to %v: Message.Has(%v) = %v, want %v", name, v, num, got, want)
  281. }
  282. if got, want := m.Get(fd), val; !valueEqual(got, want) {
  283. t.Errorf("after setting %v: Message.Get(%v) = %v, want %v", name, num, formatValue(got), formatValue(want))
  284. }
  285. }
  286. }
  287. // testOneof tests the behavior of fields in a oneof.
  288. func testOneof(t testing.TB, m pref.Message, od pref.OneofDescriptor) {
  289. for _, mutable := range []bool{false, true} {
  290. for i := 0; i < od.Fields().Len(); i++ {
  291. fda := od.Fields().Get(i)
  292. if mutable {
  293. // Set fields by requesting a mutable reference.
  294. if !fda.IsMap() && !fda.IsList() && fda.Message() == nil {
  295. continue
  296. }
  297. _ = m.Mutable(fda)
  298. } else {
  299. // Set fields explicitly.
  300. m.Set(fda, newValue(m, fda, 1, nil))
  301. }
  302. if got, want := m.WhichOneof(od), fda; got != want {
  303. t.Errorf("after setting oneof field %q:\nWhichOneof(%q) = %v, want %v", fda.FullName(), fda.Name(), got, want)
  304. }
  305. for j := 0; j < od.Fields().Len(); j++ {
  306. fdb := od.Fields().Get(j)
  307. if got, want := m.Has(fdb), i == j; got != want {
  308. t.Errorf("after setting oneof field %q:\nGet(%q) = %v, want %v", fda.FullName(), fdb.FullName(), got, want)
  309. }
  310. }
  311. }
  312. }
  313. }
  314. // testUnknown tests the behavior of unknown fields.
  315. func testUnknown(t testing.TB, m pref.Message) {
  316. var b []byte
  317. b = wire.AppendTag(b, 1000, wire.VarintType)
  318. b = wire.AppendVarint(b, 1001)
  319. m.SetUnknown(pref.RawFields(b))
  320. if got, want := []byte(m.GetUnknown()), b; !bytes.Equal(got, want) {
  321. t.Errorf("after setting unknown fields:\nGetUnknown() = %v, want %v", got, want)
  322. }
  323. }
  324. func formatValue(v pref.Value) string {
  325. switch v := v.Interface().(type) {
  326. case pref.List:
  327. var buf bytes.Buffer
  328. buf.WriteString("list[")
  329. for i := 0; i < v.Len(); i++ {
  330. if i > 0 {
  331. buf.WriteString(" ")
  332. }
  333. buf.WriteString(formatValue(v.Get(i)))
  334. }
  335. buf.WriteString("]")
  336. return buf.String()
  337. case pref.Map:
  338. var buf bytes.Buffer
  339. buf.WriteString("map[")
  340. var keys []pref.MapKey
  341. v.Range(func(k pref.MapKey, v pref.Value) bool {
  342. keys = append(keys, k)
  343. return true
  344. })
  345. sort.Slice(keys, func(i, j int) bool {
  346. return keys[i].String() < keys[j].String()
  347. })
  348. for i, k := range keys {
  349. if i > 0 {
  350. buf.WriteString(" ")
  351. }
  352. buf.WriteString(formatValue(k.Value()))
  353. buf.WriteString(":")
  354. buf.WriteString(formatValue(v.Get(k)))
  355. }
  356. buf.WriteString("]")
  357. return buf.String()
  358. case pref.Message:
  359. b, err := prototext.Marshal(v.Interface())
  360. if err != nil {
  361. return fmt.Sprintf("<%v>", err)
  362. }
  363. return fmt.Sprintf("%v{%v}", v.Descriptor().FullName(), string(b))
  364. case string:
  365. return fmt.Sprintf("%q", v)
  366. default:
  367. return fmt.Sprint(v)
  368. }
  369. }
  370. func valueEqual(a, b pref.Value) bool {
  371. ai, bi := a.Interface(), b.Interface()
  372. switch ai.(type) {
  373. case pref.Message:
  374. return proto.Equal(
  375. a.Message().Interface(),
  376. b.Message().Interface(),
  377. )
  378. case pref.List:
  379. lista, listb := a.List(), b.List()
  380. if lista.Len() != listb.Len() {
  381. return false
  382. }
  383. for i := 0; i < lista.Len(); i++ {
  384. if !valueEqual(lista.Get(i), listb.Get(i)) {
  385. return false
  386. }
  387. }
  388. return true
  389. case pref.Map:
  390. mapa, mapb := a.Map(), b.Map()
  391. if mapa.Len() != mapb.Len() {
  392. return false
  393. }
  394. equal := true
  395. mapa.Range(func(k pref.MapKey, v pref.Value) bool {
  396. if !valueEqual(v, mapb.Get(k)) {
  397. equal = false
  398. return false
  399. }
  400. return true
  401. })
  402. return equal
  403. case []byte:
  404. return bytes.Equal(a.Bytes(), b.Bytes())
  405. case float32:
  406. // NaNs are equal, but must be the same NaN.
  407. return math.Float32bits(ai.(float32)) == math.Float32bits(bi.(float32))
  408. case float64:
  409. // NaNs are equal, but must be the same NaN.
  410. return math.Float64bits(ai.(float64)) == math.Float64bits(bi.(float64))
  411. default:
  412. return ai == bi
  413. }
  414. }
  415. // A seed is used to vary the content of a value.
  416. //
  417. // A seed of 0 is the zero value. Messages do not have a zero-value; a 0-seeded messages
  418. // is unpopulated.
  419. //
  420. // A seed of minVal or maxVal is the least or greatest value of the value type.
  421. type seed int
  422. const (
  423. minVal seed = -1
  424. maxVal seed = -2
  425. )
  426. // newValue returns a new value assignable to a field.
  427. //
  428. // The stack parameter is used to avoid infinite recursion when populating circular
  429. // data structures.
  430. func newValue(m pref.Message, fd pref.FieldDescriptor, n seed, stack []pref.MessageDescriptor) pref.Value {
  431. switch {
  432. case fd.IsList():
  433. list := m.New().Mutable(fd).List()
  434. if n == 0 {
  435. return pref.ValueOf(list)
  436. }
  437. list.Append(newListElement(fd, list, 0, stack))
  438. list.Append(newListElement(fd, list, minVal, stack))
  439. list.Append(newListElement(fd, list, maxVal, stack))
  440. list.Append(newListElement(fd, list, n, stack))
  441. return pref.ValueOf(list)
  442. case fd.IsMap():
  443. mapv := m.New().Mutable(fd).Map()
  444. if n == 0 {
  445. return pref.ValueOf(mapv)
  446. }
  447. mapv.Set(newMapKey(fd, 0), newMapValue(fd, mapv, 0, stack))
  448. mapv.Set(newMapKey(fd, minVal), newMapValue(fd, mapv, minVal, stack))
  449. mapv.Set(newMapKey(fd, maxVal), newMapValue(fd, mapv, maxVal, stack))
  450. mapv.Set(newMapKey(fd, n), newMapValue(fd, mapv, 10*n, stack))
  451. return pref.ValueOf(mapv)
  452. case fd.Message() != nil:
  453. return populateMessage(m.Mutable(fd).Message(), n, stack)
  454. default:
  455. return newScalarValue(fd, n)
  456. }
  457. }
  458. func newListElement(fd pref.FieldDescriptor, list pref.List, n seed, stack []pref.MessageDescriptor) pref.Value {
  459. if fd.Message() == nil {
  460. return newScalarValue(fd, n)
  461. }
  462. return populateMessage(list.NewMessage(), n, stack)
  463. }
  464. func newMapKey(fd pref.FieldDescriptor, n seed) pref.MapKey {
  465. kd := fd.MapKey()
  466. return newScalarValue(kd, n).MapKey()
  467. }
  468. func newMapValue(fd pref.FieldDescriptor, mapv pref.Map, n seed, stack []pref.MessageDescriptor) pref.Value {
  469. vd := fd.MapValue()
  470. if vd.Message() == nil {
  471. return newScalarValue(vd, n)
  472. }
  473. return populateMessage(mapv.NewMessage(), n, stack)
  474. }
  475. func newScalarValue(fd pref.FieldDescriptor, n seed) pref.Value {
  476. switch fd.Kind() {
  477. case pref.BoolKind:
  478. return pref.ValueOf(n != 0)
  479. case pref.EnumKind:
  480. // TODO: use actual value
  481. return pref.ValueOf(pref.EnumNumber(n))
  482. case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
  483. switch n {
  484. case minVal:
  485. return pref.ValueOf(int32(math.MinInt32))
  486. case maxVal:
  487. return pref.ValueOf(int32(math.MaxInt32))
  488. default:
  489. return pref.ValueOf(int32(n))
  490. }
  491. case pref.Uint32Kind, pref.Fixed32Kind:
  492. switch n {
  493. case minVal:
  494. // Only use 0 for the zero value.
  495. return pref.ValueOf(uint32(1))
  496. case maxVal:
  497. return pref.ValueOf(uint32(math.MaxInt32))
  498. default:
  499. return pref.ValueOf(uint32(n))
  500. }
  501. case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
  502. switch n {
  503. case minVal:
  504. return pref.ValueOf(int64(math.MinInt64))
  505. case maxVal:
  506. return pref.ValueOf(int64(math.MaxInt64))
  507. default:
  508. return pref.ValueOf(int64(n))
  509. }
  510. case pref.Uint64Kind, pref.Fixed64Kind:
  511. switch n {
  512. case minVal:
  513. // Only use 0 for the zero value.
  514. return pref.ValueOf(uint64(1))
  515. case maxVal:
  516. return pref.ValueOf(uint64(math.MaxInt64))
  517. default:
  518. return pref.ValueOf(uint64(n))
  519. }
  520. case pref.FloatKind:
  521. switch n {
  522. case minVal:
  523. return pref.ValueOf(float32(math.SmallestNonzeroFloat32))
  524. case maxVal:
  525. return pref.ValueOf(float32(math.MaxFloat32))
  526. default:
  527. return pref.ValueOf(1.5 * float32(n))
  528. }
  529. case pref.DoubleKind:
  530. switch n {
  531. case minVal:
  532. return pref.ValueOf(float64(math.SmallestNonzeroFloat64))
  533. case maxVal:
  534. return pref.ValueOf(float64(math.MaxFloat64))
  535. default:
  536. return pref.ValueOf(1.5 * float64(n))
  537. }
  538. case pref.StringKind:
  539. if n == 0 {
  540. return pref.ValueOf("")
  541. }
  542. return pref.ValueOf(fmt.Sprintf("%d", n))
  543. case pref.BytesKind:
  544. if n == 0 {
  545. return pref.ValueOf([]byte(nil))
  546. }
  547. return pref.ValueOf([]byte{byte(n >> 24), byte(n >> 16), byte(n >> 8), byte(n)})
  548. }
  549. panic("unhandled kind")
  550. }
  551. func populateMessage(m pref.Message, n seed, stack []pref.MessageDescriptor) pref.Value {
  552. if n == 0 {
  553. return pref.ValueOf(m)
  554. }
  555. md := m.Descriptor()
  556. for _, x := range stack {
  557. if md == x {
  558. return pref.ValueOf(m)
  559. }
  560. }
  561. stack = append(stack, md)
  562. for i := 0; i < md.Fields().Len(); i++ {
  563. fd := md.Fields().Get(i)
  564. if fd.IsWeak() {
  565. continue
  566. }
  567. m.Set(fd, newValue(m, fd, 10*n+seed(i), stack))
  568. }
  569. return pref.ValueOf(m)
  570. }
  571. func panics(f func()) (didPanic bool) {
  572. defer func() {
  573. if err := recover(); err != nil {
  574. didPanic = true
  575. }
  576. }()
  577. f()
  578. return false
  579. }