java: Get the DatabaseOptions.rootDir to work

Note that the rootDir is not exposed in the io.v.syncbase.core. The
purpose of this CL is to get all the high-level API tests from
SyncbaseTest to work. This change also adds the ability to shutdown
syncbase. The high-level API tests are reconfigured to use and empty
list of mounts points speed up the shutdown.

MultiPart: 2/3
Change-Id: Idd810de20c65dc21bac8d8841e64854abbaa4bd3
diff --git a/syncbase/src/main/java/io/v/syncbase/Syncbase.java b/syncbase/src/main/java/io/v/syncbase/Syncbase.java
index e6f7d47..f1b14e2 100644
--- a/syncbase/src/main/java/io/v/syncbase/Syncbase.java
+++ b/syncbase/src/main/java/io/v/syncbase/Syncbase.java
@@ -7,6 +7,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Timer;
@@ -38,8 +39,8 @@
     public static class DatabaseOptions {
         // Where data should be persisted.
         public String rootDir;
-        // TODO(sadovsky): Figure out what this should default to.
-        public List<String> mountPoints = ImmutableList.of("/ns.dev.v.io:8101/tmp/todos/users/");
+        // We use an empty mountPoints to avoid talking to the global mounttabled.
+        public List<String> mountPoints = new ArrayList<>();
         // TODO(sadovsky): Figure out how developers should specify this.
         public String adminUserId = "alexfandrianto@google.com";
         // TODO(sadovsky): Figure out how developers should specify this.
@@ -120,6 +121,7 @@
         sSelfAndCloud = ImmutableMap.of(
                 Permissions.IN, ImmutableList.of(getPersonalBlessingString(),
                         sOpts.getCloudBlessingString()));
+        io.v.syncbase.internal.Service.Init(sOpts.rootDir);
         // TODO(razvanm): Surface Cgo function to shut down syncbase.
         try {
             // TODO(razvanm): Use just the name after Blessings.AppBlessingFromContext starts
@@ -158,6 +160,14 @@
         }
     }
 
+    public static void shutdown() {
+        if (sDatabase == null) {
+            return;
+        }
+        io.v.syncbase.internal.Service.Shutdown();
+        sDatabase = null;
+    }
+
     /**
      * Returns true iff the user is currently logged in.
      */
diff --git a/syncbase/src/main/java/io/v/syncbase/internal/Service.java b/syncbase/src/main/java/io/v/syncbase/internal/Service.java
index 0a4ed82..7f1c54c 100644
--- a/syncbase/src/main/java/io/v/syncbase/internal/Service.java
+++ b/syncbase/src/main/java/io/v/syncbase/internal/Service.java
@@ -11,6 +11,9 @@
 import io.v.syncbase.core.VersionedPermissions;
 
 public class Service {
+    public static native void Init(String rootDir);
+    public static native void Shutdown();
+
     public static native VersionedPermissions GetPermissions();
     public static native void SetPermissions(VersionedPermissions permissions) throws VError;
 
diff --git a/syncbase/src/test/java/io/v/syncbase/SyncbaseTest.java b/syncbase/src/test/java/io/v/syncbase/SyncbaseTest.java
index 922eb29..46c4301 100644
--- a/syncbase/src/test/java/io/v/syncbase/SyncbaseTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/SyncbaseTest.java
@@ -7,6 +7,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.SettableFuture;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -38,6 +39,11 @@
         System.loadLibrary("syncbase");
     }
 
+    @After
+    public void tearDown() throws Exception {
+        Syncbase.shutdown();
+    }
+
     private Syncbase.DatabaseOptions newDatabaseOptions() {
         Syncbase.DatabaseOptions opts = new Syncbase.DatabaseOptions();
         // Use a fresh rootDir for each test run.
diff --git a/syncbase/src/test/java/io/v/syncbase/core/BatchDatabaseTest.java b/syncbase/src/test/java/io/v/syncbase/core/BatchDatabaseTest.java
index 891f3cf..ea9decc 100644
--- a/syncbase/src/test/java/io/v/syncbase/core/BatchDatabaseTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/core/BatchDatabaseTest.java
@@ -4,17 +4,31 @@
 
 package io.v.syncbase.core;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.IOException;
 
 import static io.v.syncbase.core.TestConstants.anyCollectionPermissions;
 import static io.v.syncbase.core.TestConstants.anyDbPermissions;
 import static org.junit.Assert.fail;
 
 public class BatchDatabaseTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        io.v.syncbase.internal.Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        io.v.syncbase.internal.Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/core/CollectionTest.java b/syncbase/src/test/java/io/v/syncbase/core/CollectionTest.java
index 46daa54..0c01105 100644
--- a/syncbase/src/test/java/io/v/syncbase/core/CollectionTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/core/CollectionTest.java
@@ -4,13 +4,19 @@
 
 package io.v.syncbase.core;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
+import java.io.IOException;
 import java.util.List;
 
 import static io.v.syncbase.core.TestConstants.anyCollectionPermissions;
 import static io.v.syncbase.core.TestConstants.anyDbPermissions;
+import static io.v.syncbase.internal.Service.Init;
+import static io.v.syncbase.internal.Service.Shutdown;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -18,9 +24,18 @@
 import static org.junit.Assert.fail;
 
 public class CollectionTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        io.v.syncbase.internal.Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        io.v.syncbase.internal.Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/core/DatabaseHandleTest.java b/syncbase/src/test/java/io/v/syncbase/core/DatabaseHandleTest.java
index 08bd888..d706e32 100644
--- a/syncbase/src/test/java/io/v/syncbase/core/DatabaseHandleTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/core/DatabaseHandleTest.java
@@ -4,21 +4,36 @@
 
 package io.v.syncbase.core;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
+import java.io.IOException;
 import java.util.List;
 
 import static io.v.syncbase.core.TestConstants.anyDbPermissions;
+import static io.v.syncbase.internal.Service.Init;
+import static io.v.syncbase.internal.Service.Shutdown;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 public class DatabaseHandleTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        io.v.syncbase.internal.Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        io.v.syncbase.internal.Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/core/DatabaseTest.java b/syncbase/src/test/java/io/v/syncbase/core/DatabaseTest.java
index 1ab7585..a20a67c 100644
--- a/syncbase/src/test/java/io/v/syncbase/core/DatabaseTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/core/DatabaseTest.java
@@ -4,12 +4,18 @@
 
 package io.v.syncbase.core;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
+import java.io.IOException;
 import java.util.List;
 
 import static io.v.syncbase.core.TestConstants.anyDbPermissions;
+import static io.v.syncbase.internal.Service.Init;
+import static io.v.syncbase.internal.Service.Shutdown;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
@@ -18,9 +24,18 @@
 import static org.junit.Assert.fail;
 
 public class DatabaseTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        io.v.syncbase.internal.Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        io.v.syncbase.internal.Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/core/RowTest.java b/syncbase/src/test/java/io/v/syncbase/core/RowTest.java
index 48cb8f8..f2a791d 100644
--- a/syncbase/src/test/java/io/v/syncbase/core/RowTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/core/RowTest.java
@@ -4,20 +4,36 @@
 
 package io.v.syncbase.core;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.IOException;
 
 import static io.v.syncbase.core.TestConstants.anyCollectionPermissions;
 import static io.v.syncbase.core.TestConstants.anyDbPermissions;
+import static io.v.syncbase.internal.Service.Init;
+import static io.v.syncbase.internal.Service.Shutdown;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 public class RowTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        io.v.syncbase.internal.Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        io.v.syncbase.internal.Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/core/ServiceTest.java b/syncbase/src/test/java/io/v/syncbase/core/ServiceTest.java
index ddd32ce..6cad9f0 100644
--- a/syncbase/src/test/java/io/v/syncbase/core/ServiceTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/core/ServiceTest.java
@@ -4,8 +4,13 @@
 
 package io.v.syncbase.core;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.IOException;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
@@ -14,9 +19,18 @@
 import static org.junit.Assert.fail;
 
 public class ServiceTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        io.v.syncbase.internal.Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        io.v.syncbase.internal.Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/core/SyncgroupTest.java b/syncbase/src/test/java/io/v/syncbase/core/SyncgroupTest.java
index 4d2fcf7..2baa848 100644
--- a/syncbase/src/test/java/io/v/syncbase/core/SyncgroupTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/core/SyncgroupTest.java
@@ -4,8 +4,13 @@
 
 package io.v.syncbase.core;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -20,6 +25,20 @@
 import static org.junit.Assert.fail;
 
 public class SyncgroupTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
+    @Before
+    public void setUp() throws IOException {
+        System.loadLibrary("syncbase");
+        io.v.syncbase.internal.Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        io.v.syncbase.internal.Service.Shutdown();
+    }
+
     @Test
     public void create() {
         Id dbId = new Id("idp:a:angrybirds", "core_create_syncgroups");
diff --git a/syncbase/src/test/java/io/v/syncbase/internal/BlessingsTest.java b/syncbase/src/test/java/io/v/syncbase/internal/BlessingsTest.java
index dc9aeb7..d3439e3 100644
--- a/syncbase/src/test/java/io/v/syncbase/internal/BlessingsTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/internal/BlessingsTest.java
@@ -4,8 +4,13 @@
 
 package io.v.syncbase.internal;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.IOException;
 
 import io.v.syncbase.core.VError;
 
@@ -15,9 +20,18 @@
 import static org.junit.Assert.fail;
 
 public class BlessingsTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/internal/CollectionTest.java b/syncbase/src/test/java/io/v/syncbase/internal/CollectionTest.java
index 0216303..c4b7b46 100644
--- a/syncbase/src/test/java/io/v/syncbase/internal/CollectionTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/internal/CollectionTest.java
@@ -6,13 +6,18 @@
 
 import com.google.common.util.concurrent.SettableFuture;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import io.v.syncbase.Syncbase;
 import io.v.syncbase.core.Id;
 import io.v.syncbase.core.KeyValue;
 import io.v.syncbase.core.Permissions;
@@ -28,9 +33,18 @@
 import static org.junit.Assert.fail;
 
 public class CollectionTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/internal/DatabaseTest.java b/syncbase/src/test/java/io/v/syncbase/internal/DatabaseTest.java
index 46faeff..a7f3d1a 100644
--- a/syncbase/src/test/java/io/v/syncbase/internal/DatabaseTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/internal/DatabaseTest.java
@@ -6,9 +6,13 @@
 
 import com.google.common.util.concurrent.SettableFuture;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -17,6 +21,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+import io.v.syncbase.Syncbase;
 import io.v.syncbase.core.CollectionRowPattern;
 import io.v.syncbase.core.Id;
 import io.v.syncbase.core.SyncgroupMemberInfo;
@@ -37,9 +42,18 @@
 import static org.junit.Assert.fail;
 
 public class DatabaseTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/internal/RowTest.java b/syncbase/src/test/java/io/v/syncbase/internal/RowTest.java
index a622543..263e511 100644
--- a/syncbase/src/test/java/io/v/syncbase/internal/RowTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/internal/RowTest.java
@@ -4,11 +4,16 @@
 
 package io.v.syncbase.internal;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
+import java.io.IOException;
 import java.util.Arrays;
 
+import io.v.syncbase.Syncbase;
 import io.v.syncbase.core.Id;
 import io.v.syncbase.core.VError;
 
@@ -20,9 +25,18 @@
 import static org.junit.Assert.fail;
 
 public class RowTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java b/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java
index 6b629fa..9a79448 100644
--- a/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/internal/ServiceTest.java
@@ -4,9 +4,15 @@
 
 package io.v.syncbase.internal;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
+import java.io.IOException;
+
+import io.v.syncbase.Syncbase;
 import io.v.syncbase.core.VError;
 import io.v.syncbase.core.VersionedPermissions;
 
@@ -16,9 +22,18 @@
 import static org.junit.Assert.fail;
 
 public class ServiceTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        Service.Shutdown();
     }
 
     @Test
diff --git a/syncbase/src/test/java/io/v/syncbase/internal/UtilTest.java b/syncbase/src/test/java/io/v/syncbase/internal/UtilTest.java
index 1f6929a..d7e0209 100644
--- a/syncbase/src/test/java/io/v/syncbase/internal/UtilTest.java
+++ b/syncbase/src/test/java/io/v/syncbase/internal/UtilTest.java
@@ -4,9 +4,13 @@
 
 package io.v.syncbase.internal;
 
+import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
+import java.io.IOException;
 import java.util.Arrays;
 
 import io.v.syncbase.core.Id;
@@ -14,9 +18,18 @@
 import static org.junit.Assert.assertEquals;
 
 public class UtilTest {
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder();
+
     @Before
-    public void setUp() {
+    public void setUp() throws IOException {
         System.loadLibrary("syncbase");
+        Service.Init(folder.newFolder().getAbsolutePath());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        Service.Shutdown();
     }
 
     @Test