github.com/ethersphere/bee/v2@v2.2.0/pkg/puller/intervalstore/intervals_test.go (about) 1 // Copyright 2018 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package intervalstore 18 19 import ( 20 "math" 21 "testing" 22 ) 23 24 // Test tests Interval methods Add, Next and Last for various 25 // initial state. 26 func Test(t *testing.T) { 27 t.Parallel() 28 29 for i, tc := range []struct { 30 startLimit uint64 31 initial [][2]uint64 32 start uint64 33 end uint64 34 expected string 35 nextStart uint64 36 nextEnd uint64 37 nextEmptyRange bool 38 last uint64 39 ceiling uint64 40 }{ 41 { 42 initial: nil, 43 start: 0, 44 end: 0, 45 expected: "[[0 0]]", 46 nextStart: 1, 47 nextEnd: 0, 48 last: 0, 49 }, 50 { 51 initial: nil, 52 start: 0, 53 end: 10, 54 expected: "[[0 10]]", 55 nextStart: 11, 56 nextEnd: 0, 57 last: 10, 58 }, 59 { 60 initial: nil, 61 start: 5, 62 end: 15, 63 expected: "[[5 15]]", 64 nextStart: 0, 65 nextEnd: 4, 66 last: 15, 67 }, 68 { 69 initial: [][2]uint64{{0, 0}}, 70 start: 0, 71 end: 0, 72 expected: "[[0 0]]", 73 nextStart: 1, 74 nextEnd: 0, 75 last: 0, 76 }, 77 { 78 initial: [][2]uint64{{0, 0}}, 79 start: 5, 80 end: 15, 81 expected: "[[0 0] [5 15]]", 82 nextStart: 1, 83 nextEnd: 4, 84 last: 15, 85 }, 86 { 87 initial: [][2]uint64{{5, 15}}, 88 start: 5, 89 end: 15, 90 expected: "[[5 15]]", 91 nextStart: 0, 92 nextEnd: 4, 93 last: 15, 94 }, 95 { 96 initial: [][2]uint64{{5, 15}}, 97 start: 5, 98 end: 20, 99 expected: "[[5 20]]", 100 nextStart: 0, 101 nextEnd: 4, 102 last: 20, 103 }, 104 { 105 initial: [][2]uint64{{5, 15}}, 106 start: 10, 107 end: 20, 108 expected: "[[5 20]]", 109 nextStart: 0, 110 nextEnd: 4, 111 last: 20, 112 }, 113 { 114 initial: [][2]uint64{{5, 15}}, 115 start: 0, 116 end: 20, 117 expected: "[[0 20]]", 118 nextStart: 21, 119 nextEnd: 0, 120 last: 20, 121 }, 122 { 123 initial: [][2]uint64{{5, 15}}, 124 start: 2, 125 end: 10, 126 expected: "[[2 15]]", 127 nextStart: 0, 128 nextEnd: 1, 129 last: 15, 130 }, 131 { 132 initial: [][2]uint64{{5, 15}}, 133 start: 2, 134 end: 4, 135 expected: "[[2 15]]", 136 nextStart: 0, 137 nextEnd: 1, 138 last: 15, 139 }, 140 { 141 initial: [][2]uint64{{5, 15}}, 142 start: 2, 143 end: 5, 144 expected: "[[2 15]]", 145 nextStart: 0, 146 nextEnd: 1, 147 last: 15, 148 }, 149 { 150 initial: [][2]uint64{{5, 15}}, 151 start: 2, 152 end: 3, 153 expected: "[[2 3] [5 15]]", 154 nextStart: 0, 155 nextEnd: 1, 156 last: 15, 157 }, 158 { 159 initial: [][2]uint64{{5, 15}}, 160 start: 2, 161 end: 4, 162 expected: "[[2 15]]", 163 nextStart: 0, 164 nextEnd: 1, 165 last: 15, 166 }, 167 { 168 initial: [][2]uint64{{0, 1}, {5, 15}}, 169 start: 2, 170 end: 4, 171 expected: "[[0 15]]", 172 nextStart: 16, 173 nextEnd: 0, 174 last: 15, 175 }, 176 { 177 initial: [][2]uint64{{0, 5}, {15, 20}}, 178 start: 2, 179 end: 10, 180 expected: "[[0 10] [15 20]]", 181 nextStart: 11, 182 nextEnd: 14, 183 last: 20, 184 }, 185 { 186 initial: [][2]uint64{{0, 5}, {15, 20}}, 187 start: 8, 188 end: 18, 189 expected: "[[0 5] [8 20]]", 190 nextStart: 6, 191 nextEnd: 7, 192 last: 20, 193 }, 194 { 195 initial: [][2]uint64{{0, 5}, {15, 20}}, 196 start: 2, 197 end: 17, 198 expected: "[[0 20]]", 199 nextStart: 21, 200 nextEnd: 0, 201 last: 20, 202 }, 203 { 204 initial: [][2]uint64{{0, 5}, {15, 20}}, 205 start: 2, 206 end: 25, 207 expected: "[[0 25]]", 208 nextStart: 26, 209 nextEnd: 0, 210 last: 25, 211 }, 212 { 213 initial: [][2]uint64{{0, 5}, {15, 20}}, 214 start: 5, 215 end: 14, 216 expected: "[[0 20]]", 217 nextStart: 21, 218 nextEnd: 0, 219 last: 20, 220 }, 221 { 222 initial: [][2]uint64{{0, 5}, {15, 20}}, 223 start: 6, 224 end: 14, 225 expected: "[[0 20]]", 226 nextStart: 21, 227 nextEnd: 0, 228 last: 20, 229 }, 230 { 231 initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}}, 232 start: 6, 233 end: 29, 234 expected: "[[0 40]]", 235 nextStart: 41, 236 nextEnd: 0, 237 last: 40, 238 }, 239 { 240 initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, 241 start: 3, 242 end: 55, 243 expected: "[[0 60]]", 244 nextStart: 61, 245 nextEnd: 0, 246 last: 60, 247 }, 248 { 249 initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, 250 start: 21, 251 end: 49, 252 expected: "[[0 5] [15 60]]", 253 nextStart: 6, 254 nextEnd: 14, 255 last: 60, 256 }, 257 { 258 initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, 259 start: 0, 260 end: 100, 261 expected: "[[0 100]]", 262 nextStart: 101, 263 nextEnd: 0, 264 last: 100, 265 }, 266 { 267 startLimit: 100, 268 initial: nil, 269 start: 0, 270 end: 0, 271 expected: "[]", 272 nextStart: 100, 273 nextEnd: 0, 274 last: 0, 275 }, 276 { 277 startLimit: 100, 278 initial: nil, 279 start: 20, 280 end: 30, 281 expected: "[]", 282 nextStart: 100, 283 nextEnd: 0, 284 last: 0, 285 }, 286 { 287 startLimit: 100, 288 initial: nil, 289 start: 50, 290 end: 100, 291 expected: "[[100 100]]", 292 nextStart: 101, 293 nextEnd: 0, 294 last: 100, 295 }, 296 { 297 startLimit: 100, 298 initial: nil, 299 start: 50, 300 end: 110, 301 expected: "[[100 110]]", 302 nextStart: 111, 303 nextEnd: 0, 304 last: 110, 305 }, 306 { 307 startLimit: 100, 308 initial: nil, 309 start: 120, 310 end: 130, 311 expected: "[[120 130]]", 312 nextStart: 100, 313 nextEnd: 119, 314 last: 130, 315 }, 316 { 317 startLimit: 100, 318 initial: nil, 319 start: 120, 320 end: 130, 321 expected: "[[120 130]]", 322 nextStart: 100, 323 nextEnd: 119, 324 last: 130, 325 }, 326 { 327 initial: nil, 328 start: 0, 329 end: 0, 330 expected: "[[0 0]]", 331 nextStart: 1, 332 nextEnd: 10, 333 last: 0, 334 ceiling: 10, 335 }, 336 { 337 initial: nil, 338 start: 0, 339 end: 9, 340 expected: "[[0 9]]", 341 nextStart: 9, 342 nextEnd: 9, 343 nextEmptyRange: true, 344 last: 9, 345 ceiling: 9, 346 }, 347 { 348 initial: nil, 349 start: 0, 350 end: 9, 351 expected: "[[0 9]]", 352 nextStart: 10, 353 nextEnd: 10, 354 nextEmptyRange: false, 355 last: 9, 356 ceiling: 10, 357 }, 358 { 359 initial: nil, 360 start: 0, 361 end: 10, 362 expected: "[[0 10]]", 363 nextStart: 11, 364 nextEnd: 15, 365 last: 10, 366 ceiling: 15, 367 }, 368 { 369 initial: [][2]uint64{{0, 0}}, 370 start: 5, 371 end: 15, 372 expected: "[[0 0] [5 15]]", 373 nextStart: 1, 374 nextEnd: 3, 375 last: 15, 376 ceiling: 3, 377 }, 378 { 379 initial: [][2]uint64{{0, 0}}, 380 start: 5, 381 end: 15, 382 expected: "[[0 0] [5 15]]", 383 nextStart: 1, 384 nextEnd: 4, 385 last: 15, 386 ceiling: 20, 387 }, 388 { 389 startLimit: 100, 390 initial: nil, 391 start: 120, 392 end: 130, 393 expected: "[[120 130]]", 394 nextStart: 100, 395 nextEnd: 110, 396 last: 130, 397 ceiling: 110, 398 }, 399 } { 400 intervals := NewIntervals(tc.startLimit) 401 intervals.ranges = tc.initial 402 intervals.Add(tc.start, tc.end) 403 got := intervals.String() 404 if got != tc.expected { 405 t.Errorf("interval #%d: expected %s, got %s", i, tc.expected, got) 406 } 407 nextStart, nextEnd, nextEmptyRange := intervals.Next(tc.ceiling) 408 if nextStart != tc.nextStart { 409 t.Errorf("interval #%d, expected next start %d, got %d", i, tc.nextStart, nextStart) 410 } 411 if nextEnd != tc.nextEnd { 412 t.Errorf("interval #%d, expected next end %d, got %d", i, tc.nextEnd, nextEnd) 413 } 414 if nextEmptyRange != tc.nextEmptyRange { 415 t.Errorf("interval #%d, expected empty range %v, got %v", i, tc.nextEmptyRange, nextEmptyRange) 416 } 417 last := intervals.Last() 418 if last != tc.last { 419 t.Errorf("interval #%d, expected last %d, got %d", i, tc.last, last) 420 } 421 } 422 } 423 424 func TestMerge(t *testing.T) { 425 t.Parallel() 426 427 for i, tc := range []struct { 428 initial [][2]uint64 429 merge [][2]uint64 430 expected string 431 }{ 432 { 433 initial: nil, 434 merge: nil, 435 expected: "[]", 436 }, 437 { 438 initial: [][2]uint64{{10, 20}}, 439 merge: nil, 440 expected: "[[10 20]]", 441 }, 442 { 443 initial: nil, 444 merge: [][2]uint64{{15, 25}}, 445 expected: "[[15 25]]", 446 }, 447 { 448 initial: [][2]uint64{{0, 100}}, 449 merge: [][2]uint64{{150, 250}}, 450 expected: "[[0 100] [150 250]]", 451 }, 452 { 453 initial: [][2]uint64{{0, 100}}, 454 merge: [][2]uint64{{101, 250}}, 455 expected: "[[0 250]]", 456 }, 457 { 458 initial: [][2]uint64{{0, 10}, {30, 40}}, 459 merge: [][2]uint64{{20, 25}, {41, 50}}, 460 expected: "[[0 10] [20 25] [30 50]]", 461 }, 462 { 463 initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, 464 merge: [][2]uint64{{6, 25}}, 465 expected: "[[0 25] [30 40] [50 60]]", 466 }, 467 } { 468 intervals := NewIntervals(0) 469 intervals.ranges = tc.initial 470 m := NewIntervals(0) 471 m.ranges = tc.merge 472 473 intervals.Merge(m) 474 475 got := intervals.String() 476 if got != tc.expected { 477 t.Errorf("interval #%d: expected %s, got %s", i, tc.expected, got) 478 } 479 } 480 } 481 482 // TestMaxUint64 is a regression test to verify that interval 483 // is handled correctly at the edges. 484 func TestMaxUint64(t *testing.T) { 485 t.Parallel() 486 487 intervals := NewIntervals(1) 488 intervals.Add(math.MaxUint64-1, math.MaxUint64) 489 intervals.Add(1, math.MaxUint64) 490 intervals.Add(2, math.MaxUint64) 491 intervals.Add(math.MaxUint64, math.MaxUint64) 492 wantstr := "[[1 18446744073709551615]]" 493 if s := intervals.String(); s != wantstr { 494 t.Fatalf("got interval string '%s' want '%s'", s, wantstr) 495 } 496 } 497 498 // TestEdgeBugUnmarshal is a regression test for the bug that 499 // created incorrect intervals at the edges. It checks that the 500 // serialized interval recovers from the error of multiple duplicate 501 // intervals serialized sequentially. 502 func TestEdgeBugUnmarshal(t *testing.T) { 503 t.Parallel() 504 505 str := "1;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;1,3w5e11264sgsf;50an,3w5e11264sgsf;1,3w5e11264sgsf;1,50am" 506 intervals := new(Intervals) 507 err := intervals.UnmarshalBinary([]byte(str)) 508 if err != nil { 509 t.Fatal(err) 510 } 511 wantstr := "[[1 18446744073709551615]]" 512 if s := intervals.String(); s != wantstr { 513 t.Fatalf("got interval string '%s' want '%s'", s, wantstr) 514 } 515 }