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
|