From 4ee0542a2f56c0d00e5f4b3713730389cc23f335 Mon Sep 17 00:00:00 2001 From: CoderYellow Date: Sun, 28 Jun 2026 10:53:21 +0800 Subject: [PATCH] test: add unit test for LDIF file loading in name order - Introduced `ServiceBuilderLdifOrderTest` to verify LDIF files are processed in alphabetical order. - Updated `ServiceBuilder` to sort LDIF files before processing. --- .../server/config/builder/ServiceBuilder.java | 8 +++ .../builder/ServiceBuilderLdifOrderTest.java | 64 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 service-builder/src/test/java/org/apache/directory/server/config/builder/ServiceBuilderLdifOrderTest.java diff --git a/service-builder/src/main/java/org/apache/directory/server/config/builder/ServiceBuilder.java b/service-builder/src/main/java/org/apache/directory/server/config/builder/ServiceBuilder.java index b85f7e19af..a105231067 100644 --- a/service-builder/src/main/java/org/apache/directory/server/config/builder/ServiceBuilder.java +++ b/service-builder/src/main/java/org/apache/directory/server/config/builder/ServiceBuilder.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.lang.reflect.Constructor; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -410,6 +411,13 @@ private static void loadEntries( File ldifFile, List entries ) throws { File[] files = ldifFile.listFiles( ldifFilter ); + if ( files == null ) + { + return; + } + + Arrays.sort( files ); + for ( File f : files ) { loadEntries( f, entries ); diff --git a/service-builder/src/test/java/org/apache/directory/server/config/builder/ServiceBuilderLdifOrderTest.java b/service-builder/src/test/java/org/apache/directory/server/config/builder/ServiceBuilderLdifOrderTest.java new file mode 100644 index 0000000000..9dff7a2af7 --- /dev/null +++ b/service-builder/src/test/java/org/apache/directory/server/config/builder/ServiceBuilderLdifOrderTest.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.server.config.builder; + + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.List; + +import org.apache.directory.api.ldap.model.ldif.LdifEntry; +import org.junit.jupiter.api.Test; + + +public class ServiceBuilderLdifOrderTest +{ + @Test + public void testReadTestEntriesLoadsDirectoryFilesInNameOrder() throws Exception + { + File ldifDirectory = Files.createTempDirectory( "ldif-order" ).toFile(); + + Files.write( new File( ldifDirectory, "20-second.ldif" ).toPath(), Arrays.asList( + "dn: cn=second,ou=system", + "objectClass: person", + "objectClass: top", + "cn: second", + "sn: second", + "" ), StandardCharsets.UTF_8 ); + + Files.write( new File( ldifDirectory, "10-first.ldif" ).toPath(), Arrays.asList( + "dn: cn=first,ou=system", + "objectClass: person", + "objectClass: top", + "cn: first", + "sn: first", + "" ), StandardCharsets.UTF_8 ); + + List entries = ServiceBuilder.readTestEntries( ldifDirectory.getAbsolutePath() ); + + assertEquals( 2, entries.size() ); + assertEquals( "cn=first,ou=system", entries.get( 0 ).getDn().getName() ); + assertEquals( "cn=second,ou=system", entries.get( 1 ).getDn().getName() ); + } +}