Skip to content

Commit

Permalink
more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
gaissmai committed Jul 27, 2022
1 parent ddce6b5 commit 8db278f
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 19 deletions.
28 changes: 11 additions & 17 deletions iprange.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,17 +234,11 @@ func Merge(in []IPRange) (out []IPRange) {
}

func (a IPRange) isDisjunct(b IPRange) bool {
if a.last.Less(b.first) || b.last.Less(a.first) {
return true
}
return false
return a.last.Less(b.first) || b.last.Less(a.first)
}

func (a IPRange) covers(b IPRange) bool {
if a.first.Compare(b.first) <= 0 && a.last.Compare(b.last) >= 0 {
return true
}
return false
return a.first.Compare(b.first) <= 0 && a.last.Compare(b.last) >= 0
}

// Remove the slice of IPRanges from receiver, returns the remaining IPRanges.
Expand All @@ -268,23 +262,23 @@ func (r IPRange) Remove(in []IPRange) (out []IPRange) {
return []IPRange{r}
}

for _, d := range merged {
for _, m := range merged {
// case order is important!
switch {
case d.isDisjunct(r):
case m.isDisjunct(r):
// no-op
continue
case d.covers(r):
// d covers r, d masks the rest
case m.covers(r):
// m covers r, m masks the rest
return out
case d.first.Compare(r.first) <= 0:
case m.first.Compare(r.first) <= 0:
// left overlap, move cursor
r.first = d.last.Next()
case d.first.Compare(r.first) > 0:
r.first = m.last.Next()
case m.first.Compare(r.first) > 0:
// right overlap, save [r.first, d.first-1)
out = append(out, IPRange{r.first, d.first.Prev()})
out = append(out, IPRange{r.first, m.first.Prev()})
// new r, (d.last, r.last]
r.first = d.last.Next()
r.first = m.last.Next()
default:
panic("logic error")
}
Expand Down
25 changes: 23 additions & 2 deletions iprange_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,12 @@ func TestFromPrefix(t *testing.T) {
t.Fatalf("FromPrefix(%s), want: (%s, %s), got: (%s, %s)", tt.pfx, tt.first, tt.last, first, last)
}
}

// corner case
r, err := iprange.FromNetipPrefix(netip.Prefix{})
if r.IsValid() || err == nil {
t.Fatalf("FomPrefix() of invalid prefix, want: inavlid range and error, got: (%v, %v)", r, err)
}
}

func TestMerge(t *testing.T) {
Expand Down Expand Up @@ -294,13 +300,28 @@ func TestRemoveCornerCases(t *testing.T) {
t.Errorf("Remove(self), got %v, want nil", rs)
}

// disjunct
// disjunct after
r = mustParseIPRange("10.0.0.0/16")
rs = r.Remove([]iprange.IPRange{mustParseIPRange("::/0")})
if rs[0] != r {
t.Errorf("Remove(disjunct), got %v, want %v", rs, []iprange.IPRange{r})
}

// disjunct before
r = mustParseIPRange("::/0")
rs = r.Remove([]iprange.IPRange{mustParseIPRange("0.0.0.0/0")})
if rs[0] != r {
t.Errorf("Remove(disjunct), got %v, want %v", rs, []iprange.IPRange{r})
}

// disjunct in loop
r = mustParseIPRange("0.0.0.0/0")
rs = r.Remove([]iprange.IPRange{mustParseIPRange("0.0.0.0/1"), mustParseIPRange("::/0")})
wantRs := []iprange.IPRange{mustParseIPRange("128.0.0.0/1")}
if !reflect.DeepEqual(rs, wantRs) {
t.Errorf("Remove(...), got %v, want %v", rs, wantRs)
}

// covers
r = mustParseIPRange("10.0.0.0/16")
rs = r.Remove([]iprange.IPRange{mustParseIPRange("10.0.0.0/8")})
Expand Down Expand Up @@ -842,7 +863,7 @@ func TestCompareUpper(t *testing.T) {
}

got = tt.r2.CompareUpper(tt.r1)
if -1*got != tt.want {
if -1*(got) != tt.want {
t.Fatalf("(%s).CompareLower(%s), want: %v, got: %v\n", tt.r2, tt.r1, tt.want, -1*got)
}
}
Expand Down

0 comments on commit 8db278f

Please sign in to comment.