2018-02-09 18:42:18 +03:00
# -*- coding: utf-8 -*-
# Unix SMB/CIFS implementation. Tests for smb manipulation
# Copyright (C) David Mulder <dmulder@suse.com> 2018
#
# 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.
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2018-07-30 09:21:38 +03:00
import samba
import os
import random
import sys
2018-02-09 18:42:18 +03:00
from samba import smb
2018-12-03 01:15:14 +03:00
from samba import NTSTATUSError
from samba . ntstatus import NT_STATUS_OBJECT_NAME_NOT_FOUND
2018-02-09 18:42:18 +03:00
PY3 = sys . version_info [ 0 ] == 3
addom = ' addom.samba.example.com/ '
2018-07-30 09:18:25 +03:00
test_contents = ' abcd ' * 256
utf_contents = u ' Süßigkeiten Äpfel ' * 128
test_literal_bytes_embed_nulls = b ' \xff \xfe \x14 \x61 \x00 \x00 \x62 \x63 \x64 ' * 256
2018-02-09 18:42:18 +03:00
binary_contents = b ' \xff \xfe '
2018-07-30 09:18:25 +03:00
binary_contents = binary_contents + " Hello cruel world of python3 " . encode ( ' utf8 ' ) * 128
2018-07-30 09:19:05 +03:00
test_dir = os . path . join ( addom , ' testing_ %d ' % random . randint ( 0 , 0xFFFF ) )
2018-02-09 18:42:18 +03:00
test_file = os . path . join ( test_dir , ' testing ' ) . replace ( ' / ' , ' \\ ' )
2018-07-30 09:20:39 +03:00
2018-02-09 18:42:18 +03:00
class SMBTests ( samba . tests . TestCase ) :
def setUp ( self ) :
super ( SMBTests , self ) . setUp ( )
self . server = os . environ [ " SERVER " ]
creds = self . insta_creds ( template = self . get_credentials ( ) )
self . conn = smb . SMB ( self . server ,
" sysvol " ,
lp = self . get_loadparm ( ) ,
creds = creds )
self . conn . mkdir ( test_dir )
def tearDown ( self ) :
super ( SMBTests , self ) . tearDown ( )
try :
self . conn . deltree ( test_dir )
except :
pass
def test_list ( self ) :
ls = [ f [ ' name ' ] for f in self . conn . list ( addom ) ]
self . assertIn ( ' scripts ' , ls ,
2018-07-30 09:16:12 +03:00
msg = ' " scripts " directory not found in sysvol ' )
2018-07-30 09:19:05 +03:00
self . assertIn ( ' Policies ' , ls ,
2018-07-30 09:16:12 +03:00
msg = ' " Policies " directory not found in sysvol ' )
2018-02-09 18:42:18 +03:00
2018-12-03 01:15:14 +03:00
def file_exists ( self , filepath ) :
""" Returns whether a regular file exists (by trying to open it) """
try :
self . conn . loadfile ( filepath )
exists = True ;
except NTSTATUSError as err :
if err . args [ 0 ] == NT_STATUS_OBJECT_NAME_NOT_FOUND :
exists = False
else :
raise err
return exists
2018-06-13 01:39:57 +03:00
def test_unlink ( self ) :
"""
The smb . unlink API should delete file
"""
2018-12-03 01:15:14 +03:00
# create the test file
self . assertFalse ( self . file_exists ( test_file ) )
2018-07-30 09:22:11 +03:00
self . conn . savefile ( test_file , binary_contents )
2018-12-03 01:15:14 +03:00
self . assertTrue ( self . file_exists ( test_file ) )
# delete it and check that it's gone
2018-06-13 01:39:57 +03:00
self . conn . unlink ( test_file )
2018-12-03 01:15:14 +03:00
self . assertFalse ( self . file_exists ( test_file ) )
2018-06-13 01:39:57 +03:00
2018-12-03 01:01:14 +03:00
def test_chkpath ( self ) :
""" Tests .chkpath determines whether or not a directory exists """
self . assertTrue ( self . conn . chkpath ( test_dir ) )
# should return False for a non-existent directory
bad_dir = self . make_sysvol_path ( test_dir , ' dont_exist ' )
self . assertFalse ( self . conn . chkpath ( bad_dir ) )
# should return False for files (because they're not directories)
self . conn . savefile ( test_file , binary_contents )
self . assertFalse ( self . conn . chkpath ( test_file ) )
# check correct result after creating and then deleting a new dir
new_dir = self . make_sysvol_path ( test_dir , ' test-new ' )
self . conn . mkdir ( new_dir )
self . assertTrue ( self . conn . chkpath ( new_dir ) )
self . conn . rmdir ( new_dir )
self . assertFalse ( self . conn . chkpath ( new_dir ) )
2018-02-09 18:42:18 +03:00
def test_save_load_text ( self ) :
self . conn . savefile ( test_file , test_contents . encode ( ' utf8 ' ) )
contents = self . conn . loadfile ( test_file )
self . assertEquals ( contents . decode ( ' utf8 ' ) , test_contents ,
2018-07-30 09:16:12 +03:00
msg = ' contents of test file did not match what was written ' )
2018-02-09 18:42:18 +03:00
# with python2 this will save/load str type (with embedded nulls)
# with python3 this will save/load bytes type
def test_save_load_string_bytes ( self ) :
self . conn . savefile ( test_file , test_literal_bytes_embed_nulls )
contents = self . conn . loadfile ( test_file )
self . assertEquals ( contents , test_literal_bytes_embed_nulls ,
2018-07-30 09:16:12 +03:00
msg = ' contents of test file did not match what was written ' )
2018-02-09 18:42:18 +03:00
# python3 only this will save/load unicode
def test_save_load_utfcontents ( self ) :
if PY3 :
self . conn . savefile ( test_file , utf_contents . encode ( ' utf8 ' ) )
contents = self . conn . loadfile ( test_file )
self . assertEquals ( contents . decode ( ' utf8 ' ) , utf_contents ,
2018-07-30 09:16:12 +03:00
msg = ' contents of test file did not match what was written ' )
2018-02-09 18:42:18 +03:00
# with python2 this will save/load str type
# with python3 this will save/load bytes type
def test_save_binary_contents ( self ) :
2018-07-30 09:22:11 +03:00
self . conn . savefile ( test_file , binary_contents )
2018-02-09 18:42:18 +03:00
contents = self . conn . loadfile ( test_file )
self . assertEquals ( contents , binary_contents ,
2018-07-30 09:16:12 +03:00
msg = ' contents of test file did not match what was written ' )
2018-12-03 01:01:14 +03:00
def make_sysvol_path ( self , dirpath , filename ) :
# return the dir + filename as a sysvol path
return os . path . join ( dirpath , filename ) . replace ( ' / ' , ' \\ ' )