Skip to content

Commit

Permalink
[GR-52530] LoggingTest#testDisableLoggersSingleContext fails.
Browse files Browse the repository at this point in the history
  • Loading branch information
tzezula committed Mar 20, 2024
1 parent fa877ae commit c61ffca
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -580,10 +580,7 @@ public void testDecreaseLogLevelSingleContext() {
Map<String, Level> setLevelsMap = new HashMap<>();
setLevelsMap.put("a", Level.FINEST);
setLevelsMap.put("a.a", Level.INFO);
Context.Builder builder = newContextBuilder();
for (Map.Entry<String, Level> levelsMapEntry : setLevelsMap.entrySet()) {
builder.options(createLoggingOptions(LoggingLanguageFirst.ID, levelsMapEntry.getKey(), levelsMapEntry.getValue().toString()));
}
Context.Builder builder = configureLogLevels(newContextBuilder(), setLevelsMap);
TestHandler handler = new TestHandler();
try (Context ctx = builder.logHandler(handler).build()) {
ctx.eval(LoggingLanguageFirst.ID, "");
Expand All @@ -599,10 +596,7 @@ public void testDecreaseLogLevelMultipleContexts() {
Map<String, Level> setLevelsMap = new HashMap<>();
setLevelsMap.put("a", Level.FINEST);
setLevelsMap.put("a.a", Level.INFO);
Context.Builder builder = newContextBuilder();
for (Map.Entry<String, Level> levelsMapEntry : setLevelsMap.entrySet()) {
builder.options(createLoggingOptions(LoggingLanguageFirst.ID, levelsMapEntry.getKey(), levelsMapEntry.getValue().toString()));
}
Context.Builder builder = configureLogLevels(newContextBuilder(), setLevelsMap);
TestHandler handler = new TestHandler();
try (Context ctx = builder.logHandler(handler).build()) {
TestHandler handler2 = new TestHandler();
Expand All @@ -626,11 +620,26 @@ public void testDecreaseIncreaseLogLevelSingleContext() {
setLevelsMap.put("a", Level.INFO);
setLevelsMap.put("a.a", Level.FINE);
TestHandler handler = new TestHandler();
Context.Builder builder = newContextBuilder();
for (Map.Entry<String, Level> levelsMapEntry : setLevelsMap.entrySet()) {
builder.options(createLoggingOptions(LoggingLanguageFirst.ID, levelsMapEntry.getKey(), levelsMapEntry.getValue().toString()));
Context.Builder builder = configureLogLevels(newContextBuilder(), setLevelsMap);
try (Context ctx = builder.logHandler(handler).build()) {
ctx.eval(LoggingLanguageFirst.ID, "");
List<Map.Entry<Level, String>> expected = new ArrayList<>();
expected.addAll(createExpectedLog(LoggingLanguageFirst.ID, setLevelsMap.remove(null), setLevelsMap));
Assert.assertEquals(expected, handler.getLog());
}
}

@Test
public void testDecreaseIncreaseLogLevelSingleContextInterfering() {
Map<String, Level> setLevelsMap = new HashMap<>();
setLevelsMap.put(null, Level.FINEST); // level on language root level
setLevelsMap.put("a", Level.INFO);
setLevelsMap.put("a.a", Level.FINE);
TestHandler handler = new TestHandler();
Context.Builder builder = configureLogLevels(newContextBuilder(), setLevelsMap);
Context interferingContext = configureLogLevels(newContextBuilder(), Map.of("b", Level.FINE)).build();
try (Context ctx = builder.logHandler(handler).build()) {
interferingContext.close();
ctx.eval(LoggingLanguageFirst.ID, "");
List<Map.Entry<Level, String>> expected = new ArrayList<>();
expected.addAll(createExpectedLog(LoggingLanguageFirst.ID, setLevelsMap.remove(null), setLevelsMap));
Expand All @@ -645,10 +654,7 @@ public void testDecreaseIncreaseLogLevelMultipleContexts() {
setLevelsMap.put(null, Level.FINEST); // level on language root level
setLevelsMap.put("a", Level.INFO);
setLevelsMap.put("a.a", Level.FINE);
Context.Builder builder = newContextBuilder();
for (Map.Entry<String, Level> levelsMapEntry : setLevelsMap.entrySet()) {
builder.options(createLoggingOptions(LoggingLanguageFirst.ID, levelsMapEntry.getKey(), levelsMapEntry.getValue().toString()));
}
Context.Builder builder = configureLogLevels(newContextBuilder(), setLevelsMap);
TestHandler handler = new TestHandler();
try (Context ctx = builder.logHandler(handler).build()) {
TestHandler handler2 = new TestHandler();
Expand All @@ -670,10 +676,7 @@ public void testDisableLoggersSingleContext() {
Map<String, Level> setLevelsMap = new HashMap<>();
setLevelsMap.put(null, Level.FINEST); // level on language root level
setLevelsMap.put("a", Level.OFF);
Context.Builder builder = newContextBuilder();
for (Map.Entry<String, Level> levelsMapEntry : setLevelsMap.entrySet()) {
builder.options(createLoggingOptions(LoggingLanguageFirst.ID, levelsMapEntry.getKey(), levelsMapEntry.getValue().toString()));
}
Context.Builder builder = configureLogLevels(newContextBuilder(), setLevelsMap);
TestHandler handler = new TestHandler();
try (Context ctx = builder.logHandler(handler).build()) {
ctx.eval(LoggingLanguageFirst.ID, "");
Expand All @@ -683,16 +686,20 @@ public void testDisableLoggersSingleContext() {
}
}

private static Context.Builder configureLogLevels(Context.Builder builder, Map<String, Level> levels) {
for (Map.Entry<String, Level> e : levels.entrySet()) {
builder.options(createLoggingOptions(LoggingLanguageFirst.ID, e.getKey(), e.getValue().toString()));
}
return builder;
}

@Test
public void testDisableLoggersMultipleContexts() {
Level defaultLevel = Level.INFO;
Map<String, Level> setLevelsMap = new HashMap<>();
setLevelsMap.put(null, Level.FINEST); // level on language root level
setLevelsMap.put("a", Level.OFF);
Context.Builder builder = newContextBuilder();
for (Map.Entry<String, Level> levelsMapEntry : setLevelsMap.entrySet()) {
builder.options(createLoggingOptions(LoggingLanguageFirst.ID, levelsMapEntry.getKey(), levelsMapEntry.getValue().toString()));
}
Context.Builder builder = configureLogLevels(newContextBuilder(), setLevelsMap);
TestHandler handler = new TestHandler();
try (Context ctx = builder.logHandler(handler).build()) {
TestHandler handler2 = new TestHandler();
Expand All @@ -709,17 +716,53 @@ public void testDisableLoggersMultipleContexts() {
}
}

@Test
public void testGR52530Interfering() {
Map<String, Level> setLevelsMap = new HashMap<>();
setLevelsMap.put(null, Level.FINEST); // level on language root level
setLevelsMap.put("a", Level.OFF);
Context.Builder builder = configureLogLevels(newContextBuilder(), setLevelsMap);
TestHandler handler = new TestHandler();
Context interferingContext = configureLogLevels(newContextBuilder(), Map.of("a", Level.FINE)).build();
try (Context ctx = builder.logHandler(handler).build()) {
interferingContext.close();
ctx.eval(LoggingLanguageFirst.ID, "");
List<Map.Entry<Level, String>> expected = new ArrayList<>();
expected.addAll(createExpectedLog(LoggingLanguageFirst.ID, setLevelsMap.remove(null), setLevelsMap));
Assert.assertEquals(expected, handler.getLog());
}
}

@Test
public void testGR52530Enclosing() {
Map<String, Level> setLevelsMap = new HashMap<>();
setLevelsMap.put(null, Level.FINEST); // level on language root level
setLevelsMap.put("a", Level.OFF);
Context.Builder builder = configureLogLevels(newContextBuilder(), setLevelsMap);
TestHandler outerHandler = new TestHandler();
try (Context outerContext = configureLogLevels(newContextBuilder().logHandler(outerHandler), Map.of("a", Level.FINE)).build()) {
TestHandler handler = new TestHandler();
try (Context ctx = builder.logHandler(handler).build()) {
outerContext.eval(LoggingLanguageFirst.ID, "");
ctx.eval(LoggingLanguageFirst.ID, "");
List<Map.Entry<Level, String>> expected = new ArrayList<>();
expected.addAll(createExpectedLog(LoggingLanguageFirst.ID, setLevelsMap.remove(null), setLevelsMap));
Assert.assertEquals(expected, handler.getLog());
}
List<Map.Entry<Level, String>> expected = new ArrayList<>();
expected.addAll(createExpectedLog(LoggingLanguageFirst.ID, Level.INFO, Map.of("a", Level.FINE)));
Assert.assertEquals(expected, outerHandler.getLog());
}
}

@Test
public void testDefaultLevelMultipleContexts() {
String parentLoggerName = "testDefaultLevelMultipleContexts";
String childLoggerName = String.format("%s.child", parentLoggerName);
Map<String, Level> setLevelsMap = new HashMap<>();
setLevelsMap.put(parentLoggerName, Level.FINE);
setLevelsMap.put(childLoggerName, Level.SEVERE);
Context.Builder builder = newContextBuilder();
for (Map.Entry<String, Level> levelsMapEntry : setLevelsMap.entrySet()) {
builder.options(createLoggingOptions(LoggingLanguageFirst.ID, levelsMapEntry.getKey(), levelsMapEntry.getValue().toString()));
}
Context.Builder builder = configureLogLevels(newContextBuilder(), setLevelsMap);
TestHandler handler = new TestHandler();
TruffleLogger parentLogger = TruffleLogger.getLogger(LoggingLanguageFirst.ID, parentLoggerName);
TruffleLogger childLogger = TruffleLogger.getLogger(LoggingLanguageFirst.ID, childLoggerName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1155,14 +1155,18 @@ private void reconfigure(final Map<String, Level> addedLevels, final Set<String>
assert !addedLevels.isEmpty() || !toRemove.isEmpty();
final Collection<String> loggersWithRemovedLevels = new HashSet<>();
final Collection<String> loggersWithChangedLevels = new HashSet<>();
boolean singleContext = activeContexts.size() <= 1;
effectiveLevels = computeEffectiveLevels(
effectiveLevels,
toRemove,
addedLevels,
activeContexts,
singleContext,
loggersWithRemovedLevels,
loggersWithChangedLevels);
boolean singleContext = activeContexts.size() <= 1;
if (singleContext && !loggersWithRemovedLevels.isEmpty()) {
loggersWithChangedLevels.addAll(effectiveLevels.keySet());
}
for (String loggerName : loggersWithRemovedLevels) {
final TruffleLogger logger = getLogger(loggerName);
if (logger != null) {
Expand Down Expand Up @@ -1232,12 +1236,13 @@ static LoggerCache getInstance() {
}

private static Map<String, Level> computeEffectiveLevels(
final Map<String, Level> currentEffectiveLevels,
final Set<String> removed,
final Map<String, Level> added,
final Collection<? extends ContextWeakReference> contexts,
final Collection<? super String> removedLevels,
final Collection<? super String> changedLevels) {
Map<String, Level> currentEffectiveLevels,
Set<String> removed,
Map<String, Level> added,
Collection<? extends ContextWeakReference> contexts,
boolean singleContext,
Collection<? super String> removedLevels,
Collection<? super String> changedLevels) {
final Map<String, Level> newEffectiveLevels = new HashMap<>(currentEffectiveLevels);
for (String loggerName : removed) {
final Level level = findMinLevel(loggerName, contexts);
Expand All @@ -1252,13 +1257,16 @@ private static Map<String, Level> computeEffectiveLevels(
}
}
}
// In a multi context scenario there can be a logger with higher effective log level
// than a default one. When the newly configured context does not specify log level
// explicitly the effective log level of such a logger needs to be set to the default
// level.
Map<String, Level> addedWithDefaults = new HashMap<>(added);
for (String loggerName : newEffectiveLevels.keySet()) {
addedWithDefaults.putIfAbsent(loggerName, Level.INFO);
if (!singleContext) {
// In a multi context scenario there can be a logger with higher effective log level
// than a default one. When the newly configured context does not specify log level
// explicitly the effective log level of such a logger needs to be set to the
// default
// level.
for (String loggerName : newEffectiveLevels.keySet()) {
addedWithDefaults.putIfAbsent(loggerName, Level.INFO);
}
}
for (Map.Entry<String, Level> addedLevel : addedWithDefaults.entrySet()) {
final String loggerName = addedLevel.getKey();
Expand Down

0 comments on commit c61ffca

Please sign in to comment.