summaryrefslogtreecommitdiffstats
path: root/python/samba/tests/dcerpc/testrpc.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:20:00 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:20:00 +0000
commit8daa83a594a2e98f39d764422bfbdbc62c9efd44 (patch)
tree4099e8021376c7d8c05bdf8503093d80e9c7bad0 /python/samba/tests/dcerpc/testrpc.py
parentInitial commit. (diff)
downloadsamba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.tar.xz
samba-8daa83a594a2e98f39d764422bfbdbc62c9efd44.zip
Adding upstream version 2:4.20.0+dfsg.upstream/2%4.20.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'python/samba/tests/dcerpc/testrpc.py')
-rw-r--r--python/samba/tests/dcerpc/testrpc.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/python/samba/tests/dcerpc/testrpc.py b/python/samba/tests/dcerpc/testrpc.py
new file mode 100644
index 0000000..789ea9a
--- /dev/null
+++ b/python/samba/tests/dcerpc/testrpc.py
@@ -0,0 +1,143 @@
+# test generated python code from pidl
+# Copyright (C) Andrew Tridgell August 2010
+#
+# 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/>.
+#
+import sys
+
+sys.path.insert(0, "bin/python")
+
+import samba
+import samba.tests
+from samba.dcerpc import drsuapi
+import talloc
+
+talloc.enable_null_tracking()
+
+
+class RpcTests(object):
+ """test type behaviour of pidl generated python RPC code"""
+
+ def check_blocks(self, object, num_expected):
+ """check that the number of allocated blocks is correct"""
+ nblocks = talloc.total_blocks(object)
+ if object is None:
+ nblocks -= self.initial_blocks
+ leaked_blocks = (nblocks - num_expected)
+ if leaked_blocks != 0:
+ print("Leaked %d blocks" % leaked_blocks)
+
+ def check_type(self, interface, typename, type):
+ print("Checking type %s" % typename)
+ v = type()
+ for n in dir(v):
+ if n[0] == '_':
+ continue
+ try:
+ value = getattr(v, n)
+ except TypeError as errstr:
+ if str(errstr) == "unknown union level":
+ print("ERROR: Unknown union level in %s.%s" % (typename, n))
+ self.errcount += 1
+ continue
+ print(str(errstr)[1:21])
+ if str(errstr)[0:21] == "Can not convert C Type":
+ print("ERROR: Unknown C type for %s.%s" % (typename, n))
+ self.errcount += 1
+ continue
+ else:
+ print("ERROR: Failed to instantiate %s.%s" % (typename, n))
+ self.errcount += 1
+ continue
+ except Exception:
+ print("ERROR: Failed to instantiate %s.%s" % (typename, n))
+ self.errcount += 1
+ continue
+
+ # now try setting the value back
+ try:
+ print("Setting %s.%s" % (typename, n))
+ setattr(v, n, value)
+ except Exception as e:
+ if isinstance(e, AttributeError) and str(e).endswith("is read-only"):
+ # readonly, ignore
+ continue
+ else:
+ print("ERROR: Failed to set %s.%s: %r: %s" % (typename, n, e.__class__, e))
+ self.errcount += 1
+ continue
+
+ # and try a comparison
+ try:
+ if value != getattr(v, n):
+ print("ERROR: Comparison failed for %s.%s: %r != %r" % (typename, n, value, getattr(v, n)))
+ continue
+ except Exception as e:
+ print("ERROR: compare exception for %s.%s: %r: %s" % (typename, n, e.__class__, e))
+ continue
+
+ def check_interface(self, interface, iname):
+ errcount = self.errcount
+ for n in dir(interface):
+ if n[0] == '_' or n == iname:
+ # skip the special ones
+ continue
+ value = getattr(interface, n)
+ if isinstance(value, str):
+ # print "%s=\"%s\"" % (n, value)
+ pass
+ elif isinstance(value, int):
+ # print "%s=%d" % (n, value)
+ pass
+ elif isinstance(value, type):
+ try:
+ initial_blocks = talloc.total_blocks(None)
+ self.check_type(interface, n, value)
+ self.check_blocks(None, initial_blocks)
+ except Exception as e:
+ print("ERROR: Failed to check_type %s.%s: %r: %s" % (iname, n, e.__class__, e))
+ self.errcount += 1
+ elif callable(value):
+ pass # Method
+ else:
+ print("UNKNOWN: %s=%s" % (n, value))
+ if self.errcount - errcount != 0:
+ print("Found %d errors in %s" % (self.errcount - errcount, iname))
+
+ def check_all_interfaces(self):
+ for iname in dir(samba.dcerpc):
+ if iname[0] == '_':
+ continue
+ if iname == 'ClientConnection' or iname == 'base':
+ continue
+ print("Checking interface %s" % iname)
+ iface = getattr(samba.dcerpc, iname)
+ initial_blocks = talloc.total_blocks(None)
+ self.check_interface(iface, iname)
+ self.check_blocks(None, initial_blocks)
+
+ def run(self):
+ self.initial_blocks = talloc.total_blocks(None)
+ self.errcount = 0
+ self.check_all_interfaces()
+ return self.errcount
+
+
+tests = RpcTests()
+errcount = tests.run()
+if errcount == 0:
+ sys.exit(0)
+else:
+ print("%d failures" % errcount)
+ sys.exit(1)