From 936802b266b33db53f92707e7b92f381e87ed290 Mon Sep 17 00:00:00 2001
From: Christophe Sovant <christophe.sovant@forgerock.com>
Date: Mon, 21 Dec 2009 16:44:30 +0000
Subject: [PATCH] Frontport of 2.2 tests to the trunk

---
 opends/tests/staf-tests/shared/python/schema.py |   68 ++++++++++++++++++++++++++--------
 1 files changed, 52 insertions(+), 16 deletions(-)

diff --git a/opends/tests/staf-tests/shared/python/schema.py b/opends/tests/staf-tests/shared/python/schema.py
index 68a67ec..ce017ed 100644
--- a/opends/tests/staf-tests/shared/python/schema.py
+++ b/opends/tests/staf-tests/shared/python/schema.py
@@ -39,10 +39,13 @@
   of both objeclasses, and attributtypes"""
   
   def __init__(self, schema=None):
-    self.dict = {}
+    self.attrDict = {}
+    self.objDict = {}
     self.sup = {}
     self.may = {}
     self.must = {}
+    self.allmay = []
+    self.allmust = []
 
   def _getOID(self, line):
     """given a schema entry definition for objectclass/attributtype
@@ -50,6 +53,7 @@
     the List of aliases starts from list of names[1:] when exist. for ex :
        attributeTypes: ( 2.5.4.4 NAME ( 'sn' 'surname' ) SUP name X-ORIGIN 'RFC 4519' )
        (2.5.4.4,['sn','surname']
+    More details : https://www.opends.org/wiki/page/AttributeTypeDescriptionFormat
     """
     pNdx = line.find('(')
     nNdx = line.find('NAME',pNdx)
@@ -58,11 +62,17 @@
     # populate the NAME to OID : "dict" dictionary
     NAMES = self._getStr(line,'NAME')
     if NAMES:
-      # TODO encoded schema is not handled for now
-      self.dict.update({OID:NAMES})
-      for name in NAMES:
-        self.dict.update({name:OID})
-    # populate SUP and MUST / MAY, : "sup", "may", "must" dictionaries
+      if line.startswith('objectClasses:'):
+        # TODO encoded schema is not handled for now
+        self.objDict.update({OID:NAMES})
+        for name in NAMES:
+          self.objDict.update({name:OID})
+      elif line.startswith('attributeTypes:'):
+         # TODO encoded schema is not handled for now
+        self.attrDict.update({OID:NAMES})
+        for name in NAMES:
+          self.attrDict.update({name:OID})
+   # populate SUP and MUST / MAY, : "sup", "may", "must" dictionaries
     if line.startswith('objectClasses:'):
       r = self._getStr(line,'SUP')
       if r:
@@ -70,9 +80,15 @@
       r = self._getStr(line,'MUST')
       if r:
         self.must.update({NAMES[0]:r})
+        for m in r:
+          if not m in self.allmust:
+            self.allmust.append(m)
       r = self._getStr(line,'MAY')
       if r:
         self.may.update({NAMES[0]:r})
+        for m in r:
+          if not m in self.allmay:
+            self.allmay.append(m)
 
     return OID, NAMES
 
@@ -111,7 +127,7 @@
           elif s[0] != '$' and s[0] != '|':
             if s[0] == '\'' and s[-1] == '\'':
               s = s[1:-1]
-            realStrs.append(s)
+            realStrs.append(s.lower())
     return realStrs
 
   def getMust(self, objectclassname):
@@ -160,38 +176,46 @@
     and attributetypes only."""
     lines=[]
     line=''
-    for f in ref_content:
+    for f in ref_content.splitlines():
       if len(line) == 0 and \
          not (f.startswith("objectClasses") or \
               f.startswith("attributeTypes")):
         # not handled for now
         continue
-      elif len(line) > 0 and f[0].isspace():
+      elif len(line) > 0 and len(f) > 0 and f[0].isspace():
           # line continuation aggregated into 'line'
-          line += f[1:-1]
+          line += f[1:]
 
       elif f.startswith("objectClasses") or f.startswith("attributeTypes"):
         if len(line) > 0:
           lines.append(line)
           # populate the OID <-> Names dictionary
           self._getOID(line)
-        line =f[:-1]
-        line = f.strip()
+        line = f[:-1]
+        line = f
     if len(line) > 0:
+      # parsing the last line
+      self._getOID(line)
       lines.append(line)
+    f=open('/tmp/lines.ldif','w')
+    f.write('\n'.join(lines))
+    f.close()
 
 if __name__ == '__main__':
    """get example schema.ldif file with :
-      ldapsearch -b 'cn=schema' -Dcn=directory\ manager -s base -wpassword objectclass=* objectClasses attributeTypes
+      ldapsearch -b 'cn=schema' -Dcn=directory\ manager -s base -wpassword objectclass=* objectClasses attributeTypes > /tmp/schema.ldif
    """
    objectClassesFileName='/tmp/schema.ldif'
    f = open(objectClassesFileName)
    fc = f.readlines()
    f.close()
    oidDict = OIDDict()
-   oidDict.parseSchema(fc)
-   print '[ dictionary ]'.center(80, '-')
-   for k,v in oidDict.dict.items():
+   oidDict.parseSchema(''.join(fc))
+   print '[ Objectclasses dictionary ]'.center(80, '-')
+   for k,v in oidDict.objDict.items():
+     print "%s\t%s"%(k,v)
+   print '[ AttributeTypes dictionary ]'.center(80, '-')
+   for k,v in oidDict.attrDict.items():
      print "%s\t%s"%(k,v)
    print '[ must ]'.center(80, '-')
    for k,v in oidDict.must.items():
@@ -214,3 +238,15 @@
        print 'MAY',oidDict.getMay(cn)
      except Exception, e:
        print e.message
+   print '[ all must ]'.center(80,'-')
+   mustSize = 0
+   for m in oidDict.allmust:
+     mustSize += len(m)
+   print 'got %s MUSTs size = %sKb' % (len(oidDict.allmust),mustSize/1024.0)
+   print oidDict.allmust
+   print '[ all may ]'.center(80,'-')
+   maySize = 0
+   for m in oidDict.allmay:
+     maySize += len(m)
+   print 'got %s MAYs size = %sKb' % (len(oidDict.allmay),maySize/1024.0)
+   print oidDict.allmay

--
Gitblit v1.10.0