1# -*- coding: utf-8 -*-
2# Copyright 2021 Red Hat
3# GNU General Public License v3.0+
4# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5
6"""
7Unit test file for usable_range filter plugin
8"""
9
10from __future__ import absolute_import, division, print_function
11
12__metaclass__ = type
13
14import unittest
15from ansible.errors import AnsibleError
16from ansible_collections.ansible.utils.plugins.filter.usable_range import (
17    _usable_range,
18)
19
20INVALID_DATA_1 = [
21    "helloworld",
22    "192.0.2.0/23/24",
23    "::/20/30",
24    "10.0.0.0/322",
25    "2001:db8:abcd:0012::0/129",
26]
27INVALID_DATA_2 = ["192.168.1.25/24", "2001:db8:abcd:12::2/126"]
28
29VALID_DATA = [
30    "10.0.0.8/30",
31    "192.0.2.0/28",
32    "2001:db8:abcd:0012::0/126",
33    "2001:DB8:ABCD:12::",
34]
35
36VALID_OUTPUT_1 = {
37    "number_of_ips": 4,
38    "usable_ips": ["10.0.0.8", "10.0.0.9", "10.0.0.10", "10.0.0.11"],
39}
40VALID_OUTPUT_2 = {
41    "number_of_ips": 16,
42    "usable_ips": [
43        "192.0.2.0",
44        "192.0.2.1",
45        "192.0.2.2",
46        "192.0.2.3",
47        "192.0.2.4",
48        "192.0.2.5",
49        "192.0.2.6",
50        "192.0.2.7",
51        "192.0.2.8",
52        "192.0.2.9",
53        "192.0.2.10",
54        "192.0.2.11",
55        "192.0.2.12",
56        "192.0.2.13",
57        "192.0.2.14",
58        "192.0.2.15",
59    ],
60}
61
62VALID_OUTPUT_3 = {
63    "number_of_ips": 4,
64    "usable_ips": [
65        "2001:db8:abcd:12::",
66        "2001:db8:abcd:12::1",
67        "2001:db8:abcd:12::2",
68        "2001:db8:abcd:12::3",
69    ],
70}
71VALID_OUTPUT_4 = {"number_of_ips": 1, "usable_ips": ["2001:db8:abcd:12::"]}
72
73
74class TestUsableRange(unittest.TestCase):
75    def setUp(self):
76        pass
77
78    def test_missing_data(self):
79        """Check passing missing argspec"""
80
81        # missing required arguments
82        ip = ""
83        with self.assertRaises(AnsibleError) as error:
84            _usable_range(ip)
85        self.assertIn(
86            "does not appear to be an IPv4 or IPv6 network",
87            str(error.exception),
88        )
89
90    def test_invalid_data(self):
91        """Check passing invalid argspec"""
92
93        # invalid required arguments
94
95        for invalid_data in INVALID_DATA_1:
96            with self.assertRaises(AnsibleError) as error:
97                _usable_range(invalid_data)
98            self.assertIn(
99                "does not appear to be an IPv4 or IPv6 network",
100                str(error.exception),
101            )
102
103        for invalid_data in INVALID_DATA_2:
104            with self.assertRaises(AnsibleError) as error:
105                _usable_range(invalid_data)
106            self.assertIn("has host bits set", str(error.exception))
107
108    def test_valid_data(self):
109        """Check passing valid data as per criteria"""
110
111        ip = VALID_DATA[0]
112        result = _usable_range(ip)
113        self.assertEqual(result, VALID_OUTPUT_1)
114
115        ip = VALID_DATA[1]
116        result = _usable_range(ip)
117        self.assertEqual(result, VALID_OUTPUT_2)
118
119        ip = VALID_DATA[2]
120        result = _usable_range(ip)
121        self.assertEqual(result, VALID_OUTPUT_3)
122
123        ip = VALID_DATA[3]
124        result = _usable_range(ip)
125        self.assertEqual(result, VALID_OUTPUT_4)
126