package org.zstack.test.core.defer;
import junit.framework.Assert;
import org.junit.Test;
import org.zstack.core.defer.Defer;
import org.zstack.core.defer.Deferred;
import org.zstack.utils.Utils;
import org.zstack.utils.logging.CLogger;
public class TestDefer {
CLogger logger = Utils.getLogger(TestDefer.class);
boolean success = false;
boolean success21 = false;
boolean success22 = false;
boolean success31 = false;
boolean success41 = false;
boolean success51 = false;
boolean success52 = false;
boolean success61 = false;
boolean success62 = false;
boolean success63 = false;
@Deferred
private void case1() {
Defer.defer(new Runnable() {
@Override
public void run() {
success = true;
}
});
}
@Deferred
private void case21() {
Defer.defer(new Runnable() {
@Override
public void run() {
success21 = true;
}
});
case22();
}
@Deferred
private void case22() {
Defer.defer(new Runnable() {
@Override
public void run() {
success22 = true;
}
});
}
private void case2() {
case21();
Assert.assertTrue(success21);
Assert.assertTrue(success22);
}
@Deferred
private void case31() {
Defer.defer(new Runnable() {
@Override
public void run() {
success31 = true;
}
});
throw new RuntimeException("case 31");
}
private void case3() {
try {
case31();
} catch (RuntimeException e) {
//ignore
}
Assert.assertTrue(success31);
}
private void throwExceptionForCase41() {
throw new RuntimeException("case 41");
}
@Deferred
private void case41() {
throwExceptionForCase41();
Defer.defer(new Runnable() {
@Override
public void run() {
success41 = true;
}
});
}
private void case4() {
try {
case41();
} catch (RuntimeException e) {
//ignore
}
Assert.assertFalse(success41);
}
@Deferred
private void case51() {
Defer.defer(new Runnable() {
@Override
public void run() {
success51 = true;
}
});
Defer.guard(new Runnable() {
@Override
public void run() {
success52 = true;
}
});
throw new RuntimeException("case 31");
}
private void case5() {
try {
case51();
} catch (RuntimeException e) {
//ignore
}
Assert.assertTrue(success51);
Assert.assertTrue(success52);
}
@Deferred
private void case62() {
Defer.guard(new Runnable() {
@Override
public void run() {
success62 = true;
}
});
throw new RuntimeException("case 61");
}
@Deferred
private void case61() {
Defer.defer(new Runnable() {
@Override
public void run() {
success61 = true;
}
});
Defer.guard(new Runnable() {
@Override
public void run() {
success63 = true;
}
});
case62();
}
private void case6() {
try {
case61();
} catch (RuntimeException e) {
//ignore
}
Assert.assertTrue(success61);
Assert.assertTrue(success62);
Assert.assertTrue(success63);
}
@Test
public void test() {
case1();
Assert.assertTrue(success);
case2();
case3();
case4();
case5();
case6();
}
}