From 771758c831e35fdf1b1dafe49b5c22d832e4561be72844a5457e3eeae5c0d8ac Mon Sep 17 00:00:00 2001 From: AidarKC Date: Fri, 2 Jan 2026 16:54:13 +0300 Subject: [PATCH] =?UTF-8?q?02=2001=2025=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=D0=BE=D0=B2=20=D0=B2=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D0=B9=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=20(=20?= =?UTF-8?q?=D1=81=D1=82=D0=BB=D0=BE=20=D1=83=D0=B4=D0=BE=D0=B1=D0=BD=D0=B5?= =?UTF-8?q?=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Дальше делать: Описание форматов. Запросы клиент-сервер. Промт на клиента. --- Потом в сервак дописать Синхронизацию серверов. --- .../java/test/it/IT_03_AddBlock_NoAuth.java | 126 ++++++------------ .../test/it/addBlockUtils/AddBlockFlow.java | 2 +- .../test/it/addBlockUtils/WsJsonOneShot.java | 2 + .../addBlockUtils/WsJsonRoundtripClient.java | 2 + 4 files changed, 46 insertions(+), 86 deletions(-) diff --git a/src/test/java/test/it/IT_03_AddBlock_NoAuth.java b/src/test/java/test/it/IT_03_AddBlock_NoAuth.java index 9e57686..401b105 100644 --- a/src/test/java/test/it/IT_03_AddBlock_NoAuth.java +++ b/src/test/java/test/it/IT_03_AddBlock_NoAuth.java @@ -1,37 +1,18 @@ package test.it; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; +import blockchain.body.HeaderBody; +import blockchain.body.ReactionBody; +import blockchain.body.TextBody; +import test.it.addBlockUtils.AddBlockSender; +import test.it.addBlockUtils.ChainState; import test.it.utils.ItRunContext; import test.it.utils.TestConfig; import test.it.utils.TestLog; -import test.it.addBlockUtils.AddBlockFlow; import java.time.Duration; import static org.junit.jupiter.api.Assertions.*; -/** - * IT_03_AddBlock_NoAuth - * - * Интеграционный тест добавления блоков в персональный блокчейн без отдельной авторизации. - * - * Сценарий (как ты попросил): - * 1) AddBlock: HEADER (global=0, line=0, lineNum=0, prevGlobalHash=ZERO64) -> 200 - * 2) AddBlock: TEXT#1 (global=1, line=1, lineNum=1, prevGlobalHash=hash(0)) -> 200 - * 3) AddBlock: TEXT#2 (global=2, line=1, lineNum=2, prevGlobalHash=hash(1)) -> 200 - * 4) AddBlock: TEXT#3 (global=3, line=1, lineNum=3, prevGlobalHash=hash(2)) -> 200 - * 5) AddBlock: REACT#1 (global=4, line=2, lineNum=1, prevGlobalHash=hash(3)) -> 200 - * - реакция на TEXT#1 (toBchName, toGlobal=1, toHash=hash(TEXT#1)) - * - * Важно по линиям (твоя договорённость): - * - line 0: нулевой блок (HEADER) один на весь блокчейн (глобальный 0) - * - line 1 и line 2: первый блок каждой линии ссылается prevLineHash на hash(нулевого блока) - * - * В этом тесте состояние ведёт AddBlockFlow: - * - lineLastNumber[line] — сколько блоков в линии (то есть последний lineNum) - * - lineLastHashHex[line] — hash последнего блока линии (HEX64) - */ public class IT_03_AddBlock_NoAuth { public static void main(String[] args) { @@ -39,89 +20,64 @@ public class IT_03_AddBlock_NoAuth { // System.exit(failed); } - /** Запуск одного теста (standalone). Возвращает 0 если ок, 1 если упал. */ public static int run() { return TestLog.runOne("IT_03_AddBlock_NoAuth", IT_03_AddBlock_NoAuth::testBody); } - @BeforeAll - static void ensureUserExists() { - ItRunContext.initIfNeeded(); - - // ВАЖНО: - // - requestId тут не важен, но пусть будет. - // - отдельная авторизация не нужна, но пользователь должен существовать. - // - // Если хочешь реально включить предусловие здесь — просто раскомментируй блок, - // но сейчас у тебя он закомментирован. -// String reqJson = JsonBuilders.addUser("it03-adduser-beforeall"); - // ничего не делаем — предусловие временно отключено - } - -// @Test - void addBlock_shouldAppendHeaderThenTextThenReaction() { - // JUnit-режим: как обычно - testBody(); - } - private static void testBody() { ItRunContext.initIfNeeded(); - ensureUserExists(); - // таймаут на каждый one-shot запрос Duration t = Duration.ofSeconds(1); if (TestConfig.DEBUG()) { TestLog.titleBlock(""" - IT_03_AddBlock_NoAuth: сценарий AddBlock без отдельной авторизации - Используем: - login = %s - blockchainName = %s - debug=true: покажем отправку/ответ (JSON) и проверки hash + IT_03_AddBlock_NoAuth: AddBlock без отдельной авторизации (линейный сценарий) + login = %s + blockchainName = %s """.formatted(TestConfig.LOGIN(), TestConfig.BCH_NAME())); } - // 1) состояние + сборка + отправка - AddBlockFlow flow = new AddBlockFlow(); + ChainState st = new ChainState(); + AddBlockSender sender = new AddBlockSender(st); - // ========================================================= - // ШАГ 0: ВАЖНО — первым всегда HEADER global=0 - // ========================================================= - if (TestConfig.DEBUG()) TestLog.stepTitle("ШАГ 0: AddBlock HEADER (global=0, line=0, lineNum=0)"); - flow.sendHeader0(t); + // 0) HEADER + if (TestConfig.DEBUG()) TestLog.stepTitle("ШАГ 0: HEADER"); + sender.send(new HeaderBody(TestConfig.LOGIN()), t); - // ========================================================= - // ШАГ 1..3: TEXT (line=1) - // ========================================================= - if (TestConfig.DEBUG()) TestLog.stepTitle("ШАГ 1: AddBlock TEXT#1 (line=1)"); - AddBlockFlow.BuiltBlock text1 = flow.sendNextText("Hello #1 from IT_03 test", t); + // 1) TEXT#1 + if (TestConfig.DEBUG()) TestLog.stepTitle("ШАГ 1: TEXT#1"); + sender.send(new TextBody("Hello #1 from IT_03 test"), t); - if (TestConfig.DEBUG()) TestLog.stepTitle("ШАГ 2: AddBlock TEXT#2 (line=1)"); - flow.sendNextText("Hello #2 from IT_03 test", t); + // Снимок hash TEXT#1 (после отправки) + // TEXT линия = 1, первый text имеет lineNum=1 и на этом шаге он “последний”. + byte[] text1Hash32 = st.lineLastHash32((short) 1); + assertNotNull(text1Hash32); + assertEquals(32, text1Hash32.length); - if (TestConfig.DEBUG()) TestLog.stepTitle("ШАГ 3: AddBlock TEXT#3 (line=1)"); - flow.sendNextText("Hello #3 from IT_03 test", t); + // 2) TEXT#2 + if (TestConfig.DEBUG()) TestLog.stepTitle("ШАГ 2: TEXT#2"); + sender.send(new TextBody("Hello #2 from IT_03 test"), t); - // ========================================================= - // ШАГ 4: REACT#1 (line=2) -> на TEXT#1 (global=1, hash=text1) - // ========================================================= - if (TestConfig.DEBUG()) TestLog.stepTitle("ШАГ 4: AddBlock REACT#1 (line=2) -> на TEXT#1 (global=1)"); - flow.sendNextReaction( - (short) 1, // reactionCode (пример: 1 = like) - TestConfig.BCH_NAME(), // toBlockchainName - 1, // toBlockGlobalNumber = 1 (TEXT#1) - text1.hash32, // toBlockHash32 = hash(TEXT#1) - t + // 3) TEXT#3 + if (TestConfig.DEBUG()) TestLog.stepTitle("ШАГ 3: TEXT#3"); + sender.send(new TextBody("Hello #3 from IT_03 test"), t); + + // 4) REACT#1 -> на TEXT#1 (global=1) + if (TestConfig.DEBUG()) TestLog.stepTitle("ШАГ 4: REACT#1 -> на TEXT#1"); + + ReactionBody like = new ReactionBody( + ReactionBody.SUB_LIKE, + TestConfig.BCH_NAME(), + 1, + text1Hash32 ); + sender.send(like, t); - // Мини-контроль итогов (если захочешь — красиво залогируем через твой TestLog) - assertEquals(4, flow.globalLastNumber(), "После 1 header + 3 text + 1 react globalLastNumber должен быть 4"); - assertEquals(3, flow.lineLastNumber(AddBlockFlow.LINE_TEXT), "В line=1 должно быть 3 блока"); - assertEquals(1, flow.lineLastNumber(AddBlockFlow.LINE_REACT), "В line=2 должен быть 1 блок"); - assertNotNull(flow.globalLastHashHex()); - assertEquals(64, flow.globalLastHashHex().length()); + // Итоги (быстро) + assertEquals(4, st.globalLastNumber(), "После 1 header + 3 text + 1 react globalLastNumber должен быть 4"); + assertEquals(3, st.lineLastNumber((short) 1), "В line=1 должно быть 3 блока"); + assertEquals(1, st.lineLastNumber((short) 2), "В line=2 должен быть 1 блок"); - // Итог (в обычном режиме это будет единственная строка) TestLog.pass("IT_03_AddBlock_NoAuth: OK"); } } \ No newline at end of file diff --git a/src/test/java/test/it/addBlockUtils/AddBlockFlow.java b/src/test/java/test/it/addBlockUtils/AddBlockFlow.java index e4c6046..98839c4 100644 --- a/src/test/java/test/it/addBlockUtils/AddBlockFlow.java +++ b/src/test/java/test/it/addBlockUtils/AddBlockFlow.java @@ -1,5 +1,5 @@ package test.it.addBlockUtils; - +// старый класс import blockchain.BchBlockEntry; import blockchain.BchCryptoVerifier; import blockchain.body.HeaderBody; diff --git a/src/test/java/test/it/addBlockUtils/WsJsonOneShot.java b/src/test/java/test/it/addBlockUtils/WsJsonOneShot.java index dc6e077..c65ac5f 100644 --- a/src/test/java/test/it/addBlockUtils/WsJsonOneShot.java +++ b/src/test/java/test/it/addBlockUtils/WsJsonOneShot.java @@ -1,5 +1,7 @@ package test.it.addBlockUtils; +// старый класс + import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; diff --git a/src/test/java/test/it/addBlockUtils/WsJsonRoundtripClient.java b/src/test/java/test/it/addBlockUtils/WsJsonRoundtripClient.java index 2c8fe37..45d4faf 100644 --- a/src/test/java/test/it/addBlockUtils/WsJsonRoundtripClient.java +++ b/src/test/java/test/it/addBlockUtils/WsJsonRoundtripClient.java @@ -1,5 +1,7 @@ package test.it.addBlockUtils; +// старый класс + import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper;