/*
* Copyright (C) 2011-2016 Markus Junginger, greenrobot (http://greenrobot.org)
*
* This file is part of greenDAO Generator.
*
* greenDAO Generator is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* greenDAO Generator is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with greenDAO Generator. If not, see <http://www.gnu.org/licenses/>.
*/
package org.greenrobot.greendao.daotest.async;
import java.util.concurrent.Callable;
import android.os.Looper;
import org.greenrobot.greendao.async.AsyncDaoException;
import org.greenrobot.greendao.async.AsyncOperation;
import org.greenrobot.greendao.async.AsyncOperationListener;
import org.greenrobot.greendao.daotest.SimpleEntity;
public class BasicAsyncTest extends AbstractAsyncTest {
Thread txThread;
boolean testListenerMainThread_done;
public void testSequenceNumber() {
AsyncOperation op1 = asyncSession.count(SimpleEntity.class);
assertEquals(1, op1.getSequenceNumber());
AsyncOperation op2 = asyncSession.count(SimpleEntity.class);
assertEquals(2, op2.getSequenceNumber());
}
public void testWaitForCompletionNoOps() {
assertTrue(asyncSession.isCompleted());
assertTrue(asyncSession.waitForCompletion(1));
asyncSession.waitForCompletion();
}
public void testAsyncInsert() {
SimpleEntity entity = new SimpleEntity();
entity.setSimpleString("heho");
AsyncOperation operation = asyncSession.insert(entity);
assertWaitForCompletion1Sec();
SimpleEntity entity2 = daoSession.load(SimpleEntity.class, entity.getId());
assertNotNull(entity2);
assertEquals("heho", entity2.getSimpleString());
assertFalse(operation.isFailed());
assertSingleOperationCompleted(operation);
}
public void testAsyncUpdate() {
SimpleEntity entity = new SimpleEntity();
entity.setSimpleString("heho");
daoSession.insert(entity);
entity.setSimpleString("updated");
AsyncOperation operation = asyncSession.update(entity);
assertWaitForCompletion1Sec();
daoSession.clear();
SimpleEntity entity2 = daoSession.load(SimpleEntity.class, entity.getId());
assertNotNull(entity2);
assertEquals("updated", entity2.getSimpleString());
assertFalse(operation.isFailed());
assertSingleOperationCompleted(operation);
}
public void testOperationGetResult() {
SimpleEntity entity = new SimpleEntity();
entity.setSimpleString("heho");
daoSession.insert(entity);
daoSession.clear();
AsyncOperation operation = asyncSession.load(SimpleEntity.class, entity.getId());
SimpleEntity result = (SimpleEntity) operation.getResult();
assertTrue(operation.isCompleted());
assertTrue(operation.isCompletedSucessfully());
assertNotNull(result);
assertNotSame(entity, result);
assertEquals(entity.getId(), result.getId());
assertEquals(entity.getSimpleString(), result.getSimpleString());
}
public void testOperationGetResultException() {
SimpleEntity entity = new SimpleEntity();
daoSession.insert(entity);
AsyncOperation operation = asyncSession.insert(entity);
try {
operation.getResult();
fail("getResult should have thrown");
} catch (AsyncDaoException expected) {
// OK
}
assertTrue(operation.isCompleted());
assertFalse(operation.isCompletedSucessfully());
assertTrue(operation.isFailed());
}
public void testAsyncException() {
SimpleEntity entity = new SimpleEntity();
daoSession.insert(entity);
AsyncOperation operation = asyncSession.insert(entity);
assertWaitForCompletion1Sec();
assertSingleOperationCompleted(operation);
assertTrue(operation.isFailed());
assertNotNull(operation.getThrowable());
}
public void testAsyncExceptionCreator() {
SimpleEntity entity = new SimpleEntity();
daoSession.insert(entity);
AsyncOperation operation = asyncSession.insert(entity);
assertWaitForCompletion1Sec();
assertNull(operation.getCreatorStacktrace());
operation = asyncSession.insert(entity, AsyncOperation.FLAG_TRACK_CREATOR_STACKTRACE);
assertWaitForCompletion1Sec();
assertNotNull(operation.getCreatorStacktrace());
asyncSession.setSessionFlags(AsyncOperation.FLAG_TRACK_CREATOR_STACKTRACE);
operation = asyncSession.insert(entity);
assertWaitForCompletion1Sec();
assertNotNull(operation.getCreatorStacktrace());
StackTraceElement[] stack = operation.getCreatorStacktrace().getStackTrace();
boolean found = false;
for (StackTraceElement stackTraceElement : stack) {
found |= stackTraceElement.getClassName().equals(getClass().getName());
}
assertTrue(found);
}
public void testAsyncOperationWaitMillis() {
AsyncOperation operation = asyncSession.insert(new SimpleEntity());
assertTrue(asyncSession.waitForCompletion(1000));
assertSingleOperationCompleted(operation);
}
public void testAsyncOperationWait() {
AsyncOperation operation = asyncSession.insert(new SimpleEntity());
asyncSession.waitForCompletion();
assertSingleOperationCompleted(operation);
}
public void testAsyncRunInTx() {
AsyncOperation operation = asyncSession.runInTx(new Runnable() {
@Override
public void run() {
txThread = Thread.currentThread();
}
});
assertWaitForCompletion1Sec();
assertSingleOperationCompleted(operation);
assertNotNull(txThread);
assertFalse(Thread.currentThread().equals(txThread));
}
public void testAsynCallInTx() {
AsyncOperation operation = asyncSession.callInTx(new Callable<String>() {
@Override
public String call() throws Exception {
txThread = Thread.currentThread();
return "OK";
}
});
assertEquals("OK", operation.waitForCompletion());
assertNotNull(txThread);
assertFalse(Thread.currentThread().equals(txThread));
}
public void testListenerMainThread() throws InterruptedException {
AsyncOperationListener listener = new AsyncOperationListener() {
@Override
public synchronized void onAsyncOperationCompleted(AsyncOperation operation) {
assertEquals(Looper.getMainLooper(), Looper.myLooper());
testListenerMainThread_done = true;
notifyAll();
}
};
asyncSession.setListenerMainThread(listener);
asyncSession.insert(new SimpleEntity());
assertWaitForCompletion1Sec();
while (!testListenerMainThread_done) {
synchronized (listener) {
listener.wait(1000);
}
}
}
}