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;