diff --git a/java/src/org/openqa/selenium/ScriptKey.java b/java/src/org/openqa/selenium/ScriptKey.java index e5f61c226a6c3..8bcf53ac6ae04 100644 --- a/java/src/org/openqa/selenium/ScriptKey.java +++ b/java/src/org/openqa/selenium/ScriptKey.java @@ -33,6 +33,11 @@ public String getIdentifier() { return identifier; } + @Override + public String toString() { + return identifier; + } + @Override public boolean equals(@Nullable Object o) { if (!(o instanceof ScriptKey)) { diff --git a/java/src/org/openqa/selenium/UnpinnedScriptKey.java b/java/src/org/openqa/selenium/UnpinnedScriptKey.java index b61f443d5f5b8..f8eac4303963c 100644 --- a/java/src/org/openqa/selenium/UnpinnedScriptKey.java +++ b/java/src/org/openqa/selenium/UnpinnedScriptKey.java @@ -112,4 +112,17 @@ public boolean equals(@Nullable Object o) { public int hashCode() { return Objects.hash(super.hashCode(), script); } + + @Override + public String toString() { + // Avoid dumping raw JavaScript into logs: in UnpinnedScriptKey the identifier is the script. + return "UnpinnedScriptKey{" + + "scriptHash=" + + script.hashCode() + + ", scriptId=" + + Objects.toString(scriptId, "unset") + + ", length=" + + script.length() + + "}"; + } } diff --git a/java/test/org/openqa/selenium/ScriptKeyTest.java b/java/test/org/openqa/selenium/ScriptKeyTest.java new file mode 100644 index 0000000000000..1de043da69f03 --- /dev/null +++ b/java/test/org/openqa/selenium/ScriptKeyTest.java @@ -0,0 +1,33 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.openqa.selenium; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class ScriptKeyTest { + @Test + void hasToStringEqualToIdentifier() { + assertThat(new ScriptKey("xxx")).hasToString("xxx"); + } + + @Test + void hasToStringWorksForEmptyIdentifier() { + assertThat(new ScriptKey("")).hasToString(""); + } +} diff --git a/java/test/org/openqa/selenium/UnpinnedScriptKeyTest.java b/java/test/org/openqa/selenium/UnpinnedScriptKeyTest.java new file mode 100644 index 0000000000000..3f7bfc8d2545a --- /dev/null +++ b/java/test/org/openqa/selenium/UnpinnedScriptKeyTest.java @@ -0,0 +1,45 @@ +// Licensed to the Software Freedom Conservancy (SFC) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The SFC licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.openqa.selenium; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class UnpinnedScriptKeyTest { + + @Test + void toStringDoesNotExposeRawScript() { + String script = "return 'SECRET_TOKEN';"; + UnpinnedScriptKey key = new UnpinnedScriptKey(script); + + assertThat(key.toString()).doesNotContain(script); + } + + @Test + void toStringContainsScriptIdWhenPresent() { + UnpinnedScriptKey key = new UnpinnedScriptKey("return 1;"); + key.setScriptId("script-99"); + + String value = key.toString(); + + assertThat(value).contains("UnpinnedScriptKey{"); + assertThat(value).contains("scriptId=script-99"); + assertThat(value).contains("length="); + } +}