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
Мы не можем получить адрес поля, потому что это неадресуемое ¯ \ _ (ツ) _ / ¯
Адресуемое значение, да!
Ааи победа за нами.
Всем удачного взлома!