33 * SPDX-License-Identifier: Apache-2.0
44 */
55
6+ package io .opentelemetry .cassandra .v4 .common ;
7+
68import static io .opentelemetry .sdk .testing .assertj .OpenTelemetryAssertions .equalTo ;
79import static io .opentelemetry .sdk .testing .assertj .OpenTelemetryAssertions .satisfies ;
810import static io .opentelemetry .semconv .trace .attributes .SemanticAttributes .DB_CASSANDRA_CONSISTENCY_LEVEL ;
2628import com .datastax .oss .driver .api .core .config .DriverConfigLoader ;
2729import com .datastax .oss .driver .internal .core .config .typesafe .DefaultDriverConfigLoader ;
2830import io .opentelemetry .api .trace .SpanKind ;
29- import io .opentelemetry .instrumentation .testing .junit .AgentInstrumentationExtension ;
3031import io .opentelemetry .instrumentation .testing .junit .InstrumentationExtension ;
3132import java .net .InetSocketAddress ;
3233import java .time .Duration ;
3334import java .util .stream .Stream ;
3435import org .junit .jupiter .api .AfterAll ;
3536import org .junit .jupiter .api .BeforeAll ;
36- import org .junit .jupiter .api .extension .RegisterExtension ;
3737import org .junit .jupiter .params .ParameterizedTest ;
3838import org .junit .jupiter .params .provider .Arguments ;
3939import org .junit .jupiter .params .provider .MethodSource ;
4242import org .testcontainers .containers .GenericContainer ;
4343import org .testcontainers .containers .output .Slf4jLogConsumer ;
4444
45- public class CassandraClientTest {
46-
47- private static final Logger logger = LoggerFactory .getLogger (CassandraClientTest .class );
45+ public abstract class AbstractCassandraTest {
4846
49- @ RegisterExtension
50- static final InstrumentationExtension testing = AgentInstrumentationExtension .create ();
47+ private static final Logger logger = LoggerFactory .getLogger (AbstractCassandraTest .class );
5148
5249 @ SuppressWarnings ("rawtypes" )
5350 private static GenericContainer cassandra ;
5451
55- private static int cassandraPort ;
52+ protected static int cassandraPort ;
53+
54+ protected abstract InstrumentationExtension testing ();
55+
56+ protected CqlSession wrap (CqlSession session ) {
57+ return session ;
58+ }
5659
5760 @ BeforeAll
5861 static void beforeAll () {
@@ -79,30 +82,33 @@ void syncTest(Parameter parameter) {
7982
8083 session .execute (parameter .statement );
8184
82- testing .waitAndAssertTraces (
83- trace ->
84- trace .hasSpansSatisfyingExactly (
85- span ->
86- span .hasName (parameter .spanName )
87- .hasKind (SpanKind .CLIENT )
88- .hasNoParent ()
89- .hasAttributesSatisfyingExactly (
90- equalTo (NET_SOCK_PEER_ADDR , "127.0.0.1" ),
91- equalTo (NET_SOCK_PEER_NAME , "localhost" ),
92- equalTo (NET_SOCK_PEER_PORT , cassandraPort ),
93- equalTo (DB_SYSTEM , "cassandra" ),
94- equalTo (DB_NAME , parameter .keyspace ),
95- equalTo (DB_STATEMENT , parameter .expectedStatement ),
96- equalTo (DB_OPERATION , parameter .operation ),
97- equalTo (DB_CASSANDRA_CONSISTENCY_LEVEL , "LOCAL_ONE" ),
98- equalTo (DB_CASSANDRA_COORDINATOR_DC , "datacenter1" ),
99- satisfies (
100- DB_CASSANDRA_COORDINATOR_ID , val -> val .isInstanceOf (String .class )),
101- satisfies (
102- DB_CASSANDRA_IDEMPOTENCE , val -> val .isInstanceOf (Boolean .class )),
103- equalTo (DB_CASSANDRA_PAGE_SIZE , 5000 ),
104- equalTo (DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT , 0 ),
105- equalTo (DB_CASSANDRA_TABLE , parameter .table ))));
85+ testing ()
86+ .waitAndAssertTraces (
87+ trace ->
88+ trace .hasSpansSatisfyingExactly (
89+ span ->
90+ span .hasName (parameter .spanName )
91+ .hasKind (SpanKind .CLIENT )
92+ .hasNoParent ()
93+ .hasAttributesSatisfyingExactly (
94+ equalTo (NET_SOCK_PEER_ADDR , "127.0.0.1" ),
95+ equalTo (NET_SOCK_PEER_NAME , "localhost" ),
96+ equalTo (NET_SOCK_PEER_PORT , cassandraPort ),
97+ equalTo (DB_SYSTEM , "cassandra" ),
98+ equalTo (DB_NAME , parameter .keyspace ),
99+ equalTo (DB_STATEMENT , parameter .expectedStatement ),
100+ equalTo (DB_OPERATION , parameter .operation ),
101+ equalTo (DB_CASSANDRA_CONSISTENCY_LEVEL , "LOCAL_ONE" ),
102+ equalTo (DB_CASSANDRA_COORDINATOR_DC , "datacenter1" ),
103+ satisfies (
104+ DB_CASSANDRA_COORDINATOR_ID ,
105+ val -> val .isInstanceOf (String .class )),
106+ satisfies (
107+ DB_CASSANDRA_IDEMPOTENCE ,
108+ val -> val .isInstanceOf (Boolean .class )),
109+ equalTo (DB_CASSANDRA_PAGE_SIZE , 5000 ),
110+ equalTo (DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT , 0 ),
111+ equalTo (DB_CASSANDRA_TABLE , parameter .table ))));
106112
107113 session .close ();
108114 }
@@ -112,42 +118,48 @@ void syncTest(Parameter parameter) {
112118 void asyncTest (Parameter parameter ) throws Exception {
113119 CqlSession session = getSession (parameter .keyspace );
114120
115- testing .runWithSpan (
116- "parent" ,
117- () ->
118- session
119- .executeAsync (parameter .statement )
120- .toCompletableFuture ()
121- .whenComplete ((result , throwable ) -> testing .runWithSpan ("child" , () -> {}))
122- .get ());
121+ testing ()
122+ .runWithSpan (
123+ "parent" ,
124+ () ->
125+ session
126+ .executeAsync (parameter .statement )
127+ .toCompletableFuture ()
128+ .whenComplete ((result , throwable ) -> testing ().runWithSpan ("child" , () -> {}))
129+ .get ());
123130
124- testing .waitAndAssertTraces (
125- trace ->
126- trace .hasSpansSatisfyingExactly (
127- span -> span .hasName ("parent" ).hasKind (SpanKind .INTERNAL ).hasNoParent (),
128- span ->
129- span .hasName (parameter .spanName )
130- .hasKind (SpanKind .CLIENT )
131- .hasParent (trace .getSpan (0 ))
132- .hasAttributesSatisfyingExactly (
133- equalTo (NET_SOCK_PEER_ADDR , "127.0.0.1" ),
134- equalTo (NET_SOCK_PEER_NAME , "localhost" ),
135- equalTo (NET_SOCK_PEER_PORT , cassandraPort ),
136- equalTo (DB_SYSTEM , "cassandra" ),
137- equalTo (DB_NAME , parameter .keyspace ),
138- equalTo (DB_STATEMENT , parameter .expectedStatement ),
139- equalTo (DB_OPERATION , parameter .operation ),
140- equalTo (DB_CASSANDRA_CONSISTENCY_LEVEL , "LOCAL_ONE" ),
141- equalTo (DB_CASSANDRA_COORDINATOR_DC , "datacenter1" ),
142- satisfies (
143- DB_CASSANDRA_COORDINATOR_ID , val -> val .isInstanceOf (String .class )),
144- satisfies (
145- DB_CASSANDRA_IDEMPOTENCE , val -> val .isInstanceOf (Boolean .class )),
146- equalTo (DB_CASSANDRA_PAGE_SIZE , 5000 ),
147- equalTo (DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT , 0 ),
148- equalTo (DB_CASSANDRA_TABLE , parameter .table )),
149- span ->
150- span .hasName ("child" ).hasKind (SpanKind .INTERNAL ).hasParent (trace .getSpan (0 ))));
131+ testing ()
132+ .waitAndAssertTraces (
133+ trace ->
134+ trace .hasSpansSatisfyingExactly (
135+ span -> span .hasName ("parent" ).hasKind (SpanKind .INTERNAL ).hasNoParent (),
136+ span ->
137+ span .hasName (parameter .spanName )
138+ .hasKind (SpanKind .CLIENT )
139+ .hasParent (trace .getSpan (0 ))
140+ .hasAttributesSatisfyingExactly (
141+ equalTo (NET_SOCK_PEER_ADDR , "127.0.0.1" ),
142+ equalTo (NET_SOCK_PEER_NAME , "localhost" ),
143+ equalTo (NET_SOCK_PEER_PORT , cassandraPort ),
144+ equalTo (DB_SYSTEM , "cassandra" ),
145+ equalTo (DB_NAME , parameter .keyspace ),
146+ equalTo (DB_STATEMENT , parameter .expectedStatement ),
147+ equalTo (DB_OPERATION , parameter .operation ),
148+ equalTo (DB_CASSANDRA_CONSISTENCY_LEVEL , "LOCAL_ONE" ),
149+ equalTo (DB_CASSANDRA_COORDINATOR_DC , "datacenter1" ),
150+ satisfies (
151+ DB_CASSANDRA_COORDINATOR_ID ,
152+ val -> val .isInstanceOf (String .class )),
153+ satisfies (
154+ DB_CASSANDRA_IDEMPOTENCE ,
155+ val -> val .isInstanceOf (Boolean .class )),
156+ equalTo (DB_CASSANDRA_PAGE_SIZE , 5000 ),
157+ equalTo (DB_CASSANDRA_SPECULATIVE_EXECUTION_COUNT , 0 ),
158+ equalTo (DB_CASSANDRA_TABLE , parameter .table )),
159+ span ->
160+ span .hasName ("child" )
161+ .hasKind (SpanKind .INTERNAL )
162+ .hasParent (trace .getSpan (0 ))));
151163
152164 session .close ();
153165 }
@@ -260,7 +272,7 @@ private static Stream<Arguments> provideAsyncParameters() {
260272 "users" ))));
261273 }
262274
263- private static class Parameter {
275+ protected static class Parameter {
264276 public final String keyspace ;
265277 public final String statement ;
266278 public final String expectedStatement ;
@@ -284,16 +296,17 @@ public Parameter(
284296 }
285297 }
286298
287- CqlSession getSession (String keyspace ) {
299+ protected CqlSession getSession (String keyspace ) {
288300 DriverConfigLoader configLoader =
289301 DefaultDriverConfigLoader .builder ()
290302 .withDuration (DefaultDriverOption .REQUEST_TIMEOUT , Duration .ofSeconds (0 ))
291303 .build ();
292- return CqlSession .builder ()
293- .addContactPoint (new InetSocketAddress ("localhost" , cassandraPort ))
294- .withConfigLoader (configLoader )
295- .withLocalDatacenter ("datacenter1" )
296- .withKeyspace (keyspace )
297- .build ();
304+ return wrap (
305+ CqlSession .builder ()
306+ .addContactPoint (new InetSocketAddress ("localhost" , cassandraPort ))
307+ .withConfigLoader (configLoader )
308+ .withLocalDatacenter ("datacenter1" )
309+ .withKeyspace (keyspace )
310+ .build ());
298311 }
299312}
0 commit comments