batch_processor_test.go
Обзор
Файл batch_processor_test.go содержит модульные и бенчмарк-тесты для компонента пакетной обработки игровых действий — BatchProcessor. Основная цель тестов — проверить корректность создания, добавления действий в пакет, валидации, генерации и подписи пакетов, а также обработку ошибок и повторные попытки отправки неудачных пакетов.
Данный файл предназначен для обеспечения качества и стабильности логики пакетной обработки игровых событий в рамках игровой системы, взаимодействующей с блокчейном Ethereum и смарт-контрактами.
Содержимое файла и описание функций
Все тесты используют пакет testing и testify/assert для удобной проверки результатов.
Тесты конструктора и конфигурации
TestNewBatchProcessor(t *testing.T)
Проверяет создание нового экземпляра BatchProcessor с заданной конфигурацией.
Инициализирует движок игры (
NewGameEngine()).Создаёт конфигурацию
BatchProcessorConfigс параметрами:MaxBatchSize— максимальный размер пакета.BatchTimeout— таймаут ожидания формирования пакета.MaxRetries— максимальное число повторных попыток отправки.RetryDelay— задержка между попытками.ValidatorKey— ключ валидатора (массив байтов).NetworkID— идентификатор сети.
Проверяет, что созданный объект не
nilи параметры соответствуют ожидаемым.
Тесты добавления игровых действий
TestBatchProcessor_AddAction(t *testing.T)
Проверяет метод AddAction:
Создаёт
BatchProcessorс конфигурацией.Создаёт пример игрового действия
GameActionEvent.Добавляет действие в пакет через
AddAction.Проверяет отсутствие ошибки и увеличение размера очереди.
TestBatchProcessor_AddActionToBatch(t *testing.T)
Тестирует внутренний метод addActionToBatch:
Создаёт
BatchProcessorс малым размером пакета (2 действия).Добавляет два действия по очереди.
После добавления второго действия должно произойти формирование и очистка пакета.
Проверяется размер текущего пакета после каждой операции.
Тесты валидации и генерации пакетов
TestBatchProcessor_ValidateBatch(t *testing.T)
Демонстрирует структуру проверки пакета.
Использует фиктивные игровые действия с разными типами (написание маны и получение маны).
Проверяет, что пакет содержит нужное количество действий.
Реальная валидация требует моков контрактов, здесь лишь структура.
TestBatchProcessor_GenerateBatchID(t *testing.T)
Проверяет генерацию уникального идентификатора пакета.
Добавляет несколько действий в текущий пакет.
Проверяет, что ID не пустой и содержит префикс "batch_".
TestBatchProcessor_CreateBatchData(t *testing.T)
Проверяет создание хэшированных данных пакета (
createBatchData).Формирует данные из списка действий и состояний игроков.
Проверяется, что результат — 32-байтовый хэш (Keccak256).
Тесты подписи данных пакета
TestBatchProcessor_SignBatchData(t *testing.T)
Проверяет корректную подпись данных с валидным ключом.
Создаёт тестовый приватный ключ (32 байта).
Подписывает строку байт.
Проверяет, что подпись не пустая и имеет длину 65 байт (стандарт ECDSA).
TestBatchProcessor_SignBatchDataNoKey(t *testing.T)
Проверяет поведение при отсутствии ключа.
Ожидается ошибка и
nilв качестве подписи.
Тесты обработки ошибок и повторных попыток
TestBatchProcessor_HandleFailedBatch(t *testing.T)
Тестирует логику повторных попыток для неудачного пакета.
Создаёт действие с нулевым счетчиком попыток.
Вызывает метод обработки неудачного результата.
Проверяется, что действие вернулось в очередь.
TestBatchProcessor_HandleFailedBatchMaxRetries(t *testing.T)
Проверяет, что действия с превышенным числом попыток не повторяются.
Создаёт действие с количеством попыток больше максимума.
Проверяет, что размер очереди не изменился.
Бенчмарки производительности
BenchmarkBatchProcessor_AddAction(b *testing.B)— производительность добавления действий.BenchmarkBatchProcessor_CreateBatchData(b *testing.B)— производительность создания данных пакета.BenchmarkBatchProcessor_SignBatchData(b *testing.B)— производительность подписи данных.
В каждом бенчмарке создаётся типичный набор данных и измеряется время выполнения ключевых методов.
Важные детали реализации и алгоритмы
Тесты проверяют логику пакетной обработки игровых действий, которая включает в себя:
Формирование пакетов заданного размера или по таймауту.
Валидацию пакетов (через взаимодействие с контрактами).
Генерацию уникальных ID пакетов.
Создание хэшированных данных для подписи.
Подпись пакетов с помощью приватного ключа валидатора.
Обработку ошибок при отправке пакетов с повторными попытками.
Повторные попытки реализованы через асинхронное добавление действий обратно в очередь с задержкой.
Подпись строится по стандарту ECDSA (65 байт).
Используется библиотека
testify/assertдля удобства тестирования.
Взаимодействие с другими частями системы
Используется
GameEngine— движок игры, реализующий игровую логику.Взаимодействует с контрактами Ethereum через пакет
sum/internal/contracts.Использует типы из пакета
github.com/ethereum/go-ethereum/commonдля адресов и идентификаторов.Тестируемый компонент
BatchProcessorявляется частью подсистемы пакетной обработки игровых событий и вероятно интегрирован с сетью Ethereum для подтверждения и валидации действий.
Визуальная диаграмма: Структура тестируемого BatchProcessor
flowchart TD
A[BatchProcessor] --> B[AddAction(action)]
A --> C[addActionToBatch(ctx, action)]
C --> D{Текущий размер пакета < MaxBatchSize?}
D -- Да --> E[Добавить действие в currentBatch]
D -- Нет --> F[Обработать пакет (processBatch)]
A --> G[ValidateBatch(batch)]
A --> H[GenerateBatchID()]
A --> I[CreateBatchData(batchID, actions, playerStates)]
A --> J[SignBatchData(data)]
A --> K[HandleFailedBatch(ctx, batchResult)]
K --> L{RetryCount < MaxRetries?}
L -- Да --> M[Добавить действие в очередь для повтора]
L -- Нет --> N[Отбросить действие]
Пример использования (из тестов)
gameEngine := NewGameEngine()
config := BatchProcessorConfig{
MaxBatchSize: 10,
BatchTimeout: 5 * time.Second,
MaxRetries: 3,
RetryDelay: 1 * time.Second,
ValidatorKey: make([]byte, 32),
NetworkID: "test-network",
}
bp := NewBatchProcessor(gameEngine, nil, nil, config)
action := GameActionEvent{
ChainID: 1,
ActionID: [32]byte{1, 2, 3},
Action: contracts.GameManagerGameAction{
Player: common.HexToAddress("0x1234567890123456789012345678901234567890"),
ActionType: 0,
ManaAmount: big.NewInt(100),
},
Timestamp: time.Now(),
}
err := bp.AddAction(action)
if err != nil {
log.Fatalf("Failed to add action: %v", err)
}
Данная документация описывает тесты и ключевые аспекты BatchProcessor, обеспечивающего пакетную обработку игровых событий с надёжностью, валидацией и интеграцией с Ethereum.