5050import java .util .concurrent .Future ;
5151import java .util .concurrent .LinkedBlockingQueue ;
5252import java .util .regex .Pattern ;
53+ import java .util .stream .Stream ;
5354import org .junit .jupiter .api .Assertions ;
5455import org .junit .jupiter .api .BeforeEach ;
5556import org .junit .jupiter .api .Test ;
57+ import org .junit .jupiter .api .TestInstance ;
5658import org .junit .jupiter .api .extension .RegisterExtension ;
59+ import org .junit .jupiter .params .ParameterizedTest ;
60+ import org .junit .jupiter .params .provider .Arguments ;
61+ import org .junit .jupiter .params .provider .MethodSource ;
5762
63+ @ TestInstance (TestInstance .Lifecycle .PER_CLASS )
5864public class BigQueryDatabaseMetaDataTest {
5965
6066 @ RegisterExtension
61- static final OpenTelemetryExtension otelTesting = OpenTelemetryExtension .create ();
67+ public static final OpenTelemetryExtension otelTesting = OpenTelemetryExtension .create ();
6268
6369 private BigQueryConnection bigQueryConnection ;
6470 private BigQueryDatabaseMetaData dbMetadata ;
@@ -79,6 +85,15 @@ public void setUp() throws SQLException {
7985 .getOpenTelemetry ()
8086 .getTracer (BigQueryJdbcOpenTelemetry .INSTRUMENTATION_SCOPE_NAME ));
8187
88+ Page <Dataset > datasetPageMock = mock (Page .class );
89+ when (bigqueryClient .listDatasets (anyString (), any ())).thenReturn (datasetPageMock );
90+
91+ Page <Table > tablePageMock = mock (Page .class );
92+ when (bigqueryClient .listTables (any (DatasetId .class ), any ())).thenReturn (tablePageMock );
93+
94+ Table mockTable = mock (Table .class );
95+ when (bigqueryClient .getTable (any (TableId .class ))).thenReturn (mockTable );
96+
8297 dbMetadata = new BigQueryDatabaseMetaData (bigQueryConnection );
8398 }
8499
@@ -3223,145 +3238,95 @@ public void testGetSQLStateType() throws SQLException {
32233238 assertEquals (DatabaseMetaData .sqlStateSQL , dbMetadata .getSQLStateType ());
32243239 }
32253240
3226- @ Test
3227- public void testGetCatalogs_generatesSpan () throws SQLException {
3228- try {
3229- dbMetadata .getCatalogs ();
3230- } catch (NullPointerException e ) {
3231- // Expected
3232- }
3241+ @ ParameterizedTest
3242+ @ MethodSource ("metadataOperationProvider" )
3243+ public void testMetadataOperation_generatesSpan (
3244+ MetadataOperation operation , String expectedSpanName ) throws SQLException {
3245+ operation .run ();
32333246
32343247 boolean found =
3235- otelTesting .getSpans ().stream ()
3236- .anyMatch (span -> span .getName ().equals ("BigQueryDatabaseMetaData.getCatalogs" ));
3248+ otelTesting .getSpans ().stream ().anyMatch (span -> span .getName ().equals (expectedSpanName ));
32373249 assertTrue (found );
32383250 }
32393251
3240- @ Test
3241- public void testGetSchemas_generatesSpan () throws SQLException {
3242- try {
3243- dbMetadata .getSchemas ("catalog" , "schema" );
3244- } catch (Exception e ) {
3245- // Expected
3246- }
3247-
3248- boolean found =
3249- otelTesting .getSpans ().stream ()
3250- .anyMatch (span -> span .getName ().equals ("BigQueryDatabaseMetaData.getSchemas" ));
3251- assertTrue (found );
3252- }
3253-
3254- @ Test
3255- public void testGetTables_generatesSpan () throws SQLException {
3256- try {
3257- dbMetadata .getTables ("catalog" , "schema" , "table" , new String [] {"TABLE" });
3258- } catch (Exception e ) {
3259- // Expected
3260- }
3261-
3262- boolean found =
3263- otelTesting .getSpans ().stream ()
3264- .anyMatch (span -> span .getName ().equals ("BigQueryDatabaseMetaData.getTables" ));
3265- assertTrue (found );
3266- }
3267-
3268- @ Test
3269- public void testGetColumns_generatesSpan () throws SQLException {
3270- try {
3271- dbMetadata .getColumns ("catalog" , "schema" , "table" , "column" );
3272- } catch (Exception e ) {
3273- // Expected
3274- }
3275-
3276- boolean found =
3277- otelTesting .getSpans ().stream ()
3278- .anyMatch (span -> span .getName ().equals ("BigQueryDatabaseMetaData.getColumns" ));
3279- assertTrue (found );
3280- }
3281-
3282- @ Test
3283- public void testGetTables_createsDetachedLinkedSpan () throws Exception {
3252+ @ FunctionalInterface
3253+ interface MetadataOperation {
3254+ void run () throws SQLException ;
3255+ }
3256+
3257+ Stream <Arguments > metadataOperationProvider () {
3258+ return Stream .of (
3259+ Arguments .of (
3260+ (MetadataOperation ) () -> dbMetadata .getCatalogs (),
3261+ "BigQueryDatabaseMetaData.getCatalogs" ),
3262+ Arguments .of (
3263+ (MetadataOperation ) () -> dbMetadata .getSchemas ("catalog" , "schema" ),
3264+ "BigQueryDatabaseMetaData.getSchemas" ),
3265+ Arguments .of (
3266+ (MetadataOperation )
3267+ () -> dbMetadata .getTables ("catalog" , "schema" , "table" , new String [] {"TABLE" }),
3268+ "BigQueryDatabaseMetaData.getTables" ),
3269+ Arguments .of (
3270+ (MetadataOperation ) () -> dbMetadata .getColumns ("catalog" , "schema" , "table" , "column" ),
3271+ "BigQueryDatabaseMetaData.getColumns" ));
3272+ }
3273+
3274+ @ ParameterizedTest
3275+ @ MethodSource ("asyncMetadataOperationProvider" )
3276+ public void testAsyncMetadataOperation_createsDetachedLinkedSpan (
3277+ AsyncMetadataOperation operation , String expectedSpanName ) throws Exception {
32843278 BlockingQueue <BigQueryFieldValueListWrapper > queue = new LinkedBlockingQueue <>();
32853279
32863280 Tracer testTracer = otelTesting .getOpenTelemetry ().getTracer ("test" );
32873281 Span parentSpan = testTracer .spanBuilder ("parent-span" ).startSpan ();
32883282
32893283 try (Scope scope = parentSpan .makeCurrent ()) {
3290- Thread workerThread =
3291- dbMetadata .runGetTablesTaskAsync (
3292- "catalog" ,
3293- "schema" ,
3294- "table" ,
3295- new String [] {"TABLE" },
3296- dbMetadata .defineGetTablesSchema (),
3297- queue );
3284+ Thread workerThread = operation .run (queue );
32983285
32993286 Assertions .assertNotNull (workerThread , "Worker thread should not be null" );
33003287 workerThread .join ();
33013288
3302- assertSpanLinkedToParent ("BigQueryDatabaseMetaData.getTables.background" , parentSpan );
3289+ OpenTelemetryTestUtility .assertSpanLinkedToParent (
3290+ otelTesting .getSpans (), expectedSpanName , parentSpan );
33033291 } finally {
33043292 parentSpan .end ();
33053293 }
33063294 }
33073295
3308- @ Test
3309- public void testGetColumns_createsDetachedLinkedSpan () throws Exception {
3310- BlockingQueue <BigQueryFieldValueListWrapper > queue = new LinkedBlockingQueue <>();
3311-
3312- Tracer testTracer = otelTesting .getOpenTelemetry ().getTracer ("test" );
3313- Span parentSpan = testTracer .spanBuilder ("parent-span" ).startSpan ();
3314-
3315- try (Scope scope = parentSpan .makeCurrent ()) {
3316- Thread workerThread =
3317- dbMetadata .runGetColumnsTaskAsync (
3318- "catalog" , "schema" , "table" , "column" , dbMetadata .defineGetColumnsSchema (), queue );
3319-
3320- Assertions .assertNotNull (workerThread , "Worker thread should not be null" );
3321- workerThread .join ();
3322-
3323- assertSpanLinkedToParent ("BigQueryDatabaseMetaData.getColumns.background" , parentSpan );
3324- } finally {
3325- parentSpan .end ();
3326- }
3327- }
3328-
3329- @ Test
3330- public void testGetSchemas_createsDetachedLinkedSpan () throws Exception {
3331- BlockingQueue <BigQueryFieldValueListWrapper > queue = new LinkedBlockingQueue <>();
3332-
3333- Tracer testTracer = otelTesting .getOpenTelemetry ().getTracer ("test" );
3334- Span parentSpan = testTracer .spanBuilder ("parent-span" ).startSpan ();
3335-
3336- try (Scope scope = parentSpan .makeCurrent ()) {
3337- Thread workerThread =
3338- dbMetadata .runGetSchemasTaskAsync (
3339- "catalog" , "schema" , dbMetadata .defineGetSchemasSchema (), queue );
3340-
3341- Assertions .assertNotNull (workerThread , "Worker thread should not be null" );
3342- workerThread .join ();
3343-
3344- assertSpanLinkedToParent ("BigQueryDatabaseMetaData.getSchemas.background" , parentSpan );
3345- } finally {
3346- parentSpan .end ();
3347- }
3348- }
3349-
3350- private void assertSpanLinkedToParent (String spanName , Span parentSpan ) {
3351- boolean found =
3352- otelTesting .getSpans ().stream ()
3353- .anyMatch (
3354- span ->
3355- span .getName ().equals (spanName )
3356- && span .getLinks ().stream ()
3357- .anyMatch (
3358- link ->
3359- link .getSpanContext ()
3360- .getTraceId ()
3361- .equals (parentSpan .getSpanContext ().getTraceId ())
3362- && link .getSpanContext ()
3363- .getSpanId ()
3364- .equals (parentSpan .getSpanContext ().getSpanId ())));
3365- assertTrue (found , "Span " + spanName + " not found or not linked to parent" );
3296+ @ FunctionalInterface
3297+ interface AsyncMetadataOperation {
3298+ Thread run (BlockingQueue <BigQueryFieldValueListWrapper > queue ) throws Exception ;
3299+ }
3300+
3301+ Stream <Arguments > asyncMetadataOperationProvider () {
3302+ return Stream .of (
3303+ Arguments .of (
3304+ (AsyncMetadataOperation )
3305+ (q ) ->
3306+ dbMetadata .runGetTablesTaskAsync (
3307+ "catalog" ,
3308+ "schema" ,
3309+ "table" ,
3310+ new String [] {"TABLE" },
3311+ dbMetadata .defineGetTablesSchema (),
3312+ q ),
3313+ "BigQueryDatabaseMetaData.getTables.background" ),
3314+ Arguments .of (
3315+ (AsyncMetadataOperation )
3316+ (q ) ->
3317+ dbMetadata .runGetColumnsTaskAsync (
3318+ "catalog" ,
3319+ "schema" ,
3320+ "table" ,
3321+ "column" ,
3322+ dbMetadata .defineGetColumnsSchema (),
3323+ q ),
3324+ "BigQueryDatabaseMetaData.getColumns.background" ),
3325+ Arguments .of (
3326+ (AsyncMetadataOperation )
3327+ (q ) ->
3328+ dbMetadata .runGetSchemasTaskAsync (
3329+ "catalog" , "schema" , dbMetadata .defineGetSchemasSchema (), q ),
3330+ "BigQueryDatabaseMetaData.getSchemas.background" ));
33663331 }
33673332}
0 commit comments