aboutsummaryrefslogtreecommitdiff
path: root/test/tree_bitmap_test.exs
blob: aedf78ff28e57f5242f1544c34e66846b1c49081 (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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
defmodule TreeBitmapTest do
  use ExUnit.Case
  doctest TreeBitmap
  alias TreeBitmap.NIF
  alias TreeBitmap

  test "TreeBitmap" do
    t = TreeBitmap.new()
    assert nil == TreeBitmap.add(t, {192, 168, 1, 0}, 24, :lan)
    assert nil == TreeBitmap.add(t, {8193, 3512, 34211, 0, 0, 35374, 880, 1}, 64, :lan)

    assert %{value: :lan} = TreeBitmap.longest_match(t, {192, 168, 1, 2})
    assert true = TreeBitmap.longest_match?(t, {192, 168, 1, 2})
    assert %{value: :lan} = TreeBitmap.longest_match(t, {8193, 3512, 34211, 0, 0, 35374, 880, 29492})
    assert true = TreeBitmap.longest_match?(t, {8193, 3512, 34211, 0, 0, 35374, 880, 29492})

    assert :lan = TreeBitmap.exact_match(t, {192, 168, 1, 1}, 24)
    assert true = TreeBitmap.exact_match?(t, {192, 168, 1, 1}, 24)
    assert :lan = TreeBitmap.exact_match(t, {8193, 3512, 34211, 0, 0, 35374, 880, 29492}, 64)
    assert true = TreeBitmap.exact_match?(t, {8193, 3512, 34211, 0, 0, 35374, 880, 29492}, 64)

    assert nil == TreeBitmap.longest_match(t, {8, 8, 8, 8})
    assert false == TreeBitmap.longest_match?(t, {8, 8, 8, 8})
    assert nil == TreeBitmap.exact_match(t, {8, 8, 8, 8}, 32)
    assert false == TreeBitmap.exact_match?(t, {8, 8, 8, 8}, 32)

    assert %{ets: 335, inet4: {1248, 1168}, inet6: {1344, 1168}} = TreeBitmap.memory(t)

    assert %{ets: 3, inet4: 1, inet6: 1} = TreeBitmap.length(t)
    assert :lan = TreeBitmap.remove(t, {8193, 3512, 34211, 0, 0, 35374, 880, 1}, 64)
    assert nil == TreeBitmap.longest_match(t, {8193, 3512, 34211, 0, 0, 35374, 880, 29492})
    assert %{ets: 2, inet4: 1, inet6: 0} = TreeBitmap.length(t)

    assert nil == TreeBitmap.add(t, {8193, 3512, 34211, 0, 0, 35374, 880, 1}, 64, :lan)
    assert :lan = TreeBitmap.add(t, {8193, 3512, 34211, 0, 0, 35374, 880, 1}, 64, :lan2)
    assert %{ets: 3, inet4: 1, inet6: 1} = TreeBitmap.length(t)
  end

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

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

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

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

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

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

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

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

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

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

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

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

end