package ru.sber.pprb.mars.spr.lt.gatling.test;
import org.junit.jupiter.api.Test;
import ru.sber.pprb.mars.spr.lt.config.OttConfigProperties;
import ru.sber.pprb.mars.spr.lt.gatling.scenario.OrchestratorStrategy;
import io.gatling.app.Gatling;
import io.gatling.core.config.GatlingPropertiesBuilder;
import lombok.extern.slf4j.Slf4j;

// Импортируем необходимые библиотеки
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import ru.sber.pprb.mars.spr.lt.services.OTTService;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;

@Slf4j
@SpringBootTest(classes = {OttConfigProperties.class})
@EnableAutoConfiguration
public class LoadTestExecutor {

    private static final String PYTHON_SCRIPT_PATH = "C:\\Users\\22240938\\Desktop\\пакеты\\PYTHON_Project\\generate_requests.py";
    private static final int ITERATIONS = 3;

    @Autowired
    OttConfigProperties ottConfigProperties;

    final GatlingPropertiesBuilder properties = new GatlingPropertiesBuilder()
            .resourcesDirectory("./src/main/resources")
            .resultsDirectory("./target/gatling");

    private AtomicBoolean running = new AtomicBoolean(true);

    @Test
    public void appMMBLoadTesting() {
        log.info("Запуск разового прогона скриптов");

        for (int i = 0; i < ITERATIONS && running.get(); i++) {
            log.info("Запуск итерации тестирования: " + (i + 1));

            Thread gatlingThread = new Thread(this::runGatlingSimulation);
            gatlingThread.start();

            // Ждём 60 секунд
            try {
                gatlingThread.join(60000);
                if (gatlingThread.isAlive()) {
                    gatlingThread.interrupt(); // Прерываем поток, если он все еще активен
                    log.warn("Gatling simulation was forcibly terminated due to timeout.");
                }
            } catch (InterruptedException e) {
                log.error("Ошибка ожидания потока Gatling", e);
            }

            if (running.get()) {
                log.info("Тестирование завершено. Запуск Python скрипта.");
                runPythonScript();
            } else {
                log.info("Прекращение выполнения из-за остановки.");
                break;
            }
        }
    }

    private void runGatlingSimulation() {
        // Настройте стратегию на основе вашей текущей реализации
        OrchestratorStrategy.test = "test";
        OrchestratorStrategy.strategy = "applicationMMB";
        OrchestratorStrategy.repeatFile = "result\\1715699813726\\repeat.csv";
        OrchestratorStrategy.ottService = new OTTService(ottConfigProperties);

        log.info("Параметры запуска: ott-{}", ottConfigProperties.isEnabled());

        // Выполняем симуляцию
        try {
            String simulationClass = OrchestratorStrategy.class.getName();
            runSimulation(simulationClass);
        } catch (Exception e) {
            log.error("Ошибка при выполнении симуляции", e);
        }
    }

    private void runSimulation(String simulationClass) {
        properties.simulationClass(simulationClass);
        int statusCode = Gatling.fromMap(properties.build());
        String error = statusCode == 2 ? "AssertionsFailed" : "InvalidArguments";
        assertThat("Результат теста не успешный (" + error + ") ", statusCode, is(0));
    }

    private void runPythonScript() {
        try {
            ProcessBuilder processBuilder = new ProcessBuilder("python", PYTHON_SCRIPT_PATH);
            Process process = processBuilder.start();

            if (!process.waitFor(60, TimeUnit.SECONDS)) {
                process.destroy(); // Вместо этого можно использовать destroyForcibly()
                log.warn("Python script was forcibly terminated due to timeout.");
            } else {
                log.info("Python script executed successfully.");
            }
        } catch (IOException | InterruptedException e) {
            log.error("Failed to execute Python script", e);
        }
    }

    // Метод для принудительной остановки выполнения
    public void stop() {
        running.set(false);
    }
}
выход
...body:
{"executionResult":null,"instanceId":"470a9298-3cd6-4398-98f2-34db28236e82","rqUid":"7a332c024da74353b1c97025cffc9deb","status":{"rsCode":"108","rsMessage":"Техническая ошибка: 109 Ошибка исполнения дочерней стратегии: 609ca7f3-406f-4139-a880-2e8f1f1c5011","addCode":null,"addMessage":null}}
<<<<<<<<<<<<<<<<<<<<<<<<<
18:10:06.300 [WARN ] r.s.p.m.s.l.g.t.LoadTestExecutor - Gatling simulation was forcibly terminated due to timeout.
18:10:06.302 [INFO ] r.s.p.m.s.l.g.t.LoadTestExecutor - Тестирование завершено. Запуск Python скрипта.
18:10:06.300 [ERROR] i.g.a.Gatling$ - Run crashed
java.lang.InterruptedException: null
	at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1081)
	at scala.concurrent.impl.Promise$DefaultPromise.tryAwait0(Promise.scala:241)
	at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:261)
	at scala.concurrent.Await$.$anonfun$result$1(package.scala:201)
	at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:62)
	at scala.concurrent.Await$.result(package.scala:124)
	at io.gatling.app.Runner.start(Runner.scala:104)
	at io.gatling.app.Runner.run(Runner.scala:59)
	at io.gatling.app.Gatling$.start(Gatling.scala:89)
	at io.gatling.app.Gatling$.fromMap(Gatling.scala:43)
	at io.gatling.app.Gatling.fromMap(Gatling.scala)
	at ru.sber.pprb.mars.spr.lt.gatling.test.LoadTestExecutor.runSimulation(LoadTestExecutor.java:89)
	at ru.sber.pprb.mars.spr.lt.gatling.test.LoadTestExecutor.runGatlingSimulation(LoadTestExecutor.java:81)
	at java.base/java.lang.Thread.run(Thread.java:833)
18:10:06.552 [INFO ] a.a.CoordinatedShutdown - Running CoordinatedShutdown with reason [ActorSystemTerminateReason]
Gatling 3.12.0 is available! (you're using 3.9.5)
Simulation ru.sber.pprb.mars.spr.lt.gatling.scenario.OrchestratorStrategy started...

================================================================================
2024-09-25 18:10:15                                           5s elapsed
---- Requests ------------------------------------------------------------------
> Global                                                   (OK=0      KO=0     )
то есть прогон запросов завершился, но скрипт питон не сработал, опять пошел прогон запросов. почему