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  }