Skip to content

Commit 6ac5781

Browse files
committed
Add Observation Tests
Issue gh-991
1 parent a9a0e77 commit 6ac5781

File tree

2 files changed

+92
-11
lines changed

2 files changed

+92
-11
lines changed

core/src/main/java/org/springframework/ldap/core/support/ObservationContextSource.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import javax.naming.ldap.LdapContext;
4141
import javax.naming.ldap.LdapName;
4242

43+
import com.mysema.commons.lang.Assert;
4344
import io.micrometer.common.KeyValue;
4445
import io.micrometer.common.KeyValues;
4546
import io.micrometer.observation.Observation;
@@ -69,9 +70,13 @@ public final class ObservationContextSource implements BaseLdapPathContextSource
6970

7071
private final ObservationRegistry registry;
7172

72-
public ObservationContextSource(BaseLdapPathContextSource contextSource, ObservationRegistry registry) {
73+
public ObservationContextSource(BaseLdapPathContextSource contextSource, ObservationRegistry observationRegistry) {
74+
Assert.notNull(contextSource, "contextSource cannot be null");
75+
Assert.notNull(observationRegistry, "observationRegistry cannot be null");
76+
Assert.isFalse(contextSource instanceof ObservationContextSource,
77+
"contextSource is already wrapped in an ObservationContextSource");
7378
this.contextSource = contextSource;
74-
this.registry = registry;
79+
this.registry = observationRegistry;
7580
this.builder = DirContextOperationObservationContext.withContextSource(this.contextSource);
7681
}
7782

@@ -91,8 +96,8 @@ public DirContext getContext(String principal, String credentials) throws Naming
9196
}
9297

9398
private DirContext wrapDirContext(DirContext delegate) {
94-
if (delegate instanceof DirContextOperations operations) {
95-
return operations;
99+
if (delegate instanceof DirContextOperations) {
100+
return delegate;
96101
}
97102
if (delegate instanceof LdapContext ldap) {
98103
return new ObservationLdapContext(this.builder, ldap, this.registry);

core/src/test/java/org/springframework/ldap/core/support/ObservationContextSourceTests.java

Lines changed: 83 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,40 +20,116 @@
2020

2121
import javax.naming.NamingException;
2222
import javax.naming.directory.DirContext;
23+
import javax.naming.ldap.LdapContext;
24+
import javax.naming.ldap.StartTlsRequest;
2325

2426
import io.micrometer.observation.tck.TestObservationRegistry;
2527
import io.micrometer.observation.tck.TestObservationRegistryAssert;
26-
import org.junit.Test;
28+
import org.junit.jupiter.api.Test;
2729

30+
import org.springframework.ldap.core.DirContextOperations;
31+
32+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
33+
import static org.mockito.BDDMockito.given;
2834
import static org.mockito.Mockito.mock;
2935

36+
/**
37+
* Tests for {@link ObservationContextSource}
38+
*/
3039
public class ObservationContextSourceTests {
3140

3241
private final TestObservationRegistry registry = TestObservationRegistry.create();
3342

43+
private final ObservationContextSource contextSource = new ObservationContextSource(new TestContextSource(),
44+
this.registry);
45+
3446
@Test
35-
public void dirContextGetAttributesWhenObservingThenObserves() throws Exception {
36-
TestContextSource observed = new TestContextSource();
37-
ObservationContextSource observing = new ObservationContextSource(observed, this.registry);
38-
observing.getReadOnlyContext().getAttributes("ou=user,ou=people");
47+
void dirContextGetAttributesWhenObservingThenObserves() throws Exception {
48+
this.contextSource.getReadOnlyContext().getAttributes("ou=user,ou=people");
3949
// @formatter:off
4050
TestObservationRegistryAssert.assertThat(this.registry)
4151
.hasObservationWithNameEqualTo("spring.ldap.dir.context.operations").that()
4252
.hasContextualNameEqualTo("perform get.attributes");
4353
// @formatter:on
4454
}
4555

46-
private final class TestContextSource extends AbstractContextSource {
56+
@Test
57+
void dirContextGetAttributesByNameWhenObservingThenObserves() throws Exception {
58+
this.contextSource.getReadOnlyContext().getAttributes("ou=user,ou=people", new String[] { "id" });
59+
// @formatter:off
60+
TestObservationRegistryAssert.assertThat(this.registry)
61+
.hasObservationWithNameEqualTo("spring.ldap.dir.context.operations").that()
62+
.hasContextualNameEqualTo("perform get.attributes")
63+
.hasHighCardinalityKeyValue("attribute.ids", "[id]");
64+
// @formatter:on
65+
}
66+
67+
@Test
68+
void dirContextRenameWhenObservingThenObserves() throws Exception {
69+
this.contextSource.getReadOnlyContext().rename("ou=user,ou=people", "ou=carrot,ou=people");
70+
// @formatter:off
71+
TestObservationRegistryAssert.assertThat(this.registry)
72+
.hasObservationWithNameEqualTo("spring.ldap.dir.context.operations").that()
73+
.hasContextualNameEqualTo("perform rename");
74+
// @formatter:on
75+
}
76+
77+
@Test
78+
void dirContextWhenDirContextOperationsThenDoesNotObserve() throws Exception {
79+
BaseLdapPathContextSource contextSource = mock(BaseLdapPathContextSource.class);
80+
ObservationContextSource observing = new ObservationContextSource(contextSource, this.registry);
81+
DirContextOperations operations = mock(DirContextOperations.class);
82+
given(contextSource.getReadOnlyContext()).willReturn(operations);
83+
observing.getReadOnlyContext().getAttributes("ou=user,ou=people");
84+
// @formatter:off
85+
TestObservationRegistryAssert.assertThat(this.registry)
86+
.hasNumberOfObservationsEqualTo(0);
87+
// @formatter:on
88+
}
89+
90+
@Test
91+
void ldapContextWhenExtendedOperationThenObserves() throws Exception {
92+
ObservationContextSource observing = new ObservationContextSource(new TestContextSource(true), this.registry);
93+
((LdapContext) observing.getReadOnlyContext()).extendedOperation(new StartTlsRequest());
94+
// @formatter:off
95+
TestObservationRegistryAssert.assertThat(this.registry)
96+
.hasObservationWithNameEqualTo("spring.ldap.dir.context.operations").that()
97+
.hasContextualNameEqualTo("perform extended.operation");
98+
// @formatter:on
99+
}
100+
101+
@Test
102+
void constructorWhenObservationContextSourceThenIllegalArgument() {
103+
assertThatExceptionOfType(IllegalArgumentException.class)
104+
.isThrownBy(() -> new ObservationContextSource(this.contextSource, this.registry));
105+
}
106+
107+
@Test
108+
void constructorWhenNullParametersThenIllegalArgumment() {
109+
assertThatExceptionOfType(IllegalArgumentException.class)
110+
.isThrownBy(() -> new ObservationContextSource(null, this.registry));
111+
assertThatExceptionOfType(IllegalArgumentException.class)
112+
.isThrownBy(() -> new ObservationContextSource(new TestContextSource(), null));
113+
}
114+
115+
private static final class TestContextSource extends AbstractContextSource {
116+
117+
private final boolean ldapContext;
47118

48119
TestContextSource() {
120+
this(false);
121+
}
122+
123+
TestContextSource(boolean ldapContext) {
124+
this.ldapContext = ldapContext;
49125
setUrls(new String[] { "ldap://localhost:1234" });
50126
setBase("dc=example,dc=org");
51127
afterPropertiesSet();
52128
}
53129

54130
@Override
55131
protected DirContext getDirContextInstance(Hashtable<String, Object> environment) throws NamingException {
56-
return mock(DirContext.class);
132+
return this.ldapContext ? mock(LdapContext.class) : mock(DirContext.class);
57133
}
58134

59135
}

0 commit comments

Comments
 (0)