id_test.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. package logid
  4. import (
  5. "math"
  6. "testing"
  7. "tailscale.com/tstest"
  8. "tailscale.com/util/must"
  9. )
  10. func TestIDs(t *testing.T) {
  11. id1, err := NewPrivateID()
  12. if err != nil {
  13. t.Fatal(err)
  14. }
  15. pub1 := id1.Public()
  16. id2, err := NewPrivateID()
  17. if err != nil {
  18. t.Fatal(err)
  19. }
  20. pub2 := id2.Public()
  21. if id1 == id2 {
  22. t.Fatalf("subsequent private IDs match: %v", id1)
  23. }
  24. if pub1 == pub2 {
  25. t.Fatalf("subsequent public IDs match: %v", id1)
  26. }
  27. if id1.String() == id2.String() {
  28. t.Fatalf("id1.String()=%v equals id2.String()", id1.String())
  29. }
  30. if pub1.String() == pub2.String() {
  31. t.Fatalf("pub1.String()=%v equals pub2.String()", pub1.String())
  32. }
  33. id1txt, err := id1.MarshalText()
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. var id3 PrivateID
  38. if err := id3.UnmarshalText(id1txt); err != nil {
  39. t.Fatal(err)
  40. }
  41. if id1 != id3 {
  42. t.Fatalf("id1 %v: marshal and unmarshal gives different key: %v", id1, id3)
  43. }
  44. if want, got := id1.Public(), id3.Public(); want != got {
  45. t.Fatalf("id1.Public()=%v does not match id3.Public()=%v", want, got)
  46. }
  47. if id1.String() != id3.String() {
  48. t.Fatalf("id1.String()=%v does not match id3.String()=%v", id1.String(), id3.String())
  49. }
  50. if id3, err := ParsePublicID(id1.Public().String()); err != nil {
  51. t.Errorf("ParsePublicID: %v", err)
  52. } else if id1.Public() != id3 {
  53. t.Errorf("ParsePublicID mismatch")
  54. }
  55. id4, err := ParsePrivateID(id1.String())
  56. if err != nil {
  57. t.Fatalf("failed to ParsePrivateID(%q): %v", id1.String(), err)
  58. }
  59. if id1 != id4 {
  60. t.Fatalf("ParsePrivateID returned different id")
  61. }
  62. hexString := "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
  63. hexBytes := []byte(hexString)
  64. if err := tstest.MinAllocsPerRun(t, 0, func() {
  65. ParsePrivateID(hexString)
  66. new(PrivateID).UnmarshalText(hexBytes)
  67. ParsePublicID(hexString)
  68. new(PublicID).UnmarshalText(hexBytes)
  69. }); err != nil {
  70. t.Fatal(err)
  71. }
  72. }
  73. func TestAdd(t *testing.T) {
  74. tests := []struct {
  75. in string
  76. add int64
  77. want string
  78. }{{
  79. in: "0000000000000000000000000000000000000000000000000000000000000000",
  80. add: 0,
  81. want: "0000000000000000000000000000000000000000000000000000000000000000",
  82. }, {
  83. in: "0000000000000000000000000000000000000000000000000000000000000000",
  84. add: 1,
  85. want: "0000000000000000000000000000000000000000000000000000000000000001",
  86. }, {
  87. in: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
  88. add: 1,
  89. want: "0000000000000000000000000000000000000000000000000000000000000000",
  90. }, {
  91. in: "0000000000000000000000000000000000000000000000000000000000000000",
  92. add: -1,
  93. want: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
  94. }, {
  95. in: "0000000000000000000000000000000000000000000000000000000000000000",
  96. add: math.MinInt64,
  97. want: "ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000",
  98. }, {
  99. in: "000000000000000000000000000000000000000000000000ffffffffffffffff",
  100. add: math.MinInt64,
  101. want: "0000000000000000000000000000000000000000000000007fffffffffffffff",
  102. }, {
  103. in: "0000000000000000000000000000000000000000000000000000000000000000",
  104. add: math.MaxInt64,
  105. want: "0000000000000000000000000000000000000000000000007fffffffffffffff",
  106. }, {
  107. in: "0000000000000000000000000000000000000000000000007fffffffffffffff",
  108. add: math.MaxInt64,
  109. want: "000000000000000000000000000000000000000000000000fffffffffffffffe",
  110. }, {
  111. in: "000000000000000000000000000000000000000000000000ffffffffffffffff",
  112. add: 1,
  113. want: "0000000000000000000000000000000000000000000000010000000000000000",
  114. }, {
  115. in: "00000000000000000000000000000000fffffffffffffffffffffffffffffffe",
  116. add: 3,
  117. want: "0000000000000000000000000000000100000000000000000000000000000001",
  118. }, {
  119. in: "0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffd",
  120. add: 5,
  121. want: "0000000000000001000000000000000000000000000000000000000000000002",
  122. }, {
  123. in: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc",
  124. add: 7,
  125. want: "0000000000000000000000000000000000000000000000000000000000000003",
  126. }, {
  127. in: "ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000",
  128. add: -1,
  129. want: "fffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffff",
  130. }, {
  131. in: "ffffffffffffffffffffffffffffffff00000000000000000000000000000001",
  132. add: -3,
  133. want: "fffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffe",
  134. }, {
  135. in: "ffffffffffffffff000000000000000000000000000000000000000000000002",
  136. add: -5,
  137. want: "fffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffd",
  138. }, {
  139. in: "0000000000000000000000000000000000000000000000000000000000000003",
  140. add: -7,
  141. want: "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc",
  142. }}
  143. for _, tt := range tests {
  144. in := must.Get(ParsePublicID(tt.in))
  145. want := must.Get(ParsePublicID(tt.want))
  146. got := in.Add(tt.add)
  147. if got != want {
  148. t.Errorf("%s.Add(%d):\n\tgot %s\n\twant %s", in, tt.add, got, want)
  149. }
  150. if tt.add != math.MinInt64 {
  151. got = got.Add(-tt.add)
  152. if got != in {
  153. t.Errorf("%s.Add(%d):\n\tgot %s\n\twant %s", want, -tt.add, got, in)
  154. }
  155. }
  156. }
  157. }