mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noël Rouvignac
02.08.2015 427fa0913cb9a738f055904f6df776df7ff805b5
Fixed NPE when searching an inexistent DN with scope SINGLE_LEVEL or SUBORDINATES + added tests

DN2ID.java:
changed the limit fields to be ByteSequence so they do not need an additional conversion to ByteString.
2 files modified
108 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2ID.java 8 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/core/SearchOperationTestCase.java 100 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/DN2ID.java
@@ -285,14 +285,14 @@
      SequentialCursorDecorator<Cursor<ByteString, ByteString>, ByteString, ByteString>
  {
    private final ByteStringBuilder builder;
    private final ByteString limit;
    private final ByteSequence limit;
    private boolean cursorOnParent;
    ChildrenCursor(Cursor<ByteString, ByteString> delegate)
    {
      super(delegate);
      builder = new ByteStringBuilder(128);
      limit = delegate.isDefined() ? afterKey(delegate.getKey()).toByteString() : null;
      limit = delegate.isDefined() ? afterKey(delegate.getKey()) : ByteString.empty();
      cursorOnParent = true;
    }
@@ -323,12 +323,12 @@
  private static final class SubtreeCursor extends
      SequentialCursorDecorator<Cursor<ByteString, ByteString>, ByteString, ByteString>
  {
    private final ByteString limit;
    private final ByteSequence limit;
    SubtreeCursor(Cursor<ByteString, ByteString> delegate)
    {
      super(delegate);
      limit = delegate.isDefined() ? afterKey(delegate.getKey()).toByteString() : null;
      limit = delegate.isDefined() ? afterKey(delegate.getKey()) : ByteString.empty();
    }
    @Override
opendj-server-legacy/src/test/java/org/opends/server/core/SearchOperationTestCase.java
@@ -303,6 +303,106 @@
  }
  @Test
  public void testSearchNonExistingDN_baseObject() throws Exception
  {
    InvocationCounterPlugin.resetAllCounters();
    SearchRequest request =
        Requests.newSearchRequest("uid=doesNotExist," + BASE, SearchScope.BASE_OBJECT, "(objectclass=*)");
    InternalSearchOperation searchOp = getRootConnection().processSearch(request);
    assertThat(searchOp.getResultCode()).isEqualTo(ResultCode.NO_SUCH_OBJECT);
  }
  @Test
  public void testSearchExistingDN_baseObject() throws Exception
  {
    InvocationCounterPlugin.resetAllCounters();
    SearchRequest request = Requests.newSearchRequest(BASE, SearchScope.BASE_OBJECT, "(objectclass=*)");
    InternalSearchOperation searchOp = getRootConnection().processSearch(request);
    assertThat(searchOp.getResultCode()).isEqualTo(ResultCode.SUCCESS);
    assertThat(getEntryNames(searchOp)).containsExactly(BASE);
  }
  @Test
  public void testSearchNonExistingDN_singleLevel() throws Exception
  {
    InvocationCounterPlugin.resetAllCounters();
    SearchRequest request =
        Requests.newSearchRequest("uid=doesNotExist," + BASE, SearchScope.SINGLE_LEVEL, "(objectclass=*)");
    InternalSearchOperation searchOp = getRootConnection().processSearch(request);
    assertThat(searchOp.getResultCode()).isEqualTo(ResultCode.NO_SUCH_OBJECT);
  }
  @Test
  public void testSearchExistingDN_singleLevel() throws Exception
  {
    InvocationCounterPlugin.resetAllCounters();
    SearchRequest request = Requests.newSearchRequest(BASE, SearchScope.SINGLE_LEVEL, "(objectclass=*)");
    InternalSearchOperation searchOp = getRootConnection().processSearch(request);
    assertThat(searchOp.getResultCode()).isEqualTo(ResultCode.SUCCESS);
    assertThat(getEntryNames(searchOp)).containsExactly(
        "uid=rogasawara," + BASE,
        "ou=level1," + BASE);
  }
  @Test
  public void testSearchNonExisting_subordinates() throws Exception
  {
    InvocationCounterPlugin.resetAllCounters();
    SearchRequest request =
        Requests.newSearchRequest("uid=doesNotExist," + BASE, SearchScope.SUBORDINATES, "(objectclass=*)");
    InternalSearchOperation searchOp = getRootConnection().processSearch(request);
    assertThat(searchOp.getResultCode()).isEqualTo(ResultCode.NO_SUCH_OBJECT);
  }
  @Test
  public void testSearchExistingDN_subordinates() throws Exception
  {
    InvocationCounterPlugin.resetAllCounters();
    SearchRequest request = Requests.newSearchRequest(BASE, SearchScope.SUBORDINATES, "(objectclass=*)");
    InternalSearchOperation searchOp = getRootConnection().processSearch(request);
    assertThat(searchOp.getResultCode()).isEqualTo(ResultCode.SUCCESS);
    assertThat(getEntryNames(searchOp)).containsExactly(
        "uid=rogasawara," + BASE,
        "ou=level1," + BASE,
        "ou=level2,ou=level1," + BASE);
  }
  @Test
  public void testSearchNonExisting_wholeSubtree() throws Exception
  {
    InvocationCounterPlugin.resetAllCounters();
    SearchRequest request =
        Requests.newSearchRequest("uid=doesNotExist," + BASE, SearchScope.WHOLE_SUBTREE, "(objectclass=*)");
    InternalSearchOperation searchOp = getRootConnection().processSearch(request);
    assertThat(searchOp.getResultCode()).isEqualTo(ResultCode.NO_SUCH_OBJECT);
  }
  @Test
  public void testSearchExistingDN_wholeSubtree() throws Exception
  {
    InvocationCounterPlugin.resetAllCounters();
    SearchRequest request = Requests.newSearchRequest(BASE, SearchScope.WHOLE_SUBTREE, "(objectclass=*)");
    InternalSearchOperation searchOp = getRootConnection().processSearch(request);
    assertThat(searchOp.getResultCode()).isEqualTo(ResultCode.SUCCESS);
    assertThat(getEntryNames(searchOp)).containsExactly(
        BASE,
        "uid=rogasawara," + BASE,
        "ou=level1," + BASE,
        "ou=level2,ou=level1," + BASE);
  }
  private List<String> getEntryNames(InternalSearchOperation searchOp)
  {
    List<SearchResultEntry> entries = searchOp.getSearchEntries();
    List<String> results = new ArrayList<>(entries.size());
    for (SearchResultEntry entry : entries)
    {
      results.add(entry.getName().toString());
    }
    return results;
  }
  @Test
  public void testSearchInternalUnspecifiedAttributes() throws Exception
  {
    InternalSearchOperation searchOperation = newInternalSearchOperation("(objectclass=inetorgperson)");