From f26810f2f83c87b4c45a458b2bcfd5aea7d7bb91 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Wed, 12 Feb 2025 10:57:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD=D0=B0?= =?UTF-8?q?=20deadlocks=20=D0=B8=20race=20conditions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/spbstu/telematics/java/AppTest.java | 73 ++++++++++++++++++- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/lab3/src/test/java/ru/spbstu/telematics/java/AppTest.java b/lab3/src/test/java/ru/spbstu/telematics/java/AppTest.java index f68905c..bbc1222 100644 --- a/lab3/src/test/java/ru/spbstu/telematics/java/AppTest.java +++ b/lab3/src/test/java/ru/spbstu/telematics/java/AppTest.java @@ -3,9 +3,76 @@ package ru.spbstu.telematics.java; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; -class SampleTests { +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadMXBean; + +public class AppTest { + + /** + * Тест проверяет, что при параллельном запуске всех потоков + * не возникает взаимной блокировки (deadlock). + */ @Test - void sampleTest() { - assertTrue(true); + void testNoDeadlock() throws InterruptedException { + Room room = new Room(); + Settings settings = new Settings(28.0, 0.4); + Controller controller = new Controller(room, settings); + Thread controllerThread = new Thread(controller); + Thread roomThread = new Thread(room); + + controllerThread.start(); + roomThread.start(); + + // Будем проверять наличие deadlock несколько раз с периодом 1 сек + // Общая длительность теста 10 секунд + ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); + for (int i = 0; i < 10; i++) { + Thread.sleep(1000); + + long[] threadIds = threadBean.findDeadlockedThreads(); + // Если возвращается не null, значит обнаружен deadlock + assertNull(threadIds, "Обнаружен deadlock."); + } + + controllerThread.interrupt(); + roomThread.interrupt(); + + controllerThread.join(); + roomThread.join(); + } + + /** + * Тест проверяет отсутствие гонок (race conditions), + * когда значения становятся очевидно некорректными или программа "падает". + */ + @Test + void testNoRaceCondition() throws InterruptedException { + Room room = new Room(); + Settings settings = new Settings(25.0, 0.4); + Controller controller = new Controller(room, settings); + Thread controllerThread = new Thread(controller, "Controller-Thread"); + Thread roomThread = new Thread(room, "Room-Thread"); + + controllerThread.start(); + roomThread.start(); + + long startTime = System.currentTimeMillis(); + long testDuration = 10000; + + while (System.currentTimeMillis() - startTime < testDuration) { + double t = room.getTemperature(); + double h = room.getHumidity(); + + assertTrue(t > -50 && t < 100, "Температура вышла за пределы допустимых значений, возможна гонка"); + assertTrue(h >= -0.5 && h <= 1.5, "Влажность вышла за пределы допустимых значений, возможна гонка"); + + Thread.sleep(200); + } + + controllerThread.interrupt(); + roomThread.interrupt(); + + controllerThread.join(); + roomThread.join(); } }