2. «Best config» называет конфиг, который ничего не прошёл
$maxScore = 0, $maxPing = -1. Если ни один конфиг не набрал ни одной успешной проверки, первая же итерация проходит по ветке $pingScore (0) -gt $maxPing (-1) и «лучшим» назначается первый ключ хэш-таблицы, то есть произвольный конфиг с OK: 0.
$analytics=@{}foreach($nin@("general (ALT).bat","general (ALT2).bat","general (ALT3).bat")){$analytics[$n]=@{OK=0;ERROR=48;UNSUP=0;PingOK=0;PingFail=3}}$bestConfig=$null;$maxScore=0;$maxPing=-1foreach($cin$analytics.Keys){$a=$analytics[$c];$score=$a.OK;$pingScore=0if($a.ContainsKey('PingOK')){$pingScore=$a.PingOK}if($score-gt$maxScore){$maxScore=$score;$maxPing=$pingScore;$bestConfig=$c}elseif($score-eq$maxScore){if($pingScore-gt$maxPing){$maxPing=$pingScore;$bestConfig=$c}}}$bestConfig# general (ALT3).bat, хотя OK=0 у всех трёх
Как можно воспроизвести вживую?: временно заменить utils/targets.txt на недостижимые цели(пример ниже) и прогнать несколько конфигов ( к примеру, три), которые изначально адекватно работают (= пингуются и работоспособны).
Отдельный случай - когда все конфиги пропущены (Strategy failed to start). Тогда $analytics пуст, цикл не выполняется и печатается просто Best config: без значения.
Теперь оба случая выводятся явно и красным:
Best config: n/a (no configs were tested)
Best config: n/a (no config passed a single check)
$bestConfig при этом обнуляется, чтобы значение не подхватил тот, кто будет читать его дальше. (Существует один из открытых PR, который предлагает поставить bestconfig, как активный сразу после того, как прошёл тест.)
3. Битая строка в файле результатов при падении runspace
Заглушка в Invoke-DpiSuite создаёт поля SizeBytes / SizeKB, а сохранение отчёта читает UpKB / DownKB / Time. В файл попадает:
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/Flowseal/zapret-discord-youtube/pull/17604
**Author:** [@klaymm](https://github.com/klaymm)
**Created:** 9/20/2026
**Status:** 🔄 Open
**Base:** `main` ← **Head:** `fix/test-results`
---
### 📝 Commits (2)
- [`156102a`](https://github.com/Flowseal/zapret-discord-youtube/commit/156102a3f490f5cd8f0393f822ae696122ac630d) test zapret.ps1: итоги прогона выводятся неверно
- [`14a8e99`](https://github.com/Flowseal/zapret-discord-youtube/commit/14a8e992c3342a1690d4cc052de93165ce36b3e3) Исправление моей же ошибки.
### 📊 Changes
**1 file changed** (+25 additions, -8 deletions)
<details>
<summary>View changed files</summary>
📝 `utils/test zapret.ps1` (+25 -8)
</details>
### 📄 Description
# Три бага в выводе результатов.
### 1. Сводка ANALYTICS идёт в произвольном порядке
`$analytics` - обычная хэш-таблица, порядок её ключей не совпадает с порядком тестирования. На 22 конфигах сводка получается такой: `ALT11, ALT3, FAKE TLS AUTO, ALT6, ALT5, ...` - сопоставить строку с прогоном (Лично мне) тяжело.
Порядок при этом стабилен между запусками, так что баг не плавающий, он просто всегда неправильный.
```powershell
$names = Get-ChildItem -Filter *.bat | Where-Object { $_.Name -notlike "service*" } |
Sort-Object { [Regex]::Replace($_.Name,"(\d+)",{ $args[0].Value.PadLeft(8,"0") }) } |
Select-Object -ExpandProperty Name
$h = @{}; foreach ($n in $names) { $h[$n] = 1 }
($names -join '|') -eq (($h.Keys) -join '|') # False
```
Заменил на `[ordered]@{}`.
### 2. «Best config» называет конфиг, который ничего не прошёл
`$maxScore = 0`, `$maxPing = -1`. Если ни один конфиг не набрал ни одной успешной проверки, первая же итерация проходит по ветке `$pingScore (0) -gt $maxPing (-1)` и «лучшим» назначается первый ключ хэш-таблицы, то есть произвольный конфиг с `OK: 0`.
```powershell
$analytics = @{}
foreach ($n in @("general (ALT).bat","general (ALT2).bat","general (ALT3).bat")) {
$analytics[$n] = @{OK=0;ERROR=48;UNSUP=0;PingOK=0;PingFail=3}
}
$bestConfig=$null; $maxScore=0; $maxPing=-1
foreach ($c in $analytics.Keys) {
$a=$analytics[$c]; $score=$a.OK; $pingScore=0
if ($a.ContainsKey('PingOK')) { $pingScore=$a.PingOK }
if ($score -gt $maxScore) { $maxScore=$score;$maxPing=$pingScore;$bestConfig=$c }
elseif ($score -eq $maxScore) { if ($pingScore -gt $maxPing) { $maxPing=$pingScore;$bestConfig=$c } }
}
$bestConfig # general (ALT3).bat, хотя OK=0 у всех трёх
```
Как можно воспроизвести вживую?: временно заменить `utils/targets.txt` на недостижимые цели(пример ниже) и прогнать несколько конфигов ( к примеру, три), которые изначально адекватно работают (= пингуются и работоспособны).
```
test1 = "https://127.0.0.1:9"
test2 = "https://127.0.0.1:19"
```
Отдельный случай - когда все конфиги пропущены (`Strategy failed to start`). Тогда `$analytics` пуст, цикл не выполняется и печатается просто `Best config:` без значения.
Теперь оба случая выводятся явно и красным:
```
Best config: n/a (no configs were tested)
Best config: n/a (no config passed a single check)
```
`$bestConfig` при этом обнуляется, чтобы значение не подхватил тот, кто будет читать его дальше. (Существует один из открытых PR, который предлагает поставить bestconfig, как активный сразу после того, как прошёл тест.)
### 3. Битая строка в файле результатов при падении runspace
Заглушка в `Invoke-DpiSuite` создаёт поля `SizeBytes` / `SizeKB`, а сохранение отчёта читает `UpKB` / `DownKB` / `Time`. В файл попадает:
```
RUNSPACE: code=ERR up= KB down= KB time=s status=FAIL
```
Привёл поля в соответствие, заодно в результат кладётся реальный `TargetId` вместо `UNKNOWN` и пустой `Country`, которого не хватало при записи.
```
RUNSPACE: code=ERR up=0 KB down=0 KB time=-1s status=FAIL
```
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/Flowseal/zapret-discord-youtube/pull/17604
Author: @klaymm
Created: 9/20/2026
Status: 🔄 Open
Base:
main← Head:fix/test-results📝 Commits (2)
156102atest zapret.ps1: итоги прогона выводятся неверно14a8e99Исправление моей же ошибки.📊 Changes
1 file changed (+25 additions, -8 deletions)
View changed files
📝
utils/test zapret.ps1(+25 -8)📄 Description
Три бага в выводе результатов.
1. Сводка ANALYTICS идёт в произвольном порядке
$analytics- обычная хэш-таблица, порядок её ключей не совпадает с порядком тестирования. На 22 конфигах сводка получается такой:ALT11, ALT3, FAKE TLS AUTO, ALT6, ALT5, ...- сопоставить строку с прогоном (Лично мне) тяжело.Порядок при этом стабилен между запусками, так что баг не плавающий, он просто всегда неправильный.
Заменил на
[ordered]@{}.2. «Best config» называет конфиг, который ничего не прошёл
$maxScore = 0,$maxPing = -1. Если ни один конфиг не набрал ни одной успешной проверки, первая же итерация проходит по ветке$pingScore (0) -gt $maxPing (-1)и «лучшим» назначается первый ключ хэш-таблицы, то есть произвольный конфиг сOK: 0.Как можно воспроизвести вживую?: временно заменить
utils/targets.txtна недостижимые цели(пример ниже) и прогнать несколько конфигов ( к примеру, три), которые изначально адекватно работают (= пингуются и работоспособны).Отдельный случай - когда все конфиги пропущены (
Strategy failed to start). Тогда$analyticsпуст, цикл не выполняется и печатается простоBest config:без значения.Теперь оба случая выводятся явно и красным:
$bestConfigпри этом обнуляется, чтобы значение не подхватил тот, кто будет читать его дальше. (Существует один из открытых PR, который предлагает поставить bestconfig, как активный сразу после того, как прошёл тест.)3. Битая строка в файле результатов при падении runspace
Заглушка в
Invoke-DpiSuiteсоздаёт поляSizeBytes/SizeKB, а сохранение отчёта читаетUpKB/DownKB/Time. В файл попадает:Привёл поля в соответствие, заодно в результат кладётся реальный
TargetIdвместоUNKNOWNи пустойCountry, которого не хватало при записи.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.