aboutsummaryrefslogtreecommitdiff
path: root/test/tree_bitmap_test.exs
blob: 5c4f39ef673699ea99130bec12c0146711d4cd6e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
defmodule TreeBitmapTest do
  use ExUnit.Case
  alias RoutingTable.TreeBitmap

  test "new/0" do
    table = TreeBitmap.new()
    assert is_reference(table)
  end

  test "memory/1" do
    table = TreeBitmap.new()
    assert {1200, 1152} == TreeBitmap.memory(table)
    {:ok, _} = TreeBitmap.add(table, {:inet4, 192, 168, 1, 0}, 24, 0)
    assert {1248, 1168} == TreeBitmap.memory(table)
  end

  test "new_with_capacity/1" do
    table = TreeBitmap.new_with_capacity(1000)
    assert is_reference(table)
    assert {109152, 37152} = TreeBitmap.memory(table)
  end

  test "length/1" do
    table = TreeBitmap.new()
    assert 0 == TreeBitmap.length(table)
  end

  test "add/4 and longest_match/2" do
    table = TreeBitmap.new()
    assert {:ok, _} = TreeBitmap.add(table, {:inet4, 192, 168, 1, 0}, 24, 0)
    assert {:ok, _, 24, 0} = TreeBitmap.longest_match(table, {:inet4, 192, 168, 1, 1})
    assert {:ok, nil} = TreeBitmap.longest_match(table, {:inet4, 1, 1, 1, 1})
  end

  test "add/2 existing" do
    table = TreeBitmap.new()
    {:ok, nil} = TreeBitmap.add(table, {:inet4, 10, 69, 0, 0}, 16, 0)
    assert {:ok, 0} = TreeBitmap.add(table, {:inet4, 10, 69, 0, 0}, 16, 1)
    assert {:ok, _, _, 1} = TreeBitmap.longest_match(table, {:inet4, 10, 69, 1, 1})
  end

  test "remove/3" do
    table = TreeBitmap.new()
    {:ok, _} = TreeBitmap.add(table, {:inet4, 192, 168, 1, 0}, 24, 0)
    assert {:ok, 0} == TreeBitmap.remove(table, {:inet4, 192, 168, 1, 0}, 24)
    assert {:ok, nil} = TreeBitmap.longest_match(table, {:inet4, 192, 168, 1, 1})
  end

  test "exact_match/3" do
    table = TreeBitmap.new()
    {:ok, _} = TreeBitmap.add(table, {:inet4, 192, 168, 1, 0}, 24, 0)
    assert {:ok, 0} = TreeBitmap.exact_match(table, {:inet4, 192, 168, 1, 0}, 24)
    assert {:ok, nil} = TreeBitmap.exact_match(table, {:inet4, 192, 168, 1, 1}, 32)
  end

  test "default route" do
    table = TreeBitmap.new()
    assert {:ok, nil} == TreeBitmap.add(table, {:inet4, 0, 0, 0, 0}, 0, 0)
    assert {:ok, _, 0, 0} = TreeBitmap.longest_match(table, {:inet4, 192, 168, 1, 1})
  end

  test "more to less specific" do
    table = TreeBitmap.new()
    {:ok, _} = TreeBitmap.add(table, {:inet4, 10, 69, 1, 0}, 24, 2)
    {:ok, _} = TreeBitmap.add(table, {:inet4, 10, 69, 0, 0}, 16, 1)
    {:ok, _} = TreeBitmap.add(table, {:inet4, 0, 0, 0, 0}, 0, 0)
    assert {:ok, _, _, 0} = TreeBitmap.longest_match(table, {:inet4, 8, 8, 8, 8})
    assert {:ok, _, _, 2} = TreeBitmap.longest_match(table, {:inet4, 10, 69, 1, 2})
    assert {:ok, _, _, 1} = TreeBitmap.longest_match(table, {:inet4, 10, 69, 2, 2})
  end

  test "less to more specific" do
    table = TreeBitmap.new()
    {:ok, _} = TreeBitmap.add(table, {:inet4, 0, 0, 0, 0}, 0, 0)
    {:ok, _} = TreeBitmap.add(table, {:inet4, 10, 69, 0, 0}, 16, 1)
    {:ok, _} = TreeBitmap.add(table, {:inet4, 10, 69, 1, 0}, 24, 2)
    assert {:ok, _, _, 0} = TreeBitmap.longest_match(table, {:inet4, 8, 8, 8, 8})
    assert {:ok, _, _, 2} = TreeBitmap.longest_match(table, {:inet4, 10, 69, 1, 2})
    assert {:ok, _, _, 1} = TreeBitmap.longest_match(table, {:inet4, 10, 69, 2, 2})
  end

  test "multiple routes" do
    table = TreeBitmap.new()
    {:ok, _} = TreeBitmap.add(table, {:inet4, 8, 8, 8, 0}, 24, 8)
    {:ok, _} = TreeBitmap.add(table, {:inet4, 1, 1, 0, 0}, 16, 1)
    {:ok, _} = TreeBitmap.add(table, {:inet4, 192, 168, 1, 1}, 32, 200)
    assert {:ok, _, _, 8} = TreeBitmap.longest_match(table, {:inet4, 8, 8, 8, 8})
    assert {:ok, _, _, 1} = TreeBitmap.longest_match(table, {:inet4, 1, 1, 0, 0})
    assert {:ok, _, _, 200} = TreeBitmap.longest_match(table, {:inet4, 192, 168, 1, 1})
  end

end