s4/drs-tests: Add a base class to hold common functionality for all DRS python tests
[Samba.git] / source4 / torture / drs / python / drs_base.py
blobf6ae439e791e4840720164ed7c31fe7785c1deea
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
4 # Unix SMB/CIFS implementation.
5 # Copyright (C) Kamen Mazdrashki <kamenim@samba.org> 2011
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
22 import sys
23 import time
24 import os
26 sys.path.insert(0, "bin/python")
27 import samba
28 samba.ensure_external_module("testtools", "testtools")
29 samba.ensure_external_module("subunit", "subunit/python")
31 from ldb import (
32 SCOPE_BASE,
33 Message,
34 FLAG_MOD_REPLACE,
37 import samba.tests
40 class DrsBaseTestCase(samba.tests.BlackboxTestCase):
41 """Base class implementation for all DRS python tests.
42 It is intended to provide common initialization and
43 and functionality used by all DRS tests in drs/python
44 test package. For instance, DC1 and DC2 are always used
45 to pass URLs for DCs to test against"""
47 def setUp(self):
48 super(DrsBaseTestCase, self).setUp()
50 # connect to DCs
51 url_dc = samba.tests.env_get_var_value("DC1")
52 (self.ldb_dc1, self.info_dc1) = samba.tests.connect_samdb_ex(url_dc,
53 ldap_only=True)
54 url_dc = samba.tests.env_get_var_value("DC2")
55 (self.ldb_dc2, self.info_dc2) = samba.tests.connect_samdb_ex(url_dc,
56 ldap_only=True)
58 # cache some of RootDSE props
59 self.schema_dn = self.info_dc1["schemaNamingContext"][0]
60 self.domain_dn = self.info_dc1["defaultNamingContext"][0]
61 self.config_dn = self.info_dc1["configurationNamingContext"][0]
62 self.forest_level = int(self.info_dc1["forestFunctionality"][0])
64 # we will need DCs DNS names for 'samba-tool drs' command
65 self.dnsname_dc1 = self.info_dc1["dnsHostName"][0]
66 self.dnsname_dc2 = self.info_dc2["dnsHostName"][0]
68 def tearDown(self):
69 super(DrsBaseTestCase, self).tearDown()
71 def _GUID_string(self, guid):
72 return self.ldb_dc1.schema_format_value("objectGUID", guid)
74 def _ldap_schemaUpdateNow(self, sam_db):
75 rec = {"dn": "",
76 "schemaUpdateNow": "1"}
77 m = Message.from_dict(sam_db, rec, FLAG_MOD_REPLACE)
78 sam_db.modify(m)
80 def _deleted_objects_dn(self, sam_ldb):
81 wkdn = "<WKGUID=18E2EA80684F11D2B9AA00C04F79F805,%s>" % self.domain_dn
82 res = sam_ldb.search(base=wkdn,
83 scope=SCOPE_BASE,
84 controls=["show_deleted:1"])
85 self.assertEquals(len(res), 1)
86 return str(res[0]["dn"])
88 def _make_obj_name(self, prefix):
89 return prefix + time.strftime("%s", time.gmtime())
91 def _net_drs_replicate(self, DC, fromDC, nc_dn=None):
92 if nc_dn is None:
93 nc_dn = self.domain_dn
94 # find out where is net command
95 samba_tool_cmd = os.path.abspath("./bin/samba-tool")
96 # make command line credentials string
97 creds = self.get_credentials()
98 cmd_line_auth = "-U%s/%s%%%s" % (creds.get_domain(),
99 creds.get_username(), creds.get_password())
100 # bin/samba-tool drs replicate <Dest_DC_NAME> <Src_DC_NAME> <Naming Context>
101 cmd_line = "%s drs replicate %s %s %s %s" % (samba_tool_cmd, DC, fromDC,
102 nc_dn, cmd_line_auth)
103 self.check_run(cmd_line)