138 lines
5.4 KiB
Python
138 lines
5.4 KiB
Python
# Copyright (c) 2018 Fujitsu Limited
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import socket
|
|
from unittest import mock
|
|
|
|
import cffi
|
|
from neutron.tests import base
|
|
from oslo_utils import importutils
|
|
import testtools
|
|
|
|
# mock for dlopen
|
|
cffi.FFI = mock.Mock()
|
|
cffi.FFI.dlopen = mock.Mock(return_value=mock.Mock())
|
|
lib_log = importutils.import_module(
|
|
'neutron_fwaas.privileged.netfilter_log.libnetfilter_log'
|
|
)
|
|
|
|
|
|
class NFLogAppTestCase(base.BaseTestCase):
|
|
|
|
def setUp(self):
|
|
|
|
self.nflog_app = lib_log.NFLogApp()
|
|
self.spawn = mock.patch('eventlet.spawn').start()
|
|
super(NFLogAppTestCase, self).setUp()
|
|
|
|
def test_register_packet_handler(self):
|
|
def fake_method():
|
|
pass
|
|
self.nflog_app.register_packet_handler(fake_method)
|
|
self.assertEqual(fake_method, self.nflog_app.callback)
|
|
|
|
def test_unregister_packet_handler(self):
|
|
def fake_method():
|
|
pass
|
|
self.nflog_app.register_packet_handler(fake_method)
|
|
self.assertEqual(fake_method, self.nflog_app.callback)
|
|
self.nflog_app.unregister_packet_handler()
|
|
self.assertIsNone(self.nflog_app.callback)
|
|
|
|
|
|
class NFLogWrapper(base.BaseTestCase):
|
|
|
|
def setUp(self):
|
|
super(NFLogWrapper, self).setUp()
|
|
lib_log.libnflog = mock.Mock()
|
|
lib_log.ffi = mock.Mock()
|
|
|
|
def test_open_failed(self):
|
|
lib_log.libnflog.nflog_open.return_value = None
|
|
handle = lib_log.NFLogWrapper.get_instance()
|
|
with testtools.ExpectedException(Exception):
|
|
handle.open()
|
|
lib_log.libnflog.nflog_open.assert_called_once_with()
|
|
lib_log.libnflog.nflog_unbind_pf.assert_not_called()
|
|
lib_log.libnflog.nflog_bind_pf.assert_not_called()
|
|
handle.close()
|
|
|
|
def test_bind_pf(self):
|
|
nflog_handle = mock.Mock()
|
|
lib_log.libnflog.nflog_open.return_value = nflog_handle
|
|
handle = lib_log.NFLogWrapper.get_instance()
|
|
handle.open()
|
|
lib_log.libnflog.nflog_open.assert_called_once_with()
|
|
calls = [mock.call(nflog_handle, socket.AF_INET),
|
|
mock.call(nflog_handle, socket.AF_INET6)]
|
|
lib_log.libnflog.nflog_unbind_pf.assert_has_calls(
|
|
calls, any_order=True)
|
|
lib_log.libnflog.nflog_bind_pf.assert_has_calls(
|
|
calls, any_order=True)
|
|
|
|
def test_bind_group_set_mode_failed(self):
|
|
nflog_handle = mock.Mock()
|
|
g_handle = mock.Mock()
|
|
lib_log.libnflog.nflog_open.return_value = nflog_handle
|
|
lib_log.libnflog.nflog_bind_group.return_value = g_handle
|
|
lib_log.libnflog.nflog_set_mode.return_value = -1
|
|
handle = lib_log.NFLogWrapper.get_instance()
|
|
with testtools.ExpectedException(Exception):
|
|
handle.open()
|
|
handle.bind_group(0)
|
|
lib_log.libnflog.nflog_open.assert_called_once_with()
|
|
lib_log.libnflog.nflog_bind_group.assert_called_once_with(
|
|
nflog_handle, 0)
|
|
lib_log.libnflog.nflog_set_mode.assert_called_once_with(
|
|
g_handle, 0x2, 0xffff)
|
|
lib_log.libnflog.nflog_callback_register.assert_not_called()
|
|
|
|
def test_bind_group_set_callback_failed(self):
|
|
nflog_handle = mock.Mock()
|
|
g_handle = mock.Mock()
|
|
lib_log.libnflog.nflog_open.return_value = nflog_handle
|
|
lib_log.libnflog.nflog_bind_group.return_value = g_handle
|
|
lib_log.libnflog.nflog_set_mode.return_value = 0
|
|
lib_log.libnflog.nflog_callback_register.return_value = -1
|
|
handle = lib_log.NFLogWrapper.get_instance()
|
|
with testtools.ExpectedException(Exception):
|
|
handle.open()
|
|
handle.bind_group(0)
|
|
lib_log.libnflog.nflog_open.assert_called_once_with()
|
|
lib_log.libnflog.nflog_bind_group.assert_called_once_with(
|
|
nflog_handle, 0)
|
|
lib_log.libnflog.nflog_set_mode.assert_called_once_with(
|
|
g_handle, 0x2, 0xffff)
|
|
lib_log.libnflog.nflog_callback_register.assert_called_once_with(
|
|
g_handle, handle.cb, lib_log.ffi.NULL)
|
|
|
|
def test_bind_group_pass(self):
|
|
nflog_handle = mock.Mock()
|
|
g_handle = mock.Mock()
|
|
lib_log.libnflog.nflog_open.return_value = nflog_handle
|
|
lib_log.libnflog.nflog_bind_group.return_value = g_handle
|
|
lib_log.libnflog.nflog_set_mode.return_value = 0
|
|
lib_log.libnflog.nflog_callback_register.return_value = 0
|
|
handle = lib_log.NFLogWrapper.get_instance()
|
|
handle.open()
|
|
handle.bind_group(0)
|
|
lib_log.libnflog.nflog_open.assert_called_once_with()
|
|
lib_log.libnflog.nflog_bind_group.assert_called_once_with(
|
|
nflog_handle, 0)
|
|
lib_log.libnflog.nflog_set_mode.assert_called_once_with(
|
|
g_handle, 0x2, 0xffff)
|
|
lib_log.libnflog.nflog_callback_register.assert_called_once_with(
|
|
g_handle, handle.cb, lib_log.ffi.NULL)
|