diff --git a/pom.xml b/pom.xml index 2614c9f..735ad26 100644 --- a/pom.xml +++ b/pom.xml @@ -2,12 +2,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ru.spbau.mit + ru.spbau.yaveyn.java.junithw assignments 1.0-SNAPSHOT jar - assignments + junithw http://maven.apache.org @@ -19,7 +19,6 @@ junit junit 4.12 - test org.hamcrest diff --git a/src/main/java/ru/spbau/mit/.gitkeep b/src/main/java/ru/spbau/mit/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/ru/spbau/yaveyn/java/junithw/MemoryLeakLimit.java b/src/main/java/ru/spbau/yaveyn/java/junithw/MemoryLeakLimit.java new file mode 100644 index 0000000..0e2ee41 --- /dev/null +++ b/src/main/java/ru/spbau/yaveyn/java/junithw/MemoryLeakLimit.java @@ -0,0 +1,35 @@ +package ru.spbau.yaveyn.java.junithw; + +/** + * Created by bronti on 04.05.17. + */ + +import org.junit.Assert; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +public class MemoryLeakLimit implements TestRule { + private long mbLimit; + + public Statement apply(final Statement base, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + Runtime rt = Runtime.getRuntime(); + System.gc(); + long beforeUsedMb = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024; + base.evaluate(); + long afterUsedMb = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024; + System.gc(); + Assert.assertTrue( + String.format("Memory leak detected (%1$d Mb > %2$d Mb)", afterUsedMb - beforeUsedMb, mbLimit), + afterUsedMb - beforeUsedMb <= mbLimit); + } + }; + } + + public void limit(long mb) { + this.mbLimit = mb; + } +} diff --git a/src/main/java/ru/spbau/yaveyn/java/junithw/ThreadExpectedException.java b/src/main/java/ru/spbau/yaveyn/java/junithw/ThreadExpectedException.java new file mode 100644 index 0000000..eca4624 --- /dev/null +++ b/src/main/java/ru/spbau/yaveyn/java/junithw/ThreadExpectedException.java @@ -0,0 +1,64 @@ +package ru.spbau.yaveyn.java.junithw; + +import com.sun.org.apache.xpath.internal.operations.Bool; +import org.junit.Assert; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +/** + * Created by bronti on 04.05.17. + */ +public class ThreadExpectedException implements TestRule { + + private Class expectedThrowable; + private Queue registeredThreads = new ConcurrentLinkedQueue<>(); + private final Queue threadCorectness = new ConcurrentLinkedQueue<>(); + + public void expect(Class e){ + expectedThrowable = e; + } + + public void registerThread(Thread t) { + registeredThreads.add(t); + final Class currentThrowable = expectedThrowable; + t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread t, Throwable e) { + if (currentThrowable.equals(e.getClass())) { + threadCorectness.add(true); + } + } + }); +// t.start(); + // не уверена, что правильно поняла задание, если честно.. + } + + @Override + public Statement apply(final Statement base, Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + base.evaluate(); + String msg = "Some thread is running or did not throw expected exception."; + if (expectedThrowable != null) { + Assert.assertEquals(msg, registeredThreads.size(), threadCorectness.size()); + } + for (Thread t : registeredThreads) { + t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread t, Throwable e) {} + }); + } + registeredThreads.clear(); + threadCorectness.clear(); + // судя по заданию, если expectedThrowable -- null, то не надо ничего проверять. Надеюсь, я правильно поняла. + } + }; + } +} diff --git a/src/test/java/ru/spbau/mit/.gitkeep b/src/test/java/ru/spbau/mit/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/java/ru/spbau/yaveyn/java/junithw/MemoryLeakLimitTest.java b/src/test/java/ru/spbau/yaveyn/java/junithw/MemoryLeakLimitTest.java new file mode 100644 index 0000000..4826255 --- /dev/null +++ b/src/test/java/ru/spbau/yaveyn/java/junithw/MemoryLeakLimitTest.java @@ -0,0 +1,27 @@ +package ru.spbau.yaveyn.java.junithw; + +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; + +/** + * Created by bronti on 04.05.17. + */ +public class MemoryLeakLimitTest { + + @Rule + public MemoryLeakLimit mll = new MemoryLeakLimit(); + + + + @Test + public void testSuccess() { + mll.limit(1); + } + + @Test + @Ignore + public void testFail() { + mll.limit(-1); + } +} diff --git a/src/test/java/ru/spbau/yaveyn/java/junithw/ThreadExpectedExceptionTest.java b/src/test/java/ru/spbau/yaveyn/java/junithw/ThreadExpectedExceptionTest.java new file mode 100644 index 0000000..39ce9f4 --- /dev/null +++ b/src/test/java/ru/spbau/yaveyn/java/junithw/ThreadExpectedExceptionTest.java @@ -0,0 +1,75 @@ +package ru.spbau.yaveyn.java.junithw; + +import com.sun.javaws.exceptions.InvalidArgumentException; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import sun.plugin.dom.exception.InvalidStateException; + +/** + * Created by bronti on 04.05.17. + */ +public class ThreadExpectedExceptionTest { + + @Rule + public ThreadExpectedException tee = new ThreadExpectedException(); + + + + @Test + public void testSuccess() { + Thread t = new Thread () { + @Override + public void run(){ + throw new InvalidStateException(""); + } + }; + tee.expect(InvalidStateException.class); + tee.registerThread(t); + t.start(); + try { + Thread.sleep(100); + } + catch (Exception e) { + // do nothing + } + } + + @Test + public void testNotExpected() { + Thread t = new Thread () { + @Override + public void run(){ + throw new InvalidStateException(""); + } + }; + tee.registerThread(t); + t.start(); + try { + Thread.sleep(100); + } + catch (Exception e) { + // do nothing + } + } + + @Test + @Ignore + public void testFail() { + Thread t = new Thread () { + @Override + public void run(){ + throw new InvalidStateException(""); + } + }; + tee.expect(InvalidArgumentException.class); + tee.registerThread(t); + t.start(); + try { + Thread.sleep(100); + } + catch (Exception e) { + // do nothing + } + } +}