blob: 3275e8b121ab152e892417f95de2317bab722a78 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.gora.store;
import java.io.IOException;
import java.nio.ByteBuffer;
import junit.framework.Assert;
import org.apache.avro.util.Utf8;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.gora.GoraTestDriver;
import org.apache.gora.examples.generated.Employee;
import org.apache.gora.examples.generated.Metadata;
import org.apache.gora.examples.generated.WebPage;
import org.apache.gora.store.DataStore;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* A base class for {@link DataStore} tests. This is just a convenience
* class, which actually only uses {@link DataStoreTestUtil} methods to
* run the tests. Not all test cases can extend this class (like TestHBaseStore),
* so all test logic should reside in DataStoreTestUtil class.
*/
public abstract class DataStoreTestBase {
public static final Logger log = LoggerFactory.getLogger(DataStoreTestBase.class);
protected static GoraTestDriver testDriver;
protected DataStore<String,Employee> employeeStore;
protected DataStore<String,WebPage> webPageStore;
@Deprecated
protected abstract DataStore<String,Employee> createEmployeeDataStore() throws IOException ;
@Deprecated
protected abstract DataStore<String,WebPage> createWebPageDataStore() throws IOException;
/** junit annoyingly forces BeforeClass to be static, so this method
* should be called from a static block
*/
protected static void setTestDriver(GoraTestDriver driver) {
testDriver = driver;
}
private static boolean setUpClassCalled = false;
@BeforeClass
public static void setUpClass() throws Exception {
if(testDriver != null && !setUpClassCalled) {
log.info("setting up class");
testDriver.setUpClass();
setUpClassCalled = true;
}
}
@AfterClass
public static void tearDownClass() throws Exception {
if(testDriver != null) {
log.info("tearing down class");
testDriver.tearDownClass();
}
}
@Before
public void setUp() throws Exception {
//There is an issue in JUnit 4 tests in Eclipse where TestSqlStore static
//methods are not called BEFORE setUpClass. I think this is a bug in
//JUnitRunner in Eclipse. Below is a workaround for that problem.
if(!setUpClassCalled) {
setUpClass();
}
log.info("setting up test");
if(testDriver != null) {
employeeStore = testDriver.createDataStore(String.class, Employee.class);
webPageStore = testDriver.createDataStore(String.class, WebPage.class);
testDriver.setUp();
} else {
employeeStore = createEmployeeDataStore();
webPageStore = createWebPageDataStore();
employeeStore.truncateSchema();
webPageStore.truncateSchema();
}
}
@After
public void tearDown() throws Exception {
log.info("tearing down test");
if(testDriver != null) {
testDriver.tearDown();
}
//employeeStore.close();
//webPageStore.close();
}
@Test
public void testNewInstance() throws IOException {
log.info("test method: testNewInstance");
DataStoreTestUtil.testNewPersistent(employeeStore);
}
@Test
public void testCreateSchema() throws Exception {
log.info("test method: testCreateSchema");
DataStoreTestUtil.testCreateEmployeeSchema(employeeStore);
assertSchemaExists("Employee");
}
// Override this to assert that schema is created correctly
public void assertSchemaExists(String schemaName) throws Exception {
}
@Test
public void testAutoCreateSchema() throws Exception {
log.info("test method: testAutoCreateSchema");
DataStoreTestUtil.testAutoCreateSchema(employeeStore);
assertAutoCreateSchema();
}
public void assertAutoCreateSchema() throws Exception {
assertSchemaExists("Employee");
}
@Test
public void testTruncateSchema() throws Exception {
log.info("test method: testTruncateSchema");
DataStoreTestUtil.testTruncateSchema(webPageStore);
assertSchemaExists("WebPage");
}
@Test
public void testDeleteSchema() throws IOException {
log.info("test method: testDeleteSchema");
DataStoreTestUtil.testDeleteSchema(webPageStore);
}
@Test
public void testSchemaExists() throws Exception {
log.info("test method: testSchemaExists");
DataStoreTestUtil.testSchemaExists(webPageStore);
}
@Test
public void testPut() throws IOException {
log.info("test method: testPut");
Employee employee = DataStoreTestUtil.testPutEmployee(employeeStore);
assertPut(employee);
}
public void assertPut(Employee employee) throws IOException {
}
@Test
public void testPutNested() throws IOException {
log.info("test method: testPutNested");
String revUrl = "foo.com:http/";
String url = "http://foo.com/";
webPageStore.createSchema();
WebPage page = webPageStore.newPersistent();
Metadata metadata = new Metadata();
metadata.setVersion(1);
metadata.putToData(new Utf8("foo"), new Utf8("baz"));
page.setMetadata(metadata);
page.setUrl(new Utf8(url));
webPageStore.put(revUrl, page);
webPageStore.flush();
page = webPageStore.get(revUrl);
metadata = page.getMetadata();
Assert.assertNotNull(metadata);
Assert.assertEquals(1, metadata.getVersion());
Assert.assertEquals(new Utf8("baz"), metadata.getData().get(new Utf8("foo")));
}
@Test
public void testPutArray() throws IOException {
log.info("test method: testPutArray");
webPageStore.createSchema();
WebPage page = webPageStore.newPersistent();
String[] tokens = {"example", "content", "in", "example.com"};
for(String token: tokens) {
page.addToParsedContent(new Utf8(token));
}
webPageStore.put("com.example/http", page);
webPageStore.close();
assertPutArray();
}
public void assertPutArray() throws IOException {
}
@Test
public void testPutBytes() throws IOException {
log.info("test method: testPutBytes");
webPageStore.createSchema();
WebPage page = webPageStore.newPersistent();
page.setUrl(new Utf8("http://example.com"));
byte[] contentBytes = "example content in example.com".getBytes();
ByteBuffer buff = ByteBuffer.wrap(contentBytes);
page.setContent(buff);
webPageStore.put("com.example/http", page);
webPageStore.close();
assertPutBytes(contentBytes);
}
public void assertPutBytes(byte[] contentBytes) throws IOException {
}
@Test
public void testPutMap() throws IOException {
log.info("test method: testPutMap");
webPageStore.createSchema();
WebPage page = webPageStore.newPersistent();
page.setUrl(new Utf8("http://example.com"));
page.putToOutlinks(new Utf8("http://example2.com"), new Utf8("anchor2"));
page.putToOutlinks(new Utf8("http://example3.com"), new Utf8("anchor3"));
page.putToOutlinks(new Utf8("http://example3.com"), new Utf8("anchor4"));
webPageStore.put("com.example/http", page);
webPageStore.close();
assertPutMap();
}
public void assertPutMap() throws IOException {
}
@Test
public void testUpdate() throws IOException {
log.info("test method: testUpdate");
DataStoreTestUtil.testUpdateEmployee(employeeStore);
DataStoreTestUtil.testUpdateWebPage(webPageStore);
}
public void testEmptyUpdate() throws IOException {
DataStoreTestUtil.testEmptyUpdateEmployee(employeeStore);
}
@Test
public void testGet() throws IOException {
log.info("test method: testGet");
DataStoreTestUtil.testGetEmployee(employeeStore);
}
@Test
public void testGetWithFields() throws IOException {
log.info("test method: testGetWithFields");
DataStoreTestUtil.testGetEmployeeWithFields(employeeStore);
}
@Test
public void testGetWebPage() throws IOException {
log.info("test method: testGetWebPage");
DataStoreTestUtil.testGetWebPage(webPageStore);
}
@Test
public void testGetWebPageDefaultFields() throws IOException {
log.info("test method: testGetWebPageDefaultFields");
DataStoreTestUtil.testGetWebPageDefaultFields(webPageStore);
}
@Test
public void testGetNonExisting() throws Exception {
log.info("test method: testGetNonExisting");
DataStoreTestUtil.testGetEmployeeNonExisting(employeeStore);
}
@Test
public void testQuery() throws IOException {
log.info("test method: testQuery");
DataStoreTestUtil.testQueryWebPages(webPageStore);
}
@Test
public void testQueryStartKey() throws IOException {
log.info("test method: testQueryStartKey");
DataStoreTestUtil.testQueryWebPageStartKey(webPageStore);
}
@Test
public void testQueryEndKey() throws IOException {
log.info("test method: testQueryEndKey");
DataStoreTestUtil.testQueryWebPageEndKey(webPageStore);
}
@Test
public void testQueryKeyRange() throws IOException {
log.info("test method: testQueryKetRange");
DataStoreTestUtil.testQueryWebPageKeyRange(webPageStore);
}
@Test
public void testQueryWebPageSingleKey() throws IOException {
log.info("test method: testQueryWebPageSingleKey");
DataStoreTestUtil.testQueryWebPageSingleKey(webPageStore);
}
@Test
public void testQueryWebPageSingleKeyDefaultFields() throws IOException {
log.info("test method: testQuerySingleKeyDefaultFields");
DataStoreTestUtil.testQueryWebPageSingleKeyDefaultFields(webPageStore);
}
@Test
public void testQueryWebPageQueryEmptyResults() throws IOException {
log.info("test method: testQueryEmptyResults");
DataStoreTestUtil.testQueryWebPageEmptyResults(webPageStore);
}
@Test
public void testDelete() throws IOException {
log.info("test method: testDelete");
DataStoreTestUtil.testDelete(webPageStore);
}
@Test
public void testDeleteByQuery() throws IOException {
log.info("test method: testDeleteByQuery");
DataStoreTestUtil.testDeleteByQuery(webPageStore);
}
@Test
public void testDeleteByQueryFields() throws IOException {
log.info("test method: testQueryByQueryFields");
DataStoreTestUtil.testDeleteByQueryFields(webPageStore);
}
@Test
public void testGetPartitions() throws IOException {
log.info("test method: testGetPartitions");
DataStoreTestUtil.testGetPartitions(webPageStore);
}
}