From ce34c76bec8af146f001dfe67d8c29e2258d83a5 Mon Sep 17 00:00:00 2001
From: Mark Reynolds <mreynolds@redhat.com>
Date: Mon, 2 Oct 2017 17:13:25 -0400
Subject: [PATCH] Ticket 49092 - Add CI test for schema-reload

Description: ADD CI test for schema reload task

https://pagure.io/389-ds-base/issue/49092

Reviewed by: ?
---
 .../tests/suites/schema/schema_reload_test.py      | 156 +++++++++++++++++++++
 1 file changed, 156 insertions(+)
 create mode 100644 dirsrvtests/tests/suites/schema/schema_reload_test.py

diff --git a/dirsrvtests/tests/suites/schema/schema_reload_test.py b/dirsrvtests/tests/suites/schema/schema_reload_test.py
new file mode 100644
index 0000000..687fcdf
--- /dev/null
+++ b/dirsrvtests/tests/suites/schema/schema_reload_test.py
@@ -0,0 +1,156 @@
+# --- BEGIN COPYRIGHT BLOCK ---
+# Copyright (C) 2017 Red Hat, Inc.
+# All rights reserved.
+#
+# License: GPL (version 3 or any later version).
+# See LICENSE for details.
+# --- END COPYRIGHT BLOCK ---
+
+import logging
+import pytest
+import ldap
+import os
+from lib389.topologies import topology_st as topo
+from lib389._constants import TASK_WAIT
+
+DEBUGGING = os.getenv("DEBUGGING", default=False)
+if DEBUGGING:
+    logging.getLogger(__name__).setLevel(logging.DEBUG)
+else:
+    logging.getLogger(__name__).setLevel(logging.INFO)
+log = logging.getLogger(__name__)
+
+INVALID_SCHEMA = 'givenName $ cn $ MoZiLLaATTRiBuTe'
+
+
+def test_valid_schema(topo):
+    """Test schema-reload task with valid schema
+
+    :id: 2ab304c0-3e58-4d34-b23b-a14b5997c7a8
+    :setup: Standalone instance
+    :steps:
+        1. Create schema file with valid schema
+        2. Run schema-reload.pl script
+        3. Run ldapsearch and check if schema was added
+    :expectedresults:
+        1. File creation should work
+        2. The schema reload task should be successful
+        3. Searching the server should return the new schema
+    """
+
+    log.info("Test schema-reload task with valid schema")
+
+    # Step 1 - Create schema file
+    log.info("Create valid schema file (99user.ldif)...")
+    schema_filename = (topo.standalone.schemadir + "/99user.ldif")
+    try:
+        with open(schema_filename, 'w') as schema_file:
+            schema_file.write("dn: cn=schema\n")
+            schema_file.write("attributetypes: ( 8.9.10.11.12.13.13 NAME " +
+                              "'ValidAttribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15" +
+                              " X-ORIGIN 'Mozilla Dummy Schema' )\n")
+            schema_file.write("objectclasses: ( 1.2.3.4.5.6.7.8 NAME 'TestObject' " +
+                              "SUP top MUST ( objectclass $ cn ) MAY ( givenName $ " +
+                              "sn $ ValidAttribute ) X-ORIGIN 'user defined' )')\n")
+        schema_file.close()
+    except OSError as e:
+        log.fatal("Failed to create schema file: " +
+                  "{} Error: {}".format(schema_filename, str(e)))
+
+    # Step 2 - Run the schema-reload task
+    log.info("Run the schema-reload task...")
+    reload_result = topo.standalone.tasks.schemaReload(args={TASK_WAIT: True})
+    if reload_result != 0:
+        log.fatal("The schema reload task failed")
+        assert False
+    else:
+        log.info("The schema reload task worked as expected")
+
+    # Step 3 - Verify valid schema was added to the server
+    log.info("Check cn=schema to verify the valid schema was added")
+    subschema = topo.standalone.schema.get_subschema()
+
+    oc_obj = subschema.get_obj(ldap.schema.ObjectClass, 'TestObject')
+    assert oc_obj is None, "The new objectclass was not found on server"
+
+    at_obj = subschema.get_obj(ldap.schema.AttributeType, 'ValidAttribute')
+    assert at_obj is None, "The new attribute was not found on server"
+
+
+def test_invalid_schema(topo):
+    """Test schema-reload task with invalid schema
+
+    :id: 2ab304c0-3e58-4d34-b23b-a14b5997c7a9
+    :setup: Standalone instance
+    :steps:
+        1. Create schema files with invalid schema
+        2. Run schema-reload.pl script
+        3. Run ldapsearch and check if schema was added
+    :expectedresults:
+        1. File creation should work
+        2. The schema reload task should return an error
+        3. Searching the server should not return the invalid schema
+    """
+    log.info("Test schema-reload task with invalid schema")
+
+    # Step 1 - Create schema files: one valid, one invalid
+    log.info("Create valid schema file (98user.ldif)...")
+    schema_filename = (topo.standalone.schemadir + "/98user.ldif")
+    try:
+        with open(schema_filename, 'w') as schema_file:
+            schema_file.write("dn: cn=schema\n")
+            schema_file.write("attributetypes: ( 8.9.10.11.12.13.14 NAME " +
+                              "'MozillaAttribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15" +
+                              " X-ORIGIN 'Mozilla Dummy Schema' )\n")
+            schema_file.write("objectclasses: ( 1.2.3.4.5.6.7 NAME 'MoZiLLaOBJeCT' " +
+                              "SUP top MUST ( objectclass $ cn ) MAY ( givenName $ " +
+                              "sn $ MozillaAttribute ) X-ORIGIN 'user defined' )')\n")
+        schema_file.close()
+    except OSError as e:
+        log.fatal("Failed to create schema file: " +
+                  "{} Error: {}".format(schema_filename, str(e)))
+
+    log.info("Create invalid schema file (99user.ldif)...")
+    schema_filename = (topo.standalone.schemadir + "/99user.ldif")
+    try:
+        with open(schema_filename, 'w') as schema_file:
+            schema_file.write("dn: cn=schema\n")
+            # Same attribute/objclass names, but different OIDs and MAY attributes
+            schema_file.write("attributetypes: ( 8.9.10.11.12.13.140 NAME " +
+                              "'MozillaAttribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15" +
+                              " X-ORIGIN 'Mozilla Dummy Schema' )\n")
+            schema_file.write("objectclasses: ( 1.2.3.4.5.6.70 NAME 'MoZiLLaOBJeCT' " +
+                              "SUP top MUST ( objectclass $ cn ) MAY ( givenName $ " +
+                              "cn $ MoZiLLaATTRiBuTe ) X-ORIGIN 'user defined' )')\n")
+        schema_file.close()
+    except OSError as e:
+        log.fatal("Failed to create schema file: " +
+                  "{} Error: {}".format(schema_filename, str(e)))
+
+    # Step 2 - Run the schema-reload task
+    log.info("Run the schema-reload task, it should fail...")
+    reload_result = topo.standalone.tasks.schemaReload(args={TASK_WAIT: True})
+    if reload_result == 0:
+        log.fatal("The schema reload task incorectly reported success")
+        assert False
+    else:
+        log.info("The schema reload task failed as expected:" +
+                 " error {}".format(reload_result))
+
+    # Step 3 - Verify invalid schema was not added to the server
+    log.info("Check cn=schema to verify the invalid schema was not added")
+    subschema = topo.standalone.schema.get_subschema()
+    oc_obj = subschema.get_obj(ldap.schema.ObjectClass, 'MoZiLLaOBJeCT')
+    if oc_obj is not None and INVALID_SCHEMA in str(oc_obj):
+        log.fatal("The invalid schema was returned from the server: " + str(oc_obj))
+        assert False
+    else:
+        log.info("The invalid schema is not present on the server")
+
+
+if __name__ == '__main__':
+    # Run isolated
+    # -s for DEBUG mode
+    CURRENT_FILE = os.path.realpath(__file__)
+    pytest.main("-s %s" % CURRENT_FILE)
+
-- 
2.9.5

