package cluster

import (
	"context"
	"net"
	"testing"

	"github.com/pingcap/dbaas/central/db/entity"
	"github.com/stretchr/testify/assert"
)

func TestIsPrivateCIDR(t *testing.T) {
	privateCIDRs := []string{"10.0.0.0/8", "192.168.0.0/16", "172.16.0.0/12"}
	notPrivateCIDRs := []string{"128.0.0.0/8", "11.0.0.0/8", "192.169.0.0/16", "170.254.0.0/16"}
	ctx := context.TODO()

	for _, ipAddr := range privateCIDRs {
		_, ipNet, err := net.ParseCIDR(ipAddr)

		assert.Nil(t, err)
		assert.Equal(t, true, isPrivateCIDR(ctx, ipNet))
	}

	for _, ipAddr := range notPrivateCIDRs {
		_, ipNet, err := net.ParseCIDR(ipAddr)

		assert.Nil(t, err)
		assert.Equal(t, false, isPrivateCIDR(ctx, ipNet))
	}
}

func TestIsValidProjectCIDR(t *testing.T) {
	validAWSCIDRs := []string{"192.168.0.0/16", "172.16.0.0/12", "10.0.0.0/11", "10.0.0.0/17"}
	validGCPCIDRs := []string{"192.168.0.0/16", "172.16.0.0/12", "172.16.0.0/17", "10.0.0.0/11", "10.0.0.0/8"}
	invalidAWSCIDRs := []string{"10.0.0.0/8", "10.0.0.0/10", "172.16.0.0/8", "8.8.8.0/24", "10.255.255.255/22", "10.0.0.0/18"}
	invalidGCPCIDRs := []string{"10.0.0.0/7", "172.0.0.0/7", "8.8.8.0/24", "10.255.255.255/22", "10.0.0.0/22"}
	ctx := context.TODO()

	for _, cidr := range validAWSCIDRs {
		assert.Nilf(t, isValidProjectCIDR(ctx, cidr, entity.Aws), cidr)
	}

	for _, cidr := range validGCPCIDRs {
		assert.Nilf(t, isValidProjectCIDR(ctx, cidr, entity.Gcp), cidr)
	}

	for _, cidr := range invalidAWSCIDRs {
		assert.NotNilf(t, isValidProjectCIDR(ctx, cidr, entity.Aws), cidr)
	}

	for _, cidr := range invalidGCPCIDRs {
		assert.NotNilf(t, isValidProjectCIDR(ctx, cidr, entity.Gcp), cidr)
	}
}
