1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
18   *  
19   */
20  package org.apache.directory.server.core.schema;
21  
22  
23  import org.apache.directory.server.core.DefaultDirectoryService;
24  import org.apache.directory.server.core.DirectoryService;
25  import org.apache.directory.server.core.entry.ServerEntry;
26  import org.apache.directory.server.xdbm.Index;
27  import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmIndex;
28  import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartition;
29  import org.apache.directory.server.schema.SerializableComparator;
30  import org.apache.directory.server.schema.bootstrap.ApacheSchema;
31  import org.apache.directory.server.schema.bootstrap.ApachemetaSchema;
32  import org.apache.directory.server.schema.bootstrap.BootstrapSchemaLoader;
33  import org.apache.directory.server.schema.bootstrap.CoreSchema;
34  import org.apache.directory.server.schema.bootstrap.Schema;
35  import org.apache.directory.server.schema.bootstrap.SystemSchema;
36  import org.apache.directory.server.schema.bootstrap.partition.SchemaPartitionExtractor;
37  import org.apache.directory.server.schema.registries.DefaultOidRegistry;
38  import org.apache.directory.server.schema.registries.DefaultRegistries;
39  import org.apache.directory.server.schema.registries.Registries;
40  import org.junit.BeforeClass;
41  import org.junit.Test;
42  
43  import static org.junit.Assert.assertNotNull;
44  import static org.junit.Assert.assertEquals;
45  import static org.junit.Assert.assertTrue;
46  import static org.junit.Assert.assertFalse;
47  
48  import javax.naming.NamingException;
49  import java.io.File;
50  import java.io.IOException;
51  import java.util.HashSet;
52  import java.util.List;
53  import java.util.Map;
54  import java.util.Set;
55  
56  
57  /**
58   * Tests the partition schema loader.
59   * 
60   * TODO move this to core-integ does not belong here and get rid of all the static 
61   *
62   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
63   * @version $Rev$
64   */
65  public class PartitionSchemaLoaderTest
66  {
67      private static Registries registries;
68      private static DirectoryService directoryService;
69      private static JdbmPartition schemaPartition;
70  
71  
72      @BeforeClass public static void setUp() throws Exception
73      {
74          // setup working directory
75          directoryService = new DefaultDirectoryService();
76          File workingDirectory = new File( System.getProperty( "workingDirectory", System.getProperty( "user.dir" ) ) );
77          
78          if ( ! workingDirectory.exists() )
79          {
80              workingDirectory.mkdirs();
81          }
82          
83          directoryService.setWorkingDirectory( workingDirectory );
84          
85          // --------------------------------------------------------------------
86          // Load the bootstrap schemas to start up the schema partition
87          // --------------------------------------------------------------------
88  
89          // setup temporary loader and temp registry 
90          BootstrapSchemaLoader loader = new BootstrapSchemaLoader();
91          registries = new DefaultRegistries( "bootstrap", loader, new DefaultOidRegistry() );
92          directoryService.setRegistries( registries );
93          
94          // load essential bootstrap schemas 
95          Set<Schema> bootstrapSchemas = new HashSet<Schema>();
96          bootstrapSchemas.add( new ApachemetaSchema() );
97          bootstrapSchemas.add( new ApacheSchema() );
98          bootstrapSchemas.add( new CoreSchema() );
99          bootstrapSchemas.add( new SystemSchema() );
100         loader.loadWithDependencies( bootstrapSchemas, registries );
101         
102         // run referential integrity tests
103         List<Throwable> errors = registries.checkRefInteg();
104         
105         if ( !errors.isEmpty() )
106         {
107             NamingException e = new NamingException();
108             e.setRootCause( errors.get( 0 ) );
109             throw e;
110         }
111 
112         SerializableComparator.setRegistry( registries.getComparatorRegistry() );
113 
114         // --------------------------------------------------------------------
115         // If not present extract schema partition from jar
116         // --------------------------------------------------------------------
117 
118         SchemaPartitionExtractor extractor = null; 
119         try
120         {
121             extractor = new SchemaPartitionExtractor( directoryService.getWorkingDirectory() );
122             extractor.extract();
123         }
124         catch ( IOException e )
125         {
126             NamingException ne = new NamingException( "Failed to extract pre-loaded schema partition." );
127             ne.setRootCause( e );
128             throw ne;
129         }
130         
131         // --------------------------------------------------------------------
132         // Initialize schema partition
133         // --------------------------------------------------------------------
134 
135         schemaPartition = new JdbmPartition();
136         schemaPartition.setId( "schema" );
137         schemaPartition.setCacheSize( 1000 );
138 
139         Set<Index<?, ServerEntry>> indexedAttributes = new HashSet<Index<?, ServerEntry>>();
140         for ( String attributeId : extractor.getDbFileListing().getIndexedAttributes() )
141         {
142             indexedAttributes.add( new JdbmIndex<String,ServerEntry>( attributeId ) );
143         }
144 
145         schemaPartition.setIndexedAttributes( indexedAttributes );
146         schemaPartition.setSuffix( "ou=schema" );
147         schemaPartition.init( directoryService );
148     }
149     
150     
151     @Test public void testGetSchemas() throws Exception
152     {
153         PartitionSchemaLoader loader = new PartitionSchemaLoader( schemaPartition, registries );
154         Map<String,Schema> schemas = loader.getSchemas();
155         
156         Schema schema = schemas.get( "mozilla" );
157         assertNotNull( schema );
158         assertEquals( schema.getSchemaName(), "mozilla" );
159         //assertTrue( schema.isDisabled() );
160         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
161         schema = null;
162         
163         schema = schemas.get( "core" );
164         assertNotNull( schema );
165         assertEquals( schema.getSchemaName(), "core" );
166         assertFalse( schema.isDisabled() );
167         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
168         schema = null;
169         
170         schema = schemas.get( "apachedns" );
171         assertNotNull( schema );
172         assertEquals( schema.getSchemaName(), "apachedns" );
173         //assertTrue( schema.isDisabled() );
174         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
175         schema = null;
176         
177         schema = schemas.get( "autofs" );
178         assertNotNull( schema );
179         assertEquals( schema.getSchemaName(), "autofs" );
180         //assertTrue( schema.isDisabled() );
181         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
182         schema = null;
183         
184         schema = schemas.get( "apache" );
185         assertNotNull( schema );
186         assertEquals( schema.getSchemaName(), "apache" );
187         assertFalse( schema.isDisabled() );
188         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
189         schema = null;
190 
191         schema = schemas.get( "cosine" );
192         assertNotNull( schema );
193         assertEquals( schema.getSchemaName(), "cosine" );
194         assertFalse( schema.isDisabled() );
195         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
196         schema = null;
197         
198         schema = schemas.get( "krb5kdc" );
199         assertNotNull( schema );
200         assertEquals( schema.getSchemaName(), "krb5kdc" );
201         //assertTrue( schema.isDisabled() );
202         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
203         schema = null;
204         
205         schema = schemas.get( "samba" );
206         assertNotNull( schema );
207         assertEquals( schema.getSchemaName(), "samba" );
208         //assertTrue( schema.isDisabled() );
209         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
210         schema = null;
211         
212         schema = schemas.get( "collective" );
213         assertNotNull( schema );
214         assertEquals( schema.getSchemaName(), "collective" );
215         assertFalse( schema.isDisabled() );
216         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
217         schema = null;
218         
219         schema = schemas.get( "java" );
220         assertNotNull( schema );
221         assertEquals( schema.getSchemaName(), "java" );
222         assertFalse( schema.isDisabled() );
223         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
224         schema = null;
225         
226         schema = schemas.get( "dhcp" );
227         assertNotNull( schema );
228         assertEquals( schema.getSchemaName(), "dhcp" );
229         //assertTrue( schema.isDisabled() );
230         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
231         schema = null;
232         
233         schema = schemas.get( "corba" );
234         assertNotNull( schema );
235         assertEquals( schema.getSchemaName(), "corba" );
236         //assertTrue( schema.isDisabled() );
237         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
238         schema = null;
239         
240         schema = schemas.get( "nis" );
241         assertNotNull( schema );
242         assertEquals( schema.getSchemaName(), "nis" );
243         //assertTrue( schema.isDisabled() );
244         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
245         schema = null;
246         
247         schema = schemas.get( "inetorgperson" );
248         assertNotNull( schema );
249         assertEquals( schema.getSchemaName(), "inetorgperson" );
250         assertFalse( schema.isDisabled() );
251         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
252         schema = null;
253         
254         schema = schemas.get( "system" );
255         assertNotNull( schema );
256         assertEquals( schema.getSchemaName(), "system" );
257         assertFalse( schema.isDisabled() );
258         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
259         schema = null;
260         
261         schema = schemas.get( "apachemeta" );
262         assertNotNull( schema );
263         assertEquals( schema.getSchemaName(), "apachemeta" );
264         assertFalse( schema.isDisabled() );
265         assertEquals( schema.getOwner(), "uid=admin,ou=system" );
266         schema = null;
267     }
268     
269     
270     @Test public void testGetSchemaNames() throws Exception
271     {
272         PartitionSchemaLoader loader = new PartitionSchemaLoader( schemaPartition, registries );
273         Set<String> schemaNames = loader.getSchemaNames();
274         assertTrue( schemaNames.contains( "mozilla" ) );
275         assertTrue( schemaNames.contains( "core" ) );
276         assertTrue( schemaNames.contains( "apachedns" ) );
277         assertTrue( schemaNames.contains( "autofs" ) );
278         assertTrue( schemaNames.contains( "apache" ) );
279         assertTrue( schemaNames.contains( "cosine" ) );
280         assertTrue( schemaNames.contains( "krb5kdc" ) );
281         assertTrue( schemaNames.contains( "samba" ) );
282         assertTrue( schemaNames.contains( "collective" ) );
283         assertTrue( schemaNames.contains( "java" ) );
284         assertTrue( schemaNames.contains( "dhcp" ) );
285         assertTrue( schemaNames.contains( "corba" ) );
286         assertTrue( schemaNames.contains( "nis" ) );
287         assertTrue( schemaNames.contains( "inetorgperson" ) );
288         assertTrue( schemaNames.contains( "system" ) );
289         assertTrue( schemaNames.contains( "apachemeta" ) );
290     }
291 }