Skip to content
This repository has been archived by the owner on Sep 26, 2019. It is now read-only.

Commit

Permalink
[PAN-3012] Print warning when there are comments in genesis file (#1838)
Browse files Browse the repository at this point in the history
The technique is to parse with comments disabled, and if a parse exception is
detected re-parse with comments allowed, and if successful complain at warn.

To turn this option off we just unwrap the try and delete the catch and update
the test.
  • Loading branch information
Danno Ferrin authored Aug 12, 2019
1 parent 5c2bc03 commit 5a54246
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,17 @@
import java.util.Optional;
import java.util.stream.Stream;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.Streams;
import com.google.common.io.Resources;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class GenesisConfigFile {

static final Logger LOG = LogManager.getLogger();

public static final GenesisConfigFile DEFAULT =
new GenesisConfigFile(JsonUtil.createEmptyObjectNode());

Expand Down Expand Up @@ -53,10 +58,23 @@ public static GenesisConfigFile development() {
}

public static GenesisConfigFile fromConfig(final String jsonString) {
// TODO: Should we disable comments?
final boolean allowComments = true;
final ObjectNode rootNode = JsonUtil.objectNodeFromString(jsonString, allowComments);
return fromConfig(rootNode);
try {
final ObjectNode rootNode = JsonUtil.objectNodeFromString(jsonString, false);
return fromConfig(rootNode);
} catch (final RuntimeException re) {
if (re.getCause() instanceof JsonParseException) {
// we had a runtime exception cause by a jsom parse exception.
// try again with comments enabled
final ObjectNode rootNode = JsonUtil.objectNodeFromString(jsonString, true);
// if we get here comments is what broke things, warn and move on.
LOG.warn(
"The provided genesis file contains comments. "
+ "In a future release of Pantheon this will not be supported.");
return fromConfig(rootNode);
} else {
throw re;
}
}
}

public static GenesisConfigFile fromConfig(final ObjectNode config) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,17 @@ public void shouldGetLargeChainId() {
"31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095"));
}

@Test
public void acceptComments() {
// this test will change in the future to reject comments.
final GenesisConfigFile config =
GenesisConfigFile.fromConfig(
"{\"config\": { \"chainId\": 2017 }\n/* C comment }*/\n//C++ comment }\n}");

assertThat(config.getConfigOptions().getChainId()).contains(new BigInteger("2017"));
// Unfortunately there is no good (non-flakey) way to assert logs.
}

private GenesisConfigFile configWithProperty(final String key, final String value) {
return GenesisConfigFile.fromConfig("{\"" + key + "\":\"" + value + "\"}");
}
Expand Down

0 comments on commit 5a54246

Please sign in to comment.