// Copyright 2018 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package fragmentation

import (
	"math"
	"reflect"
	"testing"
)

type updateHolesInput struct {
	first uint16
	last  uint16
	more  bool
}

var holesTestCases = []struct {
	comment string
	in      []updateHolesInput
	want    []hole
}{
	{
		comment: "No fragments. Expected holes: {[0 -> inf]}.",
		in:      []updateHolesInput{},
		want:    []hole{{first: 0, last: math.MaxUint16, deleted: false}},
	},
	{
		comment: "One fragment at beginning. Expected holes: {[2, inf]}.",
		in:      []updateHolesInput{{first: 0, last: 1, more: true}},
		want: []hole{
			{first: 0, last: math.MaxUint16, deleted: true},
			{first: 2, last: math.MaxUint16, deleted: false},
		},
	},
	{
		comment: "One fragment in the middle. Expected holes: {[0, 0], [3, inf]}.",
		in:      []updateHolesInput{{first: 1, last: 2, more: true}},
		want: []hole{
			{first: 0, last: math.MaxUint16, deleted: true},
			{first: 0, last: 0, deleted: false},
			{first: 3, last: math.MaxUint16, deleted: false},
		},
	},
	{
		comment: "One fragment at the end. Expected holes: {[0, 0]}.",
		in:      []updateHolesInput{{first: 1, last: 2, more: false}},
		want: []hole{
			{first: 0, last: math.MaxUint16, deleted: true},
			{first: 0, last: 0, deleted: false},
		},
	},
	{
		comment: "One fragment completing a packet. Expected holes: {}.",
		in:      []updateHolesInput{{first: 0, last: 1, more: false}},
		want: []hole{
			{first: 0, last: math.MaxUint16, deleted: true},
		},
	},
	{
		comment: "Two non-overlapping fragments completing a packet. Expected holes: {}.",
		in: []updateHolesInput{
			{first: 0, last: 1, more: true},
			{first: 2, last: 3, more: false},
		},
		want: []hole{
			{first: 0, last: math.MaxUint16, deleted: true},
			{first: 2, last: math.MaxUint16, deleted: true},
		},
	},
	{
		comment: "Two overlapping fragments completing a packet. Expected holes: {}.",
		in: []updateHolesInput{
			{first: 0, last: 2, more: true},
			{first: 2, last: 3, more: false},
		},
		want: []hole{
			{first: 0, last: math.MaxUint16, deleted: true},
			{first: 3, last: math.MaxUint16, deleted: true},
		},
	},
}

func TestUpdateHoles(t *testing.T) {
	for _, c := range holesTestCases {
		r := newReassembler(0)
		for _, i := range c.in {
			r.updateHoles(i.first, i.last, i.more)
		}
		if !reflect.DeepEqual(r.holes, c.want) {
			t.Errorf("Test \"%s\" produced unexepetced holes. Got %v. Want %v", c.comment, r.holes, c.want)
		}
	}
}
