Fix NPE when creating new refs
When a new ref gets created, it translates to a compare and
put of a null object id value, which translates to a 160-bytes
array of zeros.
Change-Id: Id725d4fca36efb3cb184582ec7b194c7ed9e25b8
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java
index 86be4f5..dd6ab64 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java
@@ -32,6 +32,10 @@
public class ZkSharedRefDatabase implements SharedRefDatabase {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+ private static final byte[] ZEROS_OBJECT_ID = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ };
+
private final CuratorFramework client;
private final RetryPolicy retryPolicy;
@@ -109,6 +113,10 @@
}
static byte[] writeObjectId(ObjectId value) throws IOException {
+ if (value == null) {
+ return ZEROS_OBJECT_ID;
+ }
+
final ByteArrayOutputStream out = new ByteArrayOutputStream();
final DataOutputStream stream = new DataOutputStream(out);
value.copyRawTo(stream);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java
index 88548f4..ceae75f 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java
@@ -82,6 +82,17 @@
}
@Test
+ public void shouldCompareAndPutWithNullOldRefSuccessfully() throws Exception {
+ Ref oldRef = refOf(null);
+ Ref newRef = refOf(AN_OBJECT_ID_2);
+ String projectName = A_TEST_PROJECT_NAME;
+
+ zookeeperContainer.createRefInZk(projectName, oldRef);
+
+ assertThat(zkSharedRefDatabase.compareAndPut(projectName, oldRef, newRef)).isTrue();
+ }
+
+ @Test
public void compareAndPutShouldFailIfTheObjectionHasNotTheExpectedValue() throws Exception {
String projectName = A_TEST_PROJECT_NAME;