Go: издевательство над сообщением Google PubSub

Я написал приложение, в котором в качестве очереди сообщений использовалась инфраструктура Google PubSub. Поскольку Go - это язык Google, интеграция с PubSub была легкой.

Другое дело - тестирование.

Для интеграционного тестирования Google достаточно хорош, чтобы предоставить нам эмулятор PubSub.

Но я также хотел более глубокий модульный тест, чтобы проверить мое взаимодействие с самим сообщением PubSub. Например, легкий тест, который проверяет подтверждение сообщения или его отсутствие.

Структура сообщения

Легко издеваться. Поля ID, Data, Attributes и PublishTime экспортируются, поэтому проблем нет.

Но я также хочу поиздеваться над ack состоянием сообщения. У нас есть doneFunc и calledDone как указание на это, и оба они неэкспортируемые поля. Как мы все знаем, неэкспортированные поля не могут быть установлены извне, поэтому нам нужно

Издевайтесь над своими интимными частями.

Это не должно быть слишком сложно, правда? Мы можем установить их через отражение.

Но затем мы сталкиваемся со следующей ошибкой
panic: reflect: reflect.Value.Set using value obtained using unexported field

Хорошо. Мы не можем волей-неволей создать неэкспортированное поле! Создадим собственное поле с блэкджеком и проститутками! И что еще важнее - указатель на исходное поле.

Ох, хватит! Еще одна ошибка!
panic: reflect.Value.UnsafeAddr of unaddressable value

Мы не можем получить адрес поля, потому что это неадресуемое ¯ \ _ (ツ) _ / ¯
Адресуемое значение, да!

Ааи победа за нами.

Всем удачного взлома!