From 8d87254b4576d48cc6cbd69765f9f3d7df95e32c Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 28 Jun 2011 16:46:41 +0000
Subject: [PATCH] Fix OPENDJ-220: Make sure that SchemaBuilder is re-usable after calling toSchema

---
 opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTest.java |  117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 117 insertions(+), 0 deletions(-)

diff --git a/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTest.java b/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTest.java
index e2374cb..3b6125c 100644
--- a/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTest.java
+++ b/opendj3/opendj-ldap-sdk/src/test/java/org/forgerock/opendj/ldap/schema/SchemaBuilderTest.java
@@ -182,6 +182,98 @@
 
 
   /**
+   * Tests that it is possible to create a schema which is an exact copy of
+   * another and take advantage of copy on write.
+   */
+  @Test
+  public void testCopyOnWriteNoChanges()
+  {
+    final Schema baseSchema = Schema.getCoreSchema();
+    final Schema schema = new SchemaBuilder(baseSchema).toSchema();
+
+    assertThat(schema).isSameAs(baseSchema);
+  }
+
+
+
+  /**
+   * Tests that it is possible to create a schema which is based on another.
+   */
+  @Test
+  public void testCopyOnWriteWithChanges()
+  {
+    final Schema baseSchema = Schema.getCoreSchema();
+    final Schema schema = new SchemaBuilder(baseSchema).addAttributeType(
+        "( testtype-oid NAME 'testtype' SUP name )", false).toSchema();
+    assertThat(schema).isNotSameAs(baseSchema);
+    assertThat(schema.getObjectClasses().containsAll(
+        baseSchema.getObjectClasses()));
+    assertThat(schema.getObjectClasses().size()).isEqualTo(
+        baseSchema.getObjectClasses().size());
+    assertThat(schema.getAttributeTypes().containsAll(
+        baseSchema.getAttributeTypes()));
+    assertThat(schema.getAttributeType("testtype")).isNotNull();
+    assertThat(schema.getSchemaName()).isEqualTo(baseSchema.getSchemaName());
+    assertThat(schema.allowMalformedNamesAndOptions()).isEqualTo(
+        baseSchema.allowMalformedNamesAndOptions());
+  }
+
+
+
+  /**
+   * Tests that it is possible to create an empty schema.
+   */
+  @Test
+  public void testCreateEmptySchema()
+  {
+    final Schema schema = new SchemaBuilder().toSchema();
+    assertThat(schema.getAttributeTypes()).isEmpty();
+    assertThat(schema.getObjectClasses()).isEmpty();
+    assertThat(schema.getSyntaxes()).isEmpty();
+    assertThat(schema.getWarnings()).isEmpty();
+    // Could go on...
+  }
+
+
+
+  /**
+   * Tests that multiple consecutive invocations of toSchema return the exact
+   * same schema.
+   */
+  @Test
+  public void testMultipleToSchema1()
+  {
+    final Schema baseSchema = Schema.getCoreSchema();
+    final SchemaBuilder builder = new SchemaBuilder(baseSchema);
+    final Schema schema1 = builder.toSchema();
+    final Schema schema2 = builder.toSchema();
+    assertThat(schema1).isSameAs(baseSchema);
+    assertThat(schema1).isSameAs(schema2);
+  }
+
+
+
+  /**
+   * Tests that multiple consecutive invocations of toSchema return the exact
+   * same schema.
+   */
+  @Test
+  public void testMultipleToSchema2()
+  {
+    final SchemaBuilder builder = new SchemaBuilder()
+        .addAttributeType(
+            "( testtype-oid NAME 'testtype' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
+            false);
+    final Schema schema1 = builder.toSchema();
+    final Schema schema2 = builder.toSchema();
+    assertThat(schema1).isSameAs(schema2);
+    assertThat(schema1.getAttributeType("testtype")).isNotNull();
+    assertThat(schema2.getAttributeType("testtype")).isNotNull();
+  }
+
+
+
+  /**
    * Tests that schema validation resolves dependencies between parent/child
    * object classes regardless of the order in which they were added.
    */
@@ -302,4 +394,29 @@
       // Expected.
     }
   }
+
+
+
+  /**
+   * Tests that a schema builder can be re-used after toSchema has been called.
+   */
+  @Test
+  public void testReuseSchemaBuilder()
+  {
+    final SchemaBuilder builder = new SchemaBuilder();
+    final Schema schema1 = builder
+        .addAttributeType(
+            "( testtype1-oid NAME 'testtype1' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
+            false).toSchema();
+
+    final Schema schema2 = builder
+        .addAttributeType(
+            "( testtype2-oid NAME 'testtype2' SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
+            false).toSchema();
+    assertThat(schema1).isNotSameAs(schema2);
+    assertThat(schema1.getAttributeType("testtype1")).isNotNull();
+    assertThat(schema1.hasAttributeType("testtype2")).isFalse();
+    assertThat(schema2.getAttributeType("testtype1")).isNotNull();
+    assertThat(schema2.getAttributeType("testtype2")).isNotNull();
+  }
 }

--
Gitblit v1.10.0