2012-03-13 20:14:37 +04:00
# -*- coding: utf-8 -*-
#
2008-05-25 18:47:12 +04:00
# Unix SMB/CIFS implementation.
# Copyright © Jelmer Vernooij <jelmer@samba.org> 2008
2011-09-13 03:10:37 +04:00
#
2008-05-25 18:47:12 +04:00
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
2011-09-13 03:10:37 +04:00
#
2008-05-25 18:47:12 +04:00
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
2011-09-13 03:10:37 +04:00
#
2008-05-25 18:47:12 +04:00
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
2010-12-05 18:56:27 +03:00
""" Tests for samba.messaging. """
2014-10-07 03:44:16 +04:00
import samba
2008-05-26 15:31:57 +04:00
from samba . messaging import Messaging
2010-06-19 20:58:18 +04:00
from samba . tests import TestCase
2017-03-14 02:39:13 +03:00
import time
2017-03-14 03:39:00 +03:00
from samba . ndr import ndr_print
2017-03-14 02:39:13 +03:00
from samba . dcerpc import server_id
2017-03-14 06:07:46 +03:00
import random
2017-03-16 06:26:01 +03:00
import os
2017-09-14 10:31:17 +03:00
from samba . compat import integer_types
2008-05-25 18:47:12 +04:00
class MessagingTests ( TestCase ) :
2010-06-19 20:58:18 +04:00
2008-05-26 03:52:35 +04:00
def get_context ( self , * args , * * kwargs ) :
2014-10-07 03:44:16 +04:00
kwargs [ ' lp_ctx ' ] = samba . tests . env_loadparm ( )
2008-05-26 03:52:35 +04:00
return Messaging ( * args , * * kwargs )
2012-09-16 16:18:51 +04:00
2008-05-26 03:52:35 +04:00
def test_register ( self ) :
x = self . get_context ( )
2018-07-30 09:21:32 +03:00
2008-05-26 03:52:35 +04:00
def callback ( ) :
pass
2017-03-14 02:39:13 +03:00
msg_type = x . register ( ( callback , None ) )
2017-09-14 10:31:17 +03:00
self . assertTrue ( isinstance ( msg_type , integer_types ) )
2008-05-26 03:52:35 +04:00
x . deregister ( callback , msg_type )
2012-10-29 08:34:41 +04:00
def test_all_servers ( self ) :
x = self . get_context ( )
self . assertTrue ( isinstance ( x . irpc_all_servers ( ) , list ) )
def test_by_name ( self ) :
x = self . get_context ( )
for name in x . irpc_all_servers ( ) :
self . assertTrue ( isinstance ( x . irpc_servers_byname ( name . name ) , list ) )
2017-03-14 06:07:46 +03:00
def test_unknown_name ( self ) :
x = self . get_context ( )
self . assertRaises ( KeyError ,
x . irpc_servers_byname , " samba.messaging test NONEXISTING " )
2008-05-26 03:52:35 +04:00
def test_assign_server_id ( self ) :
x = self . get_context ( )
2017-03-14 02:39:13 +03:00
self . assertTrue ( isinstance ( x . server_id , server_id . server_id ) )
2008-05-26 03:52:35 +04:00
2017-03-14 06:07:46 +03:00
def test_add_remove_name ( self ) :
2017-03-08 04:53:26 +03:00
x = self . get_context ( )
2017-03-14 06:07:46 +03:00
name = " samba.messaging test- %d " % random . randint ( 1 , 1000000 )
x . irpc_add_name ( name )
name_list = x . irpc_servers_byname ( name )
2017-03-14 03:39:00 +03:00
self . assertEqual ( len ( name_list ) , 1 )
self . assertEqual ( ndr_print ( x . server_id ) ,
ndr_print ( name_list [ 0 ] ) )
2017-03-14 06:07:46 +03:00
x . irpc_remove_name ( name )
self . assertRaises ( KeyError ,
x . irpc_servers_byname , name )
2017-03-08 04:53:26 +03:00
2008-05-26 03:52:35 +04:00
def test_ping_speed ( self ) :
2017-03-14 02:39:13 +03:00
got_ping = { " count " : 0 }
got_pong = { " count " : 0 }
timeout = False
msg_pong = 0
msg_ping = 0
2008-05-26 03:52:35 +04:00
server_ctx = self . get_context ( ( 0 , 1 ) )
2018-07-30 09:21:32 +03:00
2017-03-14 02:39:13 +03:00
def ping_callback ( got_ping , msg_type , src , data ) :
got_ping [ " count " ] + = 1
server_ctx . send ( src , msg_pong , data )
msg_ping = server_ctx . register ( ( ping_callback , got_ping ) )
def pong_callback ( got_pong , msg_type , src , data ) :
got_pong [ " count " ] + = 1
2008-05-26 03:52:35 +04:00
client_ctx = self . get_context ( ( 0 , 2 ) )
2017-03-14 02:39:13 +03:00
msg_pong = client_ctx . register ( ( pong_callback , got_pong ) )
2008-05-26 03:52:35 +04:00
2017-03-14 02:39:13 +03:00
# Try both server_id forms (structure and tuple)
2009-11-07 19:57:50 +03:00
client_ctx . send ( ( 0 , 1 ) , msg_ping , " testing " )
2008-05-26 03:52:35 +04:00
2017-03-14 02:39:13 +03:00
client_ctx . send ( ( 0 , 1 ) , msg_ping , " testing2 " )
start_time = time . time ( )
# NOTE WELL: If debugging this with GDB, then the timeout will
# fire while you are trying to understand it.
while ( got_ping [ " count " ] < 2 or got_pong [ " count " ] < 2 ) and not timeout :
client_ctx . loop_once ( 0.1 )
server_ctx . loop_once ( 0.1 )
if time . time ( ) - start_time > 1 :
timeout = True
self . assertEqual ( got_ping [ " count " ] , 2 )
self . assertEqual ( got_pong [ " count " ] , 2 )
2017-03-16 06:26:01 +03:00
def test_pid_defaulting ( self ) :
got_ping = { " count " : 0 }
got_pong = { " count " : 0 }
timeout = False
msg_pong = 0
msg_ping = 0
pid = os . getpid ( )
server_ctx = self . get_context ( ( pid , 1 ) )
2018-07-30 09:21:32 +03:00
2017-03-16 06:26:01 +03:00
def ping_callback ( got_ping , msg_type , src , data ) :
got_ping [ " count " ] + = 1
server_ctx . send ( src , msg_pong , data )
msg_ping = server_ctx . register ( ( ping_callback , got_ping ) )
def pong_callback ( got_pong , msg_type , src , data ) :
got_pong [ " count " ] + = 1
client_ctx = self . get_context ( ( 2 , ) )
msg_pong = client_ctx . register ( ( pong_callback , got_pong ) )
# Try one and two element tuple forms
client_ctx . send ( ( pid , 1 ) , msg_ping , " testing " )
client_ctx . send ( ( 1 , ) , msg_ping , " testing2 " )
start_time = time . time ( )
# NOTE WELL: If debugging this with GDB, then the timeout will
# fire while you are trying to understand it.
while ( got_ping [ " count " ] < 2 or got_pong [ " count " ] < 2 ) and not timeout :
client_ctx . loop_once ( 0.1 )
server_ctx . loop_once ( 0.1 )
if time . time ( ) - start_time > 1 :
timeout = True
self . assertEqual ( got_ping [ " count " ] , 2 )
self . assertEqual ( got_pong [ " count " ] , 2 )