2 # -*- coding: utf-8 -*-
5 sys.path.insert(0, 'bin/python')
9 import samba.getopt as options
13 # We try to use the test infrastructure of Samba 4.3+, but if it
14 # doesn't work, we are probably in a back-ported patch and trying to
15 # run on 4.1 or something.
17 # Don't copy this horror into ordinary tests -- it is special for
18 # performance tests that want to apply to old versions.
20 from samba.tests.subunitrun import SubunitOptions, TestProgram
24 samba.ensure_external_module("testtools", "testtools")
25 samba.ensure_external_module("subunit", "subunit/python")
26 from subunit.run import SubunitTestRunner
29 from samba.ndr import ndr_pack, ndr_unpack
30 from samba.dcerpc import security
31 from samba.dcerpc import drsuapi
33 parser = optparse.OptionParser("ndr_pack_performance.py [options] <host>")
34 sambaopts = options.SambaOptions(parser)
35 parser.add_option_group(sambaopts)
36 parser.add_option_group(options.VersionOptions(parser))
39 subunitopts = SubunitOptions(parser)
40 parser.add_option_group(subunitopts)
42 # use command line creds if available
43 credopts = options.CredentialsOptions(parser)
44 parser.add_option_group(credopts)
45 opts, args = parser.parse_args()
53 lp = sambaopts.get_loadparm()
54 creds = credopts.get_credentials(lp)
59 BIG_SD_SDDL = ''.join(
60 """O:S-1-5-21-3328325300-3937145445-4190589019-512G:S-1-5-2
61 1-3328325300-3937145445-4190589019-512D:AI(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;S-
62 1-5-21-3328325300-3937145445-4190589019-512)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;
63 SY)(A;;RPLCLORC;;;AU)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;AO)(A;;RPLCLORC;;;PS)(O
64 A;;CR;ab721a55-1e2f-11d0-9819-00aa0040529b;;AU)(OA;;RP;46a9b11d-60ae-405a-b7e
65 8-ff8a58d456d2;;S-1-5-32-560)(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e05
66 29;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;4c164200-20c0-11d0-a
67 768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;5f2020
68 10-79a5-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CI
69 IOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa0030
70 49e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc
71 -9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;bf96
72 7aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c
73 04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;59ba2f42-79a2
74 -11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP
75 ;037088f8-0ae1-11d2-b422-00a0c968f939;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU
76 )(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf967aba-0de6-11d0-a285-0
77 0aa003049e2;RU)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a86-0d
78 e6-11d0-a285-00aa003049e2;ED)(OA;CIID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608
79 ;bf967a9c-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854
80 e-00a0c983f608;bf967aba-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RPLCLORC;;4
81 828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIID;RPLCLORC;;bf967a9c-0de6-11d0-
82 a285-00aa003049e2;RU)(OA;CIIOID;RPLCLORC;;bf967aba-0de6-11d0-a285-00aa003049e
83 2;RU)(OA;CIID;RPWPCR;91e647de-d96f-4b70-9557-d63ff4f3ccd8;;PS)(A;CIID;RPWPCRC
84 CDCLCLORCWOWDSDDTSW;;;S-1-5-21-3328325300-3937145445-4190589019-519)(A;CIID;L
85 C;;;RU)(A;CIID;RPWPCRCCLCLORCWOWDSDSW;;;BA)(OA;CIIOID;RP;4c164200-20c0-11d0-a
86 768-00aa006e0529;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;4c1642
87 00-20c0-11d0-a768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CI
88 IOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e
89 5f28;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0
90 -a285-00aa003049e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;4828
91 cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c
92 04fc2d4cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;59ba2f42-79a2
93 -11d0-9020-00c04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP
94 ;59ba2f42-79a2-11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU
95 )(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;4828cc14-1437-45bc-9b07-a
96 d6f015e5f28;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf967aba-0d
97 e6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f6
98 08;bf967a86-0de6-11d0-a285-00aa003049e2;ED)(OA;CIID;RP;b7c69e6d-2cc7-11d2-854
99 e-00a0c983f608;bf967a9c-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d
100 -2cc7-11d2-854e-00a0c983f608;bf967aba-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIO
101 ID;RPLCLORC;;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIID;RPLCLORC;;bf967
102 a9c-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RPLCLORC;;bf967aba-0de6-11d0-a2
103 85-00aa003049e2;RU)(OA;CIID;RPWPCR;91e647de-d96f-4b70-9557-d63ff4f3ccd8;;PS)(
104 A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;S-1-5-21-3328325300-3937145445-4190589019
105 -519)(A;CIID;LC;;;RU)(A;CIID;RPWPCRCCLCLORCWOWDSDSW;;;BA)S:AI(OU;CIIOIDSA;WP;
106 f30e3bbe-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)
107 (OU;CIIOIDSA;WP;f30e3bbf-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-
108 00aa003049e2;WD)(OU;CIIOIDSA;WP;f30e3bbe-9ff0-11d1-b603-0000f80367c1;bf967aa5
109 -0de6-11d0-a285-00aa003049e2;WD)(OU;CIIOIDSA;WP;f30e3bbf-9ff0-11d1-b603-0000f
110 80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)""".split())
112 LITTLE_SD_SDDL = ''.join(
113 """O:S-1-5-21-3328325300-3937145445-4190589019-512G:S-1-5-2
114 1-3328325300-3937145445-4190589019-512D:AI(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;S-
115 1-5-21-3328325300-3937145445-4190589019-512)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;
116 SY)(A;;RPLCLORC;;;AU)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;AO)(A;;RPLCLORC;;;PS)(O
117 A;;CR;ab721a55-1e2f-11d0-9819-00aa0040529b;;AU)(OA;;RP;46a9b11d-60ae-405a-b7e
118 8-ff8a58d456d2;;S-1-5-32-560)(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e05
119 29;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;4c164200-20c0-11d0-a
120 768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;5f2020
121 10-79a5-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CI
122 IOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa0030
123 49e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc
124 -9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;bf96
125 7aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c
126 04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;59ba2f42-79a2
127 -11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP
128 ;037088f8-0ae1-11d2-b422-00a0c968f939;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU
129 )(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf967aba-0de6-11d0-a285-0
130 0aa003049e2;RU)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a86-0d
131 e6-11d0-a285-00aa003049e2;ED)""".split())
133 # set SCALE = 100 for normal test, or 1 for testing the test.
137 class UserTests(samba.tests.TestCase):
139 def get_file_blob(self, filename):
140 if filename.endswith('.gz'):
141 f = gzip.open(filename)
146 def get_desc(self, sddl):
147 dummy_sid = security.dom_sid("S-2-0-0")
148 return security.descriptor.from_sddl(sddl, dummy_sid)
150 def get_blob(self, sddl):
151 return ndr_pack(self.get_desc(sddl))
153 def test_00_00_do_nothing(self):
154 # this gives us an idea of the overhead
157 def _test_pack(self, unpacked, cycles=10000):
158 for i in range(SCALE * cycles):
161 def _test_unpack(self, blob, cycles=10000, cls=security.descriptor):
162 for i in range(SCALE * cycles):
163 ndr_unpack(cls, blob)
165 def _test_pack_unpack(self, desc, cycles=5000, cls=security.descriptor):
166 blob2 = ndr_pack(desc)
168 for i in range(SCALE * cycles):
169 blob = ndr_pack(desc)
170 desc = ndr_unpack(cls, blob)
172 self.assertEqual(blob, blob2)
174 def test_pack_big_sd_with_object_aces(self):
175 unpacked = self.get_desc(BIG_SD_SDDL)
176 self._test_pack(unpacked)
178 def test_unpack_big_sd_with_object_aces(self):
179 blob = self.get_blob(BIG_SD_SDDL)
180 self._test_unpack(blob)
182 def test_pack_unpack_big_sd_with_object_aces(self):
183 unpacked = self.get_desc(BIG_SD_SDDL)
184 self._test_pack_unpack(unpacked)
186 def test_pack_little_sd_with_object_aces(self):
187 unpacked = self.get_desc(LITTLE_SD_SDDL)
188 self._test_pack(unpacked)
190 def test_unpack_little_sd_with_object_aces(self):
191 blob = self.get_blob(LITTLE_SD_SDDL)
192 self._test_unpack(blob)
194 def test_pack_unpack_little_sd_with_object_aces(self):
195 unpacked = self.get_desc(LITTLE_SD_SDDL)
196 self._test_pack_unpack(unpacked)
198 def test_unpack_repl_sample(self):
199 blob = self.get_file_blob('testdata/replication-ndrpack-example.gz')
200 self._test_unpack(blob, cycles=20, cls=drsuapi.DsGetNCChangesCtr6)
202 def test_pack_repl_sample(self):
203 blob = self.get_file_blob('testdata/replication-ndrpack-example.gz')
204 desc = ndr_unpack(drsuapi.DsGetNCChangesCtr6, blob)
205 self._test_pack(desc, cycles=20)
208 if "://" not in host:
209 if os.path.isfile(host):
210 host = "tdb://%s" % host
212 host = "ldap://%s" % host
216 runner = SubunitTestRunner()
217 if not runner.run(unittest.TestLoader().loadTestsFromTestCase(
218 UserTests)).wasSuccessful():
222 TestProgram(module=__name__, opts=subunitopts)