Boost сериализация и QString

Время от времени кому то в голову приходит мысль использовать boost сериализацию в проектах с Qt. Тут встает вопрос как быть со строками, т.к. хочется просматривать  и редактировать.

Просто приведу пример кода без объяснений, думаю что все и так знают как можно работать с юникодом

namespace boost
{
    namespace serialization
    {

        template<class Archive>
        inline void save(Archive& ar, const QString& s,
                const unsigned int /*version*/)
        {
            auto ba = s.toUtf8();
            std::string str(ba.data(), ba.size());

            ar << make_nvp("QString", str);
        }

        template<class Archive>
        inline void load(Archive& ar, QString& s,
                const unsigned int /*version*/)
        {
            std::string str;
            ar >> make_nvp("QString", str);
            QByteArray ba(&str[0], str.size());
            s.append(ba);
        }

        template<class Archive>
        inline void serialize(Archive& ar, QString& s,
                const unsigned int file_version)
        {
            boost::serialization::split_free(ar, s, file_version);
        }
    }
}

Qt+GTest функциональное тестирование сетевых компонентов

Для тех кто не знает, что такое GTest отправляю на wiki: Google C++ Testing Framework(рус.). И путь вас не смущает, что это библиотека для модульного тестирования.

Использование фреймворка семейства xUnit, для функционального тестирования пришло в голову, когда реализовывал REST интерфейс к конфигурации Service Quality Management, в разработке которой я принимаю участие(на момент написания заметки). Это приложение на PHP с использованием SLIM, json-schema. PHPUnit использовался для автоматизированного тестирования функциональности. Косвенно тестировалась работа с базой, которая не тестируется при модульном тестировании. Все медленные операции(дисковые, взаимодействие с базой данной), а так же ненадежные операции(обрыв сети) заменяются специальной прослойкой и  mock-объектами.

Заканчиваю отступление и перехожу к теме. Сейчас развлекаюсь с MBaaS(mobile backend as a service) решением от QuickBlox. Что бы быть уверенным, что делаю все правильно, а так же для изучения поведения, стал писать тесты.

Еще одно отступление. В соответствие с книгой «Непрерывная интеграция: улучшение качества программного обеспечения и снижение риска» вместе с модульными тестами, можно размещать любые другие автоматические тесты, и если эти тесты довольно долго выполняются, то следует их выполнять по расписанию.

При использования Qt+GTest иногда требуется использовать свой код запуска тестов, т.к. внутри Qt используются то ли синглетоны, то ли статические переменные, которые должны быть инициализированы.

#include <QtCore/QCoreApplication>

#include "gtest/gtest.h"

int main(int argc, char** argv)
{
	QCoreApplication app(argc, argv);
	::testing::InitGoogleTest(&argc, argv);
	 return RUN_ALL_TESTS();
}

Дальше используется привычное сочетание с QEventLoop(для него и нужен был инстанс QXXXApplication)
Пример запуска сессии:

#include "Auth.h"
#include "QBloxGlobal.h"

#include <QtCore/QCoreApplication>
#include <QtCore/QEventLoop>

#include "gtest/gtest.h"

using namespace QBlox;

TEST(Auth, startSession)
{
	Auth auth(QBLOX_API_SERVER, QBLOX_AUTH_KEY, QBLOX_AUT_SECRET, QBLOX_APP_ID);

	auth.startSession();

	QEventLoop loop;
	QObject::connect(&auth, &Auth::sessionStarted,
			&loop, &QEventLoop::quit);
	loop.exec();
	const auto token = auth.token();

	ASSERT_FALSE(token.isEmpty());
}