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