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 extends Throwable> expectedThrowable;
+ private Queue registeredThreads = new ConcurrentLinkedQueue<>();
+ private final Queue threadCorectness = new ConcurrentLinkedQueue<>();
+
+ public void expect(Class extends Throwable> e){
+ expectedThrowable = e;
+ }
+
+ public void registerThread(Thread t) {
+ registeredThreads.add(t);
+ final Class extends Throwable> 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
+ }
+ }
+}