Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
3772078
docs: add Java SDK nomenclature cleanup design spec
Devesh-Skyflow May 13, 2026
9afb24a
docs: clarify tokenizedData reasoning in nomenclature cleanup spec
Devesh-Skyflow May 13, 2026
850eedb
docs: expand reasoning in Java nomenclature cleanup spec
Devesh-Skyflow May 13, 2026
ea9efb2
docs: correct tokenizedData implementation rationale in spec
Devesh-Skyflow May 13, 2026
54cb54b
docs: remove tokenizedData from scope in nomenclature cleanup spec
Devesh-Skyflow May 13, 2026
5e484d9
docs: add implementation plan for Java SDK nomenclature cleanup
Devesh-Skyflow May 13, 2026
96e7e39
feat: accept clientId/keyId/tokenUri in BearerToken with fallback to …
Devesh-Skyflow May 13, 2026
c46ced7
feat: accept clientId/keyId in SignedDataTokens with fallback to old …
Devesh-Skyflow May 13, 2026
16e6ef5
feat: normalise skyflow_id to skyflowId in Get and Query response maps
Devesh-Skyflow May 13, 2026
77d2424
feat: add getErrors() accessor to QueryResponse
Devesh-Skyflow May 14, 2026
54b500a
chore: audit confirms no setFooID/getFooID violations in public API
Devesh-Skyflow May 14, 2026
33d6c22
chore: add Claude Code setup (CLAUDE.md + .claude/)
Devesh-Skyflow May 14, 2026
f4d71ae
chore: fix gaps and inaccuracies in Claude setup files
Devesh-Skyflow May 14, 2026
93a1150
docs: add v2 backward compat + deprecation warnings implementation plan
Devesh-Skyflow May 14, 2026
fd07ab6
docs: update deprecation messages to say 'upcoming release' not 'v3'
Devesh-Skyflow May 14, 2026
6c1de31
docs: add [DEPRECATED] prefix to deprecation log messages per industr…
Devesh-Skyflow May 14, 2026
de6e4b4
docs: add PM-facing document for v2 public interface changes and depr…
Devesh-Skyflow May 14, 2026
541da95
docs: add downloadURL→downloadUrl deprecation to plan and PM doc
Devesh-Skyflow May 14, 2026
bf8f83e
fix: remove SDK-level field value null/empty validation from Insert a…
Devesh-Skyflow May 14, 2026
8112876
docs: add IDE autocomplete behavior for deprecation signals
Devesh-Skyflow May 14, 2026
57fd8f6
chore: segregate code smells into dedicated section in code-review co…
Devesh-Skyflow May 14, 2026
de2da94
chore: add DEPRECATED_SKYFLOW_ID_KEY log entry to InfoLogs
Devesh-Skyflow May 18, 2026
938f566
fix: restore skyflow_id key in Get/Query responses for v2 backward co…
Devesh-Skyflow May 18, 2026
4c3b998
docs: add deprecation Javadoc for skyflow_id key in GetResponse and Q…
Devesh-Skyflow May 18, 2026
8a1744a
feat: deprecate downloadURL in favour of downloadUrl in GetRequest an…
Devesh-Skyflow May 18, 2026
92bcf33
chore: update CLAUDE.md — add code-smell command, update slash commands
Devesh-Skyflow May 18, 2026
dbdcc07
docs: update deprecation plan and PM doc - credentials permanently su…
Devesh-Skyflow May 18, 2026
5b57857
test: add new-form downloadUrl tests alongside deprecated downloadURL…
Devesh-Skyflow May 18, 2026
008f4ba
fix: changes to claude
Devesh-Skyflow May 18, 2026
b9f0e00
docs: migrate V1-to-V2 guide from README to docs/, update CHANGELOG
Devesh-Skyflow May 18, 2026
fa7a0fc
docs: simplify CHANGELOG — remove v1 entries, keep only v2.0.4
Devesh-Skyflow May 18, 2026
927e1be
docs: simplify CHANGELOG to point to GitHub and Maven releases
Devesh-Skyflow May 18, 2026
673e57b
docs: add v2 banner to README with migration link and EOL notice
Devesh-Skyflow May 18, 2026
18821fc
docs: use release notes link instead of CHANGELOG in banner
Devesh-Skyflow May 18, 2026
37a1c95
docs: update README banner to v2.1.x announcement
Devesh-Skyflow May 18, 2026
a83a28a
revert: remove .claude/ and CLAUDE.md — will be raised as separate PR…
Devesh-Skyflow May 18, 2026
06e55a1
chore: remove superpowers planning docs from repo
Devesh-Skyflow May 18, 2026
a08edf9
chore: ignore docs/superpowers/ — keep planning docs local only
Devesh-Skyflow May 18, 2026
566d9a9
chore: update cspell config — British English words, Maven flags, ign…
Devesh-Skyflow May 18, 2026
5734333
chore: remove v2-public-interface-changes.md
Devesh-Skyflow May 18, 2026
5acbb84
fix: replace real RSA key with fake key in BearerTokenTests
Devesh-Skyflow May 18, 2026
a802668
fix: guard against null in DetokenizeRequest.downloadUrl(null)
Devesh-Skyflow May 18, 2026
40b53de
chore: remove dead error constants after validation removal
Devesh-Skyflow May 18, 2026
bff8b52
Revert "fix: guard against null in DetokenizeRequest.downloadUrl(null)"
Devesh-Skyflow May 18, 2026
ee167b4
test: add positive tests for permissive Insert validation behaviour
Devesh-Skyflow May 18, 2026
6b6c25d
fix banner
Devesh-Skyflow May 19, 2026
48d08c8
feat: port PR #273 changes — raw body support, URL encoding, null-saf…
Devesh-Skyflow May 19, 2026
033c061
fix: guard unsafe Optional.get() calls and remove dead statement in D…
Devesh-Skyflow May 19, 2026
975dfba
fix: guard Optional.get() in delete, close FileReader, guard empty fo…
Devesh-Skyflow May 20, 2026
3406eaa
docs: update README for v2.1 public interface changes
Devesh-Skyflow May 20, 2026
2740de4
fix: do not generate SDK-side requestId when server omits x-request-i…
Devesh-Skyflow May 20, 2026
88cec18
feat: add printWarningLogOnce to suppress per-record deprecation spam
Devesh-Skyflow May 20, 2026
8c292d2
test: fix testSendRequestWithNullRequestId to assert null requestId
Devesh-Skyflow May 20, 2026
8cf3cd1
docs: fix request_index to requestIndex in README response examples
Devesh-Skyflow May 20, 2026
f90c75d
fix: readme
Devesh-Skyflow May 20, 2026
6727625
docs: add v2.1.0 upgrade banner and migration guide to v1 README (#310)
Devesh-Skyflow May 20, 2026
726735c
feat: accept camelCase skyflowId in UpdateRequest and fire deprecatio…
Devesh-Skyflow May 20, 2026
ef38806
Revert "docs: add v2.1.0 upgrade banner and migration guide to v1 REA…
Devesh-Skyflow May 20, 2026
2e34619
feat: prefer skyflowId over skyflow_id in UpdateRequest with deprecat…
Devesh-Skyflow May 21, 2026
b767c4c
feat: add getByot() as canonical form; keep getBYOT() as deprecated d…
Devesh-Skyflow May 21, 2026
e6be29b
test: add TokenModeTest covering getByot(), deprecated getBYOT() dele…
Devesh-Skyflow May 21, 2026
334f7b3
feat: emit runtime deprecation warning in getBYOT(); test that it fires
Devesh-Skyflow May 21, 2026
ddbf593
chore: merge origin/release/26.5.2 — resolve conflicts, keep per-requ…
Devesh-Skyflow May 21, 2026
9594bc4
refactor: consolidate both-keys deprecation warning into DEPRECATED_S…
Devesh-Skyflow May 21, 2026
c9f9976
Merge remote-tracking branch 'origin/main' into devesh/SK-2814-java--…
Devesh-Skyflow May 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/main/java/com/skyflow/VaultClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ protected RecordServiceInsertRecordBody getBulkInsertRequestBody(InsertRequest r
.tokenization(request.getReturnTokens())
.homogeneous(request.getHomogeneous())
.upsert(request.getUpsert())
.byot(request.getTokenMode().getBYOT())
.byot(request.getTokenMode().getByot())
.records(records)
.build();
}
Expand All @@ -171,14 +171,14 @@ protected RecordServiceBatchOperationBody getBatchInsertRequestBody(InsertReques

return RecordServiceBatchOperationBody.builder()
.continueOnError(true)
.byot(request.getTokenMode().getBYOT())
.byot(request.getTokenMode().getByot())
.records(records)
.build();
}

protected RecordServiceUpdateRecordBody getUpdateRequestBody(UpdateRequest request) {
RecordServiceUpdateRecordBody.Builder updateRequestBodyBuilder = RecordServiceUpdateRecordBody.builder();
updateRequestBodyBuilder.byot(request.getTokenMode().getBYOT());
updateRequestBodyBuilder.byot(request.getTokenMode().getByot());
updateRequestBodyBuilder.tokenization(request.getReturnTokens());
V1FieldRecords.Builder recordBuilder = V1FieldRecords.builder();
HashMap<String, Object> values = request.getData();
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/com/skyflow/enums/TokenMode.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.skyflow.enums;

import com.skyflow.generated.rest.types.V1Byot;
import com.skyflow.logs.InfoLogs;
import com.skyflow.utils.logger.LogUtil;

public enum TokenMode {
DISABLE(V1Byot.DISABLE),
Expand All @@ -13,10 +15,17 @@ public enum TokenMode {
this.byot = byot;
}

public V1Byot getBYOT() {
public V1Byot getByot() {
return byot;
}

/** @deprecated Use {@link #getByot()} instead. */
@Deprecated(since = "2.1", forRemoval = true)
public V1Byot getBYOT() {
LogUtil.printWarningLog(InfoLogs.DEPRECATED_GET_BYOT.getLog());
return getByot();
}

@Override
public String toString() {
return byot.toString();
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/com/skyflow/logs/InfoLogs.java
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,9 @@ public enum InfoLogs {

// Deprecation warnings — v2 backward compat
DEPRECATED_SKYFLOW_ID_KEY("[DEPRECATED] Response key 'skyflow_id' is deprecated and will be removed in an upcoming release. Use 'skyflowId' instead."),
DEPRECATED_DOWNLOAD_URL("[DEPRECATED] Method 'downloadURL()' is deprecated and will be removed in an upcoming release. Use 'downloadUrl()' instead.");
DEPRECATED_SKYFLOW_ID_REQUEST_KEY("[DEPRECATED] Request data key 'skyflow_id' is deprecated and will be removed in an upcoming release. Use 'skyflowId' instead."),
DEPRECATED_DOWNLOAD_URL("[DEPRECATED] Method 'downloadURL()' is deprecated and will be removed in an upcoming release. Use 'downloadUrl()' instead."),
DEPRECATED_GET_BYOT("[DEPRECATED] Method 'getBYOT()' is deprecated and will be removed in an upcoming release. Use 'getByot()' instead.");



Expand Down
9 changes: 0 additions & 9 deletions src/main/java/com/skyflow/utils/logger/LogUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,12 @@
import com.skyflow.logs.InfoLogs;
import com.skyflow.utils.Constants;

import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.*;

public final class LogUtil {
private static final Logger LOGGER = Logger.getLogger(LogUtil.class.getName());
private static final String SDK_LOG_PREFIX = "[" + Constants.SDK_PREFIX + "] ";
private static boolean isLoggerSetupDone = false;
private static final Set<String> WARNED_ONCE = Collections.newSetFromMap(new ConcurrentHashMap<>());

synchronized public static void setupLogger(LogLevel logLevel) {
isLoggerSetupDone = true;
Expand Down Expand Up @@ -60,11 +56,6 @@ public static void printWarningLog(String message) {
LOGGER.warning(SDK_LOG_PREFIX + message);
}

public static void printWarningLogOnce(String message) {
if (isLoggerSetupDone && WARNED_ONCE.add(message))
LOGGER.warning(SDK_LOG_PREFIX + message);
}

public static void printInfoLog(String message) {
if (isLoggerSetupDone)
LOGGER.info(SDK_LOG_PREFIX + message);
Expand Down
13 changes: 10 additions & 3 deletions src/main/java/com/skyflow/utils/validations/Validations.java
Original file line number Diff line number Diff line change
Expand Up @@ -548,17 +548,17 @@ public static void validateUpdateRequest(UpdateRequest updateRequest) throws Sky
ErrorLogs.EMPTY_DATA.getLog(), InterfaceName.UPDATE.getName()
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyData.getMessage());
} else if (!data.containsKey("skyflow_id")) {
} else if (!data.containsKey("skyflowId") && !data.containsKey("skyflow_id")) {
LogUtil.printErrorLog(Utils.parameterizedString(
ErrorLogs.SKYFLOW_ID_IS_REQUIRED.getLog(), InterfaceName.UPDATE.getName()
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.SkyflowIdKeyError.getMessage());
} else if (!(data.get("skyflow_id") instanceof String)) {
} else if (!(resolveUpdateId(data) instanceof String)) {
LogUtil.printErrorLog(Utils.parameterizedString(
ErrorLogs.INVALID_SKYFLOW_ID_TYPE.getLog(), InterfaceName.UPDATE.getName()
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidSkyflowIdType.getMessage());
} else if (data.get("skyflow_id").toString().trim().isEmpty()) {
} else if (resolveUpdateId(data).toString().trim().isEmpty()) {
LogUtil.printErrorLog(Utils.parameterizedString(
ErrorLogs.EMPTY_SKYFLOW_ID.getLog(), InterfaceName.UPDATE.getName()
));
Expand Down Expand Up @@ -973,6 +973,13 @@ public static void validateDeidentifyFileRequest(DeidentifyFileRequest request)
}
}

static Object resolveUpdateId(HashMap<String, Object> data) {
if (data.containsKey("skyflowId")) {
return data.get("skyflowId");
}
return data.get("skyflow_id");
}

public static void validateGetDetectRunRequest(GetDetectRunRequest request) throws SkyflowException {
if (request == null) {
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRequestBody.getMessage());
Expand Down
18 changes: 15 additions & 3 deletions src/main/java/com/skyflow/vault/controller/VaultController.java
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,18 @@ public VaultController(VaultConfig vaultConfig, Credentials credentials) {
super(vaultConfig, credentials);
}

private static String extractUpdateSkyflowId(HashMap<String, Object> data) {
if (data.containsKey("skyflowId")) {
if (data.containsKey("skyflow_id")) {
data.remove("skyflow_id");
LogUtil.printWarningLog(InfoLogs.DEPRECATED_SKYFLOW_ID_REQUEST_KEY.getLog());
}
return data.remove("skyflowId").toString();
}
LogUtil.printWarningLog(InfoLogs.DEPRECATED_SKYFLOW_ID_REQUEST_KEY.getLog());
return data.remove("skyflow_id").toString();
}

private static synchronized HashMap<String, Object> getFormattedBatchInsertRecord(Object record, Integer requestIndex) {
HashMap<String, Object> insertRecord = new HashMap<>();
String jsonString = GSON.toJson(record);
Expand Down Expand Up @@ -133,7 +145,7 @@ private static synchronized HashMap<String, Object> getFormattedGetRecord(V1Fiel

if (getRecord.containsKey("skyflow_id")) {
getRecord.put("skyflowId", getRecord.get("skyflow_id"));
LogUtil.printWarningLogOnce(InfoLogs.DEPRECATED_SKYFLOW_ID_KEY.getLog());
LogUtil.printWarningLog(InfoLogs.DEPRECATED_SKYFLOW_ID_KEY.getLog());
}

return getRecord;
Expand All @@ -158,7 +170,7 @@ private static synchronized HashMap<String, Object> getFormattedQueryRecord(V1Fi

if (queryRecord.containsKey("skyflow_id")) {
queryRecord.put("skyflowId", queryRecord.get("skyflow_id"));
LogUtil.printWarningLogOnce(InfoLogs.DEPRECATED_SKYFLOW_ID_KEY.getLog());
LogUtil.printWarningLog(InfoLogs.DEPRECATED_SKYFLOW_ID_KEY.getLog());
}

return queryRecord;
Expand Down Expand Up @@ -336,7 +348,7 @@ public UpdateResponse update(UpdateRequest updateRequest) throws SkyflowExceptio
result = super.getRecordsApi().recordServiceUpdateRecord(
super.getVaultConfig().getVaultId(),
updateRequest.getTable(),
updateRequest.getData().remove("skyflow_id").toString(),
extractUpdateSkyflowId(updateRequest.getData()),
updateBody,
requestOptions
);
Expand Down
113 changes: 113 additions & 0 deletions src/test/java/com/skyflow/enums/TokenModeTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package com.skyflow.enums;

import com.skyflow.enums.LogLevel;
import com.skyflow.generated.rest.types.V1Byot;
import com.skyflow.logs.InfoLogs;
import com.skyflow.utils.logger.LogUtil;
import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class TokenModeTest {

private static class CapturingHandler extends Handler {
final List<LogRecord> records = new ArrayList<>();
@Override public void publish(LogRecord r) { records.add(r); }
@Override public void flush() {}
@Override public void close() {}
}

private CapturingHandler attachCapture() {
CapturingHandler handler = new CapturingHandler();
handler.setLevel(Level.ALL);
Logger.getLogger(LogUtil.class.getName()).addHandler(handler);
return handler;
}

// --- getByot() ---

@Test
public void testGetByotDisable() {
Assert.assertEquals(V1Byot.DISABLE, TokenMode.DISABLE.getByot());
}

@Test
public void testGetByotEnable() {
Assert.assertEquals(V1Byot.ENABLE, TokenMode.ENABLE.getByot());
}

@Test
public void testGetByotEnableStrict() {
Assert.assertEquals(V1Byot.ENABLE_STRICT, TokenMode.ENABLE_STRICT.getByot());
}

// --- getBYOT() delegates and emits a runtime warning ---

@Test
@SuppressWarnings("deprecation")
public void testGetBYOTDelegatesToGetByotDisable() {
Assert.assertEquals(V1Byot.DISABLE, TokenMode.DISABLE.getBYOT());
}

@Test
@SuppressWarnings("deprecation")
public void testGetBYOTDelegatesToGetByotEnable() {
Assert.assertEquals(V1Byot.ENABLE, TokenMode.ENABLE.getBYOT());
}

@Test
@SuppressWarnings("deprecation")
public void testGetBYOTDelegatesToGetByotEnableStrict() {
Assert.assertEquals(V1Byot.ENABLE_STRICT, TokenMode.ENABLE_STRICT.getBYOT());
}

@Test
@SuppressWarnings("deprecation")
public void testGetBYOTEmitsDeprecationWarning() {
LogUtil.setupLogger(LogLevel.INFO);
CapturingHandler handler = attachCapture();

TokenMode.ENABLE.getBYOT();

boolean warnFired = handler.records.stream()
.anyMatch(r -> r.getLevel().equals(Level.WARNING)
&& r.getMessage().contains(InfoLogs.DEPRECATED_GET_BYOT.getLog()));
Assert.assertTrue("getBYOT() should emit a deprecation warning log", warnFired);
}

@Test
@SuppressWarnings("deprecation")
public void testGetBYOTWarningIsSuppressedAtErrorLevel() {
LogUtil.setupLogger(LogLevel.ERROR);
CapturingHandler handler = attachCapture();

TokenMode.ENABLE.getBYOT();

boolean warnFired = handler.records.stream()
.anyMatch(r -> r.getLevel().equals(Level.WARNING));
Assert.assertFalse("getBYOT() warning should be suppressed at ERROR log level", warnFired);
}

// --- toString() ---

@Test
public void testToStringDisable() {
Assert.assertEquals("DISABLE", TokenMode.DISABLE.toString());
}

@Test
public void testToStringEnable() {
Assert.assertEquals("ENABLE", TokenMode.ENABLE.toString());
}

@Test
public void testToStringEnableStrict() {
Assert.assertEquals("ENABLE_STRICT", TokenMode.ENABLE_STRICT.toString());
}
}
99 changes: 99 additions & 0 deletions src/test/java/com/skyflow/utils/logger/LogUtilLevelTests.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package com.skyflow.utils.logger;

import com.skyflow.enums.LogLevel;
import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class LogUtilLevelTests {

private static class CapturingHandler extends Handler {
final List<LogRecord> records = new ArrayList<>();

@Override
public void publish(LogRecord record) {
records.add(record);
}

@Override public void flush() {}
@Override public void close() {}
}

// setupLogger calls LogManager.reset() which clears all handlers,
// so the capturing handler must be attached after setupLogger runs.
private CapturingHandler attachCapture() {
CapturingHandler handler = new CapturingHandler();
handler.setLevel(Level.ALL);
Logger.getLogger(LogUtil.class.getName()).addHandler(handler);
return handler;
}

@Test
public void testWarnLogAppearsWhenLogLevelIsInfo() {
LogUtil.setupLogger(LogLevel.INFO);
CapturingHandler handler = attachCapture();

LogUtil.printWarningLog("deprecation warning");

boolean warnCaptured = handler.records.stream()
.anyMatch(r -> r.getLevel().equals(Level.WARNING)
&& r.getMessage().contains("deprecation warning"));
Assert.assertTrue("WARN log should appear when LogLevel is INFO", warnCaptured);
}

@Test
public void testWarnLogAppearsWhenLogLevelIsWarn() {
LogUtil.setupLogger(LogLevel.WARN);
CapturingHandler handler = attachCapture();

LogUtil.printWarningLog("warn level warning");

boolean warnCaptured = handler.records.stream()
.anyMatch(r -> r.getLevel().equals(Level.WARNING)
&& r.getMessage().contains("warn level warning"));
Assert.assertTrue("WARN log should appear when LogLevel is WARN", warnCaptured);
}

@Test
public void testWarnLogAppearsWhenLogLevelIsDebug() {
LogUtil.setupLogger(LogLevel.DEBUG);
CapturingHandler handler = attachCapture();

LogUtil.printWarningLog("debug level warning");

boolean warnCaptured = handler.records.stream()
.anyMatch(r -> r.getLevel().equals(Level.WARNING)
&& r.getMessage().contains("debug level warning"));
Assert.assertTrue("WARN log should appear when LogLevel is DEBUG", warnCaptured);
}

@Test
public void testWarnLogSuppressedWhenLogLevelIsError() {
LogUtil.setupLogger(LogLevel.ERROR);
CapturingHandler handler = attachCapture();

LogUtil.printWarningLog("suppressed warning");

boolean warnCaptured = handler.records.stream()
.anyMatch(r -> r.getLevel().equals(Level.WARNING));
Assert.assertFalse("WARN log should NOT appear when LogLevel is ERROR", warnCaptured);
}

@Test
public void testInfoLogSuppressedWhenLogLevelIsWarn() {
LogUtil.setupLogger(LogLevel.WARN);
CapturingHandler handler = attachCapture();

LogUtil.printInfoLog("info message");

boolean infoCaptured = handler.records.stream()
.anyMatch(r -> r.getLevel().equals(Level.INFO));
Assert.assertFalse("INFO log should NOT appear when LogLevel is WARN", infoCaptured);
}
}
Loading
Loading