blob: fb257f3d339c448713fbee77c683c01dd55db334 [file] [log] [blame]
// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package io.v.syncbase.internal;
import com.google.common.util.concurrent.SettableFuture;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import io.v.syncbase.core.Id;
import io.v.syncbase.core.KeyValue;
import io.v.syncbase.core.Permissions;
import io.v.syncbase.core.VError;
import static io.v.syncbase.core.TestConstants.anyCollectionPermissions;
import static io.v.syncbase.core.TestConstants.anyDbPermissions;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class CollectionTest {
@ClassRule
public static final TemporaryFolder folder = new TemporaryFolder();
@BeforeClass
public static void setUp() throws Exception {
System.loadLibrary("syncbase");
Service.Init(folder.newFolder().getAbsolutePath(), true, 0);
Service.Login("", "");
}
@AfterClass
public static void tearDown() throws Exception {
Service.Shutdown();
}
@Test
public void createCollection() {
Id dbId = new Id("idp:a:angrybirds", "create_collection");
Id collectionId1 = new Id("...", "collection1");
Id collectionId2 = new Id("...", "collection2");
try {
Database.Create(dbId.encode(), anyDbPermissions());
String batchHandle = Database.BeginBatch(dbId.encode(), null);
String name1 = Util.NamingJoin(Arrays.asList(dbId.encode(), collectionId1.encode()));
Collection.Create(name1, batchHandle, anyCollectionPermissions());
String name2 = Util.NamingJoin(Arrays.asList(dbId.encode(), collectionId2.encode()));
Collection.Create(name2, batchHandle, anyCollectionPermissions());
List<Id> collections = Database.ListCollections(dbId.encode(), batchHandle);
assertNotNull(collections);
assertEquals(2, collections.size());
assertEquals(collectionId1.encode(), collections.get(0).encode());
assertEquals(collectionId2.encode(), collections.get(1).encode());
} catch (VError vError) {
vError.printStackTrace();
fail(vError.toString());
}
}
@Test
public void destroyCollection() {
Id dbId = new Id("idp:a:angrybirds", "destroy_collection");
String dbName = dbId.encode();
Id collectionId = new Id("...", "collection");
String collectionName = Util.NamingJoin(Arrays.asList(dbName, collectionId.encode()));
try {
Database.Create(dbName, anyDbPermissions());
String batchHandle = Database.BeginBatch(dbId.encode(), null);
Collection.Create(collectionName, batchHandle, anyCollectionPermissions());
Database.Commit(dbName, batchHandle);
batchHandle = Database.BeginBatch(dbName, null);
Collection.Destroy(collectionName, batchHandle);
} catch (VError vError) {
vError.printStackTrace();
fail(vError.toString());
}
}
@Test
public void existsCollection() {
Id dbId = new Id("idp:a:angrybirds", "exists_collection");
String dbName = dbId.encode();
Id collectionId1 = new Id("...", "collection1");
String collectionName1 = Util.NamingJoin(Arrays.asList(dbName, collectionId1.encode()));
Id collectionId2 = new Id("...", "collection2");
String collectionName2 = Util.NamingJoin(Arrays.asList(dbName, collectionId2.encode()));
try {
Database.Create(dbName, anyDbPermissions());
String batchHandle = Database.BeginBatch(dbId.encode(), null);
Collection.Create(collectionName1, batchHandle, anyCollectionPermissions());
// We have not committed the batch yet so Exists should fail.
assertFalse(Collection.Exists(collectionName1, batchHandle));
Database.Commit(dbName, batchHandle);
batchHandle = Database.BeginBatch(dbName, null);
assertTrue(Collection.Exists(collectionName1, batchHandle));
assertFalse(Collection.Exists(collectionName2, batchHandle));
} catch (VError vError) {
vError.printStackTrace();
fail(vError.toString());
}
}
@Test
public void permissions() {
Id dbId = new Id("idp:a:angrybirds", "permissions_collection");
String dbName = dbId.encode();
Id collectionId = new Id("...", "collection");
String collectionName = Util.NamingJoin(Arrays.asList(dbName, collectionId.encode()));
try {
Database.Create(dbName, anyDbPermissions());
String batchHandle = Database.BeginBatch(dbId.encode(), null);
Collection.Create(collectionName, batchHandle, anyCollectionPermissions());
Permissions permissions = Collection.GetPermissions(collectionName, batchHandle);
assertNotNull(permissions);
String json = new String(permissions.json);
assertTrue(json.contains("Admin"));
Database.Commit(dbName, batchHandle);
batchHandle = Database.BeginBatch(dbId.encode(), null);
Collection.SetPermissions(collectionName, batchHandle, permissions);
Database.Commit(dbName, batchHandle);
} catch (VError vError) {
vError.printStackTrace();
fail(vError.toString());
}
}
@Test
public void deleteRangeCollection() {
Id dbId = new Id("idp:a:angrybirds", "delete_range_collection");
String dbName = dbId.encode();
Id collectionId = new Id("...", "collection");
String collectionName = Util.NamingJoin(Arrays.asList(dbName, collectionId.encode()));
String keyName = Util.NamingJoin(Arrays.asList(collectionName, "key"));
// Reference: release/go/src/v.io/v23/vom/testdata/data81/vomdata.vdl
byte[] vomValue = {(byte)0x81, 0x06, 0x03, 'a', 'b', 'c'};
try {
Database.Create(dbName, anyDbPermissions());
String batchHandle = Database.BeginBatch(dbId.encode(), null);
Collection.Create(collectionName, batchHandle, anyCollectionPermissions());
Row.Put(keyName, batchHandle, vomValue);
Database.Commit(dbName, batchHandle);
batchHandle = Database.BeginBatch(dbName, null);
assertTrue(Row.Exists(keyName, batchHandle));
Collection.DeleteRange(collectionName, batchHandle, new byte[]{}, new byte[]{});
Database.Commit(dbName, batchHandle);
batchHandle = Database.BeginBatch(dbName, null);
assertFalse(Row.Exists(keyName, batchHandle));
} catch (VError vError) {
vError.printStackTrace();
fail(vError.toString());
}
}
@Test
public void scan() throws Exception {
Id dbId = new Id("idp:a:angrybirds", "scan_collection");
String dbName = dbId.encode();
Id collectionId = new Id("...", "collection");
String collectionName = Util.NamingJoin(Arrays.asList(dbName, collectionId.encode()));
final String keyName = Util.NamingJoin(Arrays.asList(collectionName, "key"));
// Reference: release/go/src/v.io/v23/vom/testdata/data81/vomdata.vdl
final byte[] vomValue = {(byte)0x81, 0x06, 0x03, 'a', 'b', 'c'};
try {
Database.Create(dbName, anyDbPermissions());
String batchHandle = Database.BeginBatch(dbId.encode(), null);
Collection.Create(collectionName, batchHandle, anyCollectionPermissions());
Row.Put(keyName, batchHandle, vomValue);
Database.Commit(dbName, batchHandle);
batchHandle = Database.BeginBatch(dbName, null);
assertTrue(Row.Exists(keyName, batchHandle));
final SettableFuture<Void> done = SettableFuture.create();
Collection.Scan(collectionName, batchHandle, new byte[]{}, new byte[]{},
new Collection.ScanCallbacks() {
@Override
public void onKeyValue(KeyValue keyValue) {
assertEquals("key", keyValue.key);
assertArrayEquals(vomValue, keyValue.value);
}
@Override
public void onDone(VError vError) {
assertEquals(null, vError);
done.set(null);
}
});
done.get(1, TimeUnit.SECONDS);
} catch (VError vError) {
vError.printStackTrace();
fail(vError.toString());
}
}
}