aboutsummaryrefslogblamecommitdiffstats
path: root/swarm/network/stream/intervals/intervals_test.go
blob: b5212f0d917fbf5b86a8bf5613b061205ad270b9 (plain) (tree)










































































































































































































































































































































































































                                                                                                            
// Copyright 2018 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.

package intervals

import "testing"

// Test tests Interval methods Add, Next and Last for various
// initial state.
func Test(t *testing.T) {
    for i, tc := range []struct {
        startLimit uint64
        initial    [][2]uint64
        start      uint64
        end        uint64
        expected   string
        nextStart  uint64
        nextEnd    uint64
        last       uint64
    }{
        {
            initial:   nil,
            start:     0,
            end:       0,
            expected:  "[[0 0]]",
            nextStart: 1,
            nextEnd:   0,
            last:      0,
        },
        {
            initial:   nil,
            start:     0,
            end:       10,
            expected:  "[[0 10]]",
            nextStart: 11,
            nextEnd:   0,
            last:      10,
        },
        {
            initial:   nil,
            start:     5,
            end:       15,
            expected:  "[[5 15]]",
            nextStart: 0,
            nextEnd:   4,
            last:      15,
        },
        {
            initial:   [][2]uint64{{0, 0}},
            start:     0,
            end:       0,
            expected:  "[[0 0]]",
            nextStart: 1,
            nextEnd:   0,
            last:      0,
        },
        {
            initial:   [][2]uint64{{0, 0}},
            start:     5,
            end:       15,
            expected:  "[[0 0] [5 15]]",
            nextStart: 1,
            nextEnd:   4,
            last:      15,
        },
        {
            initial:   [][2]uint64{{5, 15}},
            start:     5,
            end:       15,
            expected:  "[[5 15]]",
            nextStart: 0,
            nextEnd:   4,
            last:      15,
        },
        {
            initial:   [][2]uint64{{5, 15}},
            start:     5,
            end:       20,
            expected:  "[[5 20]]",
            nextStart: 0,
            nextEnd:   4,
            last:      20,
        },
        {
            initial:   [][2]uint64{{5, 15}},
            start:     10,
            end:       20,
            expected:  "[[5 20]]",
            nextStart: 0,
            nextEnd:   4,
            last:      20,
        },
        {
            initial:   [][2]uint64{{5, 15}},
            start:     0,
            end:       20,
            expected:  "[[0 20]]",
            nextStart: 21,
            nextEnd:   0,
            last:      20,
        },
        {
            initial:   [][2]uint64{{5, 15}},
            start:     2,
            end:       10,
            expected:  "[[2 15]]",
            nextStart: 0,
            nextEnd:   1,
            last:      15,
        },
        {
            initial:   [][2]uint64{{5, 15}},
            start:     2,
            end:       4,
            expected:  "[[2 15]]",
            nextStart: 0,
            nextEnd:   1,
            last:      15,
        },
        {
            initial:   [][2]uint64{{5, 15}},
            start:     2,
            end:       5,
            expected:  "[[2 15]]",
            nextStart: 0,
            nextEnd:   1,
            last:      15,
        },
        {
            initial:   [][2]uint64{{5, 15}},
            start:     2,
            end:       3,
            expected:  "[[2 3] [5 15]]",
            nextStart: 0,
            nextEnd:   1,
            last:      15,
        },
        {
            initial:   [][2]uint64{{5, 15}},
            start:     2,
            end:       4,
            expected:  "[[2 15]]",
            nextStart: 0,
            nextEnd:   1,
            last:      15,
        },
        {
            initial:   [][2]uint64{{0, 1}, {5, 15}},
            start:     2,
            end:       4,
            expected:  "[[0 15]]",
            nextStart: 16,
            nextEnd:   0,
            last:      15,
        },
        {
            initial:   [][2]uint64{{0, 5}, {15, 20}},
            start:     2,
            end:       10,
            expected:  "[[0 10] [15 20]]",
            nextStart: 11,
            nextEnd:   14,
            last:      20,
        },
        {
            initial:   [][2]uint64{{0, 5}, {15, 20}},
            start:     8,
            end:       18,
            expected:  "[[0 5] [8 20]]",
            nextStart: 6,
            nextEnd:   7,
            last:      20,
        },
        {
            initial:   [][2]uint64{{0, 5}, {15, 20}},
            start:     2,
            end:       17,
            expected:  "[[0 20]]",
            nextStart: 21,
            nextEnd:   0,
            last:      20,
        },
        {
            initial:   [][2]uint64{{0, 5}, {15, 20}},
            start:     2,
            end:       25,
            expected:  "[[0 25]]",
            nextStart: 26,
            nextEnd:   0,
            last:      25,
        },
        {
            initial:   [][2]uint64{{0, 5}, {15, 20}},
            start:     5,
            end:       14,
            expected:  "[[0 20]]",
            nextStart: 21,
            nextEnd:   0,
            last:      20,
        },
        {
            initial:   [][2]uint64{{0, 5}, {15, 20}},
            start:     6,
            end:       14,
            expected:  "[[0 20]]",
            nextStart: 21,
            nextEnd:   0,
            last:      20,
        },
        {
            initial:   [][2]uint64{{0, 5}, {15, 20}, {30, 40}},
            start:     6,
            end:       29,
            expected:  "[[0 40]]",
            nextStart: 41,
            nextEnd:   0,
            last:      40,
        },
        {
            initial:   [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}},
            start:     3,
            end:       55,
            expected:  "[[0 60]]",
            nextStart: 61,
            nextEnd:   0,
            last:      60,
        },
        {
            initial:   [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}},
            start:     21,
            end:       49,
            expected:  "[[0 5] [15 60]]",
            nextStart: 6,
            nextEnd:   14,
            last:      60,
        },
        {
            initial:   [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}},
            start:     0,
            end:       100,
            expected:  "[[0 100]]",
            nextStart: 101,
            nextEnd:   0,
            last:      100,
        },
        {
            startLimit: 100,
            initial:    nil,
            start:      0,
            end:        0,
            expected:   "[]",
            nextStart:  100,
            nextEnd:    0,
            last:       0,
        },
        {
            startLimit: 100,
            initial:    nil,
            start:      20,
            end:        30,
            expected:   "[]",
            nextStart:  100,
            nextEnd:    0,
            last:       0,
        },
        {
            startLimit: 100,
            initial:    nil,
            start:      50,
            end:        100,
            expected:   "[[100 100]]",
            nextStart:  101,
            nextEnd:    0,
            last:       100,
        },
        {
            startLimit: 100,
            initial:    nil,
            start:      50,
            end:        110,
            expected:   "[[100 110]]",
            nextStart:  111,
            nextEnd:    0,
            last:       110,
        },
        {
            startLimit: 100,
            initial:    nil,
            start:      120,
            end:        130,
            expected:   "[[120 130]]",
            nextStart:  100,
            nextEnd:    119,
            last:       130,
        },
        {
            startLimit: 100,
            initial:    nil,
            start:      120,
            end:        130,
            expected:   "[[120 130]]",
            nextStart:  100,
            nextEnd:    119,
            last:       130,
        },
    } {
        intervals := NewIntervals(tc.startLimit)
        intervals.ranges = tc.initial
        intervals.Add(tc.start, tc.end)
        got := intervals.String()
        if got != tc.expected {
            t.Errorf("interval #%d: expected %s, got %s", i, tc.expected, got)
        }
        nextStart, nextEnd := intervals.Next()
        if nextStart != tc.nextStart {
            t.Errorf("interval #%d, expected next start %d, got %d", i, tc.nextStart, nextStart)
        }
        if nextEnd != tc.nextEnd {
            t.Errorf("interval #%d, expected next end %d, got %d", i, tc.nextEnd, nextEnd)
        }
        last := intervals.Last()
        if last != tc.last {
            t.Errorf("interval #%d, expected last %d, got %d", i, tc.last, last)
        }
    }
}

func TestMerge(t *testing.T) {
    for i, tc := range []struct {
        initial  [][2]uint64
        merge    [][2]uint64
        expected string
    }{
        {
            initial:  nil,
            merge:    nil,
            expected: "[]",
        },
        {
            initial:  [][2]uint64{{10, 20}},
            merge:    nil,
            expected: "[[10 20]]",
        },
        {
            initial:  nil,
            merge:    [][2]uint64{{15, 25}},
            expected: "[[15 25]]",
        },
        {
            initial:  [][2]uint64{{0, 100}},
            merge:    [][2]uint64{{150, 250}},
            expected: "[[0 100] [150 250]]",
        },
        {
            initial:  [][2]uint64{{0, 100}},
            merge:    [][2]uint64{{101, 250}},
            expected: "[[0 250]]",
        },
        {
            initial:  [][2]uint64{{0, 10}, {30, 40}},
            merge:    [][2]uint64{{20, 25}, {41, 50}},
            expected: "[[0 10] [20 25] [30 50]]",
        },
        {
            initial:  [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}},
            merge:    [][2]uint64{{6, 25}},
            expected: "[[0 25] [30 40] [50 60]]",
        },
    } {
        intervals := NewIntervals(0)
        intervals.ranges = tc.initial
        m := NewIntervals(0)
        m.ranges = tc.merge

        intervals.Merge(m)

        got := intervals.String()
        if got != tc.expected {
            t.Errorf("interval #%d: expected %s, got %s", i, tc.expected, got)
        }
    }
}