Skip to content

Commit 8a4f2ed

Browse files
Merge branch '8.1.x' into master by karthikeyanas
2 parents 4766682 + aca78d0 commit 8a4f2ed

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

client/src/main/java/io/confluent/kafka/schemaregistry/utils/QualifiedSubject.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,14 +364,19 @@ public static String normalizeContext(String context) {
364364
/**
365365
* Checks if the given qualified subject represents a context (i.e., has no subject part).
366366
* A context has the format ":.context:" with an empty subject part, or null for default context.
367+
* Also returns true for wildcard subject ("*") when tenant is not the default tenant.
367368
*
368369
* @param tenant the tenant
369370
* @param qualifiedSubject the subject with a tenant prefix
370371
* @return true if the qualified subject is a context, false otherwise
371372
*/
372373
public static boolean isContext(String tenant, String qualifiedSubject) {
373374
QualifiedSubject qs = QualifiedSubject.create(tenant, qualifiedSubject);
374-
return qs == null || qs.getSubject().isEmpty();
375+
if (qs == null || qs.getSubject().isEmpty()) {
376+
return true;
377+
}
378+
// Check if it's the wildcard subject in non default tenant
379+
return tenant != null && !DEFAULT_TENANT.equals(tenant) && WILDCARD.equals(qs.getSubject());
375380
}
376381

377382
/**

client/src/test/java/io/confluent/kafka/schemaregistry/utils/QualifiedSubjectTest.java

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,4 +240,70 @@ public void testIsGlobalContext() {
240240
assertTrue(QualifiedSubject.isGlobalContext("default", ":" + GLOBAL_CONTEXT_NAME + ":"));
241241
assertTrue(QualifiedSubject.isGlobalContext("default", ":" + GLOBAL_CONTEXT_NAME));
242242
}
243+
244+
@Test
245+
public void testIsContext() {
246+
// Test null qualified subject - should return true (default context)
247+
assertTrue(QualifiedSubject.isContext("default", null));
248+
assertTrue(QualifiedSubject.isContext("tenant1", null));
249+
250+
// Test empty string qualified subject - should return true (default context)
251+
assertTrue(QualifiedSubject.isContext("default", ""));
252+
assertTrue(QualifiedSubject.isContext("tenant1", "tenant1_"));
253+
254+
// Test context with empty subject - should return true
255+
assertTrue(QualifiedSubject.isContext("default", ":.ctx1:"));
256+
assertTrue(QualifiedSubject.isContext("tenant1", "tenant1_:.ctx1:"));
257+
assertTrue(QualifiedSubject.isContext("default", ":.prod:"));
258+
assertTrue(QualifiedSubject.isContext("tenant1", "tenant1_:.prod:"));
259+
260+
// Test context with missing last colon but empty subject - should return true
261+
assertTrue(QualifiedSubject.isContext("default", ":.ctx1"));
262+
assertTrue(QualifiedSubject.isContext("tenant1", "tenant1_:.ctx1"));
263+
264+
// Test wildcard subject in non-default tenant - should return true
265+
assertTrue(QualifiedSubject.isContext("tenant1", "tenant1_*"));
266+
assertTrue(QualifiedSubject.isContext("tenant2", "tenant2_*"));
267+
268+
// Test wildcard subject in default tenant - should return false
269+
assertFalse(QualifiedSubject.isContext("default", "*"));
270+
assertFalse(QualifiedSubject.isContext(DEFAULT_TENANT, "*"));
271+
272+
// Test regular subjects - should return false
273+
assertFalse(QualifiedSubject.isContext("default", "subject1"));
274+
assertFalse(QualifiedSubject.isContext("tenant1", "tenant1_subject1"));
275+
assertFalse(QualifiedSubject.isContext("default", ":.ctx1:subject1"));
276+
assertFalse(QualifiedSubject.isContext("tenant1", "tenant1_:.ctx1:subject1"));
277+
278+
// Test context wildcard (special context) - should return true (empty subject)
279+
assertTrue(QualifiedSubject.isContext("tenant1", "tenant1_:*:"));
280+
281+
// Test invalid context formats with subjects - should return false
282+
assertFalse(QualifiedSubject.isContext("default", ":ctx1:subject1"));
283+
assertFalse(QualifiedSubject.isContext("tenant1", "tenant1_:ctx1:subject1"));
284+
}
285+
286+
@Test
287+
public void testIsContextEdgeCases() {
288+
// Test with null tenant
289+
assertTrue(QualifiedSubject.isContext(null, null));
290+
assertTrue(QualifiedSubject.isContext(null, ""));
291+
assertTrue(QualifiedSubject.isContext(null, ":.ctx:"));
292+
293+
// Wildcard with null tenant (treated as default tenant)
294+
assertFalse(QualifiedSubject.isContext(null, "*"));
295+
296+
// Test with empty context (default context)
297+
assertTrue(QualifiedSubject.isContext("default", ":.:"));
298+
assertTrue(QualifiedSubject.isContext("tenant1", "tenant1_:.:"));
299+
300+
// Test subjects that look like contexts but have content after
301+
assertFalse(QualifiedSubject.isContext("default", ":.ctx:foo"));
302+
assertFalse(QualifiedSubject.isContext("tenant1", "tenant1_:.ctx:foo"));
303+
304+
// Test with special subjects that are not wildcards
305+
assertFalse(QualifiedSubject.isContext("tenant1", "tenant1_**"));
306+
assertFalse(QualifiedSubject.isContext("tenant1", "tenant1_*subject"));
307+
assertFalse(QualifiedSubject.isContext("default", "**"));
308+
}
243309
}

0 commit comments

Comments
 (0)