2012-09-26 04:57:16 +04:00
# Unix SMB/CIFS implementation.
# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007-2012
#
# Tests for documentation.
#
# 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/>.
#
""" Tests for presence of documentation. """
import samba
import samba . tests
2012-09-28 20:52:41 +04:00
from samba . tests import TestSkipped
2012-09-26 04:57:16 +04:00
2012-09-28 20:52:41 +04:00
import errno
2012-09-26 04:57:16 +04:00
import os
import re
import subprocess
class TestCase ( samba . tests . TestCase ) :
def _format_message ( self , parameters , message ) :
parameters = list ( parameters )
parameters . sort ( )
return message + ' \n \n %s ' % ( ' \n ' . join ( parameters ) )
2012-09-28 20:52:41 +04:00
class NoXsltProc ( Exception ) :
def __init__ ( self ) :
Exception . __init__ ( self , " ' xsltproc ' is not installed " )
2012-09-26 04:57:16 +04:00
def get_documented_parameters ( sourcedir ) :
2012-10-19 11:16:55 +04:00
path = os . path . join ( sourcedir , " bin " , " default " , " docs-xml " , " smbdotconf " )
if not os . path . exists ( os . path . join ( path , " parameters.all.xml " ) ) :
raise Exception ( " Unable to find parameters.all.xml " )
2012-09-28 20:52:41 +04:00
try :
p = subprocess . Popen (
2012-10-19 11:16:55 +04:00
[ " xsltproc " , " --xinclude " , " --param " , " smb.context " , " ALL " , os . path . join ( sourcedir , " docs-xml " , " smbdotconf " , " generate-context.xsl " ) , " parameters.all.xml " ] ,
stderr = subprocess . STDOUT , stdout = subprocess . PIPE ,
cwd = path )
2012-09-28 20:52:41 +04:00
except OSError , e :
if e . errno == errno . ENOENT :
raise NoXsltProc ( )
raise
2012-09-26 04:57:16 +04:00
out , err = p . communicate ( )
assert p . returncode == 0 , " returncode was %r " % p . returncode
for l in out . splitlines ( ) :
m = re . match ( ' <samba:parameter .*?name= " ([^ " ]*?) " ' , l )
2012-10-19 11:21:01 +04:00
if " removed= \" 1 \" " in l :
continue
2012-09-26 04:57:16 +04:00
if m :
2012-09-27 00:20:42 +04:00
name = m . group ( 1 )
2012-09-26 04:57:16 +04:00
yield name
2012-09-27 00:09:01 +04:00
m = re . match ( ' .*<synonym>(.*)</synonym>.* ' , l )
2012-09-26 23:40:00 +04:00
if m :
2012-09-27 00:20:42 +04:00
name = m . group ( 1 )
2012-09-26 23:40:00 +04:00
yield name
2012-09-26 04:57:16 +04:00
def get_implementation_parameters ( sourcedir ) :
# Reading entries from source code
f = open ( os . path . join ( sourcedir , " lib/param/param_table.c " ) , " r " )
try :
# burn through the preceding lines
while True :
l = f . readline ( )
if l . startswith ( " static struct parm_struct parm_table " ) :
break
for l in f . readlines ( ) :
if re . match ( " ^ \ s* \ } \ ; \ s*$ " , l ) :
break
# pull in the param names only
if re . match ( " .*P_SEPARATOR.* " , l ) :
continue
m = re . match ( " \ s* \ .label \ s*= \ s* \" (.*) \" .* " , l )
if not m :
continue
name = m . group ( 1 )
2012-09-27 00:20:42 +04:00
yield name
2012-09-26 04:57:16 +04:00
finally :
f . close ( )
class SmbDotConfTests ( TestCase ) :
2012-09-26 20:41:19 +04:00
def test_unknown ( self ) :
2012-09-26 04:57:16 +04:00
topdir = samba . source_tree_topdir ( )
2012-09-28 20:52:41 +04:00
try :
documented = set ( get_documented_parameters ( topdir ) )
except NoXsltProc :
raise TestSkipped ( " ' xsltproc ' is missing, unable to load parameters " )
2012-09-26 04:57:16 +04:00
parameters = set ( get_implementation_parameters ( topdir ) )
2012-09-26 20:41:19 +04:00
# Filter out parametric options, since we can't find them in the parm
# table
documented = set ( [ p for p in documented if not " : " in p ] )
2012-09-26 04:57:16 +04:00
unknown = documented . difference ( parameters )
if len ( unknown ) > 0 :
self . fail ( self . _format_message ( unknown ,
" Parameters that are documented but not in the implementation: " ) )
2012-09-26 20:41:19 +04:00
def test_undocumented ( self ) :
topdir = samba . source_tree_topdir ( )
2012-09-28 20:52:41 +04:00
try :
documented = set ( get_documented_parameters ( topdir ) )
except NoXsltProc :
raise TestSkipped ( " ' xsltproc ' is missing, unable to load parameters " )
2012-09-26 20:41:19 +04:00
parameters = set ( get_implementation_parameters ( topdir ) )
2012-09-26 04:57:16 +04:00
undocumented = parameters . difference ( documented )
if len ( undocumented ) > 0 :
self . fail ( self . _format_message ( undocumented ,
" Parameters that are in the implementation but undocumented: " ) )