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