github.com/osrg/gobgp@v2.0.0+incompatible/pkg/server/rpki_test.go (about)

     1  // Copyright (C) 2015 Nippon Telegraph and Telephone Corporation.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //    http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    12  // implied.
    13  // See the License for the specific language governing permissions and
    14  // limitations under the License.
    15  
    16  package server
    17  
    18  import (
    19  	"net"
    20  	"strconv"
    21  	"strings"
    22  	"testing"
    23  
    24  	"github.com/osrg/gobgp/internal/pkg/config"
    25  	"github.com/osrg/gobgp/internal/pkg/table"
    26  	"github.com/osrg/gobgp/pkg/packet/bgp"
    27  
    28  	radix "github.com/armon/go-radix"
    29  	"github.com/stretchr/testify/assert"
    30  )
    31  
    32  func strToASParam(str string) *bgp.PathAttributeAsPath {
    33  	toList := func(asstr, sep string) []uint32 {
    34  		as := make([]uint32, 0)
    35  		l := strings.Split(asstr, sep)
    36  		for _, s := range l {
    37  			v, _ := strconv.ParseUint(s, 10, 32)
    38  			as = append(as, uint32(v))
    39  		}
    40  		return as
    41  	}
    42  	var atype uint8
    43  	var as []uint32
    44  	if strings.HasPrefix(str, "{") {
    45  		atype = bgp.BGP_ASPATH_ATTR_TYPE_SET
    46  		as = toList(str[1:len(str)-1], ",")
    47  	} else if strings.HasPrefix(str, "(") {
    48  		atype = bgp.BGP_ASPATH_ATTR_TYPE_CONFED_SET
    49  		as = toList(str[1:len(str)-1], " ")
    50  	} else {
    51  		atype = bgp.BGP_ASPATH_ATTR_TYPE_SEQ
    52  		as = toList(str, " ")
    53  	}
    54  
    55  	return bgp.NewPathAttributeAsPath([]bgp.AsPathParamInterface{bgp.NewAs4PathParam(atype, as)})
    56  }
    57  
    58  func validateOne(tree *radix.Tree, cidr, aspathStr string) config.RpkiValidationResultType {
    59  	r := validatePath(65500, tree, cidr, strToASParam(aspathStr))
    60  	return r.Status
    61  }
    62  
    63  func TestValidate0(t *testing.T) {
    64  	assert := assert.New(t)
    65  
    66  	manager, _ := newROAManager(0)
    67  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("192.168.0.0").To4(), 24, 32, 100, ""))
    68  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("192.168.0.0").To4(), 24, 24, 200, ""))
    69  
    70  	var r config.RpkiValidationResultType
    71  
    72  	tree := manager.Roas[bgp.RF_IPv4_UC]
    73  	r = validateOne(tree, "192.168.0.0/24", "100")
    74  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
    75  
    76  	r = validateOne(tree, "192.168.0.0/24", "100 200")
    77  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
    78  
    79  	r = validateOne(tree, "192.168.0.0/24", "300")
    80  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_INVALID)
    81  
    82  	r = validateOne(tree, "192.168.0.0/25", "100")
    83  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
    84  
    85  	r = validateOne(tree, "192.168.0.0/25", "200")
    86  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_INVALID)
    87  
    88  	r = validateOne(tree, "192.168.0.0/25", "300")
    89  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_INVALID)
    90  }
    91  
    92  func TestValidate1(t *testing.T) {
    93  	assert := assert.New(t)
    94  
    95  	manager, _ := newROAManager(0)
    96  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 16, 16, 65000, ""))
    97  
    98  	var r config.RpkiValidationResultType
    99  
   100  	tree := manager.Roas[bgp.RF_IPv4_UC]
   101  	r = validateOne(tree, "10.0.0.0/16", "65000")
   102  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
   103  
   104  	r = validateOne(tree, "10.0.0.0/16", "65001")
   105  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_INVALID)
   106  }
   107  
   108  func TestValidate2(t *testing.T) {
   109  	assert := assert.New(t)
   110  
   111  	manager, _ := newROAManager(0)
   112  
   113  	var r config.RpkiValidationResultType
   114  
   115  	tree := manager.Roas[bgp.RF_IPv4_UC]
   116  	r = validateOne(tree, "10.0.0.0/16", "65000")
   117  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND)
   118  
   119  	r = validateOne(tree, "10.0.0.0/16", "65001")
   120  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND)
   121  }
   122  
   123  func TestValidate3(t *testing.T) {
   124  	assert := assert.New(t)
   125  
   126  	manager, _ := newROAManager(0)
   127  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 16, 16, 65000, ""))
   128  
   129  	var r config.RpkiValidationResultType
   130  
   131  	tree := manager.Roas[bgp.RF_IPv4_UC]
   132  	r = validateOne(tree, "10.0.0.0/8", "65000")
   133  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND)
   134  
   135  	r = validateOne(tree, "10.0.0.0/17", "65000")
   136  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_INVALID)
   137  
   138  	manager, _ = newROAManager(0)
   139  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 16, 24, 65000, ""))
   140  
   141  	tree = manager.Roas[bgp.RF_IPv4_UC]
   142  	r = validateOne(tree, "10.0.0.0/17", "65000")
   143  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
   144  }
   145  
   146  func TestValidate4(t *testing.T) {
   147  	assert := assert.New(t)
   148  
   149  	manager, _ := newROAManager(0)
   150  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 16, 16, 65000, ""))
   151  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 16, 16, 65001, ""))
   152  
   153  	var r config.RpkiValidationResultType
   154  	tree := manager.Roas[bgp.RF_IPv4_UC]
   155  	r = validateOne(tree, "10.0.0.0/16", "65000")
   156  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
   157  
   158  	r = validateOne(tree, "10.0.0.0/16", "65001")
   159  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
   160  }
   161  
   162  func TestValidate5(t *testing.T) {
   163  	assert := assert.New(t)
   164  
   165  	manager, _ := newROAManager(0)
   166  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 17, 17, 65000, ""))
   167  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.128.0").To4(), 17, 17, 65000, ""))
   168  
   169  	var r config.RpkiValidationResultType
   170  	tree := manager.Roas[bgp.RF_IPv4_UC]
   171  	r = validateOne(tree, "10.0.0.0/16", "65000")
   172  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND)
   173  }
   174  
   175  func TestValidate6(t *testing.T) {
   176  	assert := assert.New(t)
   177  
   178  	manager, _ := newROAManager(0)
   179  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 8, 32, 0, ""))
   180  
   181  	var r config.RpkiValidationResultType
   182  	tree := manager.Roas[bgp.RF_IPv4_UC]
   183  	r = validateOne(tree, "10.0.0.0/7", "65000")
   184  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND)
   185  
   186  	r = validateOne(tree, "10.0.0.0/8", "65000")
   187  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_INVALID)
   188  
   189  	r = validateOne(tree, "10.0.0.0/24", "65000")
   190  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_INVALID)
   191  }
   192  
   193  func TestValidate7(t *testing.T) {
   194  	assert := assert.New(t)
   195  
   196  	manager, _ := newROAManager(0)
   197  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 16, 24, 65000, ""))
   198  
   199  	var r config.RpkiValidationResultType
   200  	tree := manager.Roas[bgp.RF_IPv4_UC]
   201  	r = validateOne(tree, "10.0.0.0/24", "{65000}")
   202  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND)
   203  
   204  	r = validateOne(tree, "10.0.0.0/24", "{65001}")
   205  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND)
   206  
   207  	r = validateOne(tree, "10.0.0.0/24", "{65000,65001}")
   208  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_NOT_FOUND)
   209  }
   210  
   211  func TestValidate8(t *testing.T) {
   212  	assert := assert.New(t)
   213  
   214  	manager, _ := newROAManager(0)
   215  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 16, 24, 0, ""))
   216  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 16, 24, 65000, ""))
   217  
   218  	var r config.RpkiValidationResultType
   219  	tree := manager.Roas[bgp.RF_IPv4_UC]
   220  	r = validateOne(tree, "10.0.0.0/24", "65000")
   221  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
   222  
   223  	r = validateOne(tree, "10.0.0.0/24", "65001")
   224  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_INVALID)
   225  }
   226  
   227  func TestValidate9(t *testing.T) {
   228  	assert := assert.New(t)
   229  
   230  	manager, _ := newROAManager(0)
   231  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 24, 24, 65000, ""))
   232  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 16, 24, 65001, ""))
   233  
   234  	var r config.RpkiValidationResultType
   235  	tree := manager.Roas[bgp.RF_IPv4_UC]
   236  	r = validateOne(tree, "10.0.0.0/24", "65000")
   237  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
   238  
   239  	r = validateOne(tree, "10.0.0.0/24", "65001")
   240  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
   241  }
   242  
   243  func TestValidate10(t *testing.T) {
   244  	assert := assert.New(t)
   245  
   246  	manager, _ := newROAManager(0)
   247  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 24, 24, 0, ""))
   248  	manager.addROA(table.NewROA(bgp.AFI_IP, net.ParseIP("10.0.0.0").To4(), 16, 24, 65001, ""))
   249  
   250  	var r config.RpkiValidationResultType
   251  	tree := manager.Roas[bgp.RF_IPv4_UC]
   252  	r = validateOne(tree, "10.0.0.0/24", "65000")
   253  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_INVALID)
   254  
   255  	r = validateOne(tree, "10.0.0.0/24", "65001")
   256  	assert.Equal(r, config.RPKI_VALIDATION_RESULT_TYPE_VALID)
   257  }