Как тестируют в Google. Джефф Каролло. Читать онлайн. Newlib. NEWLIB.NET

Автор: Джефф Каролло
Издательство: ""Издательство ""Питер""
Серия:
Жанр произведения: Интернет
Год издания: 2012
isbn: 978-5-496-00893-8
Скачать книгу
uri в сообщение AddUrlRequest к уже имеющимся полям. Для этого вносится следующее изменение:

      message AddUrlRequest {

       required string url = 1; // The URL entered by the user.

       optional string comment = 2; // Comments made by the user.

       optional string uri = 3; // The URI entered by the user.

      }

      Но это выглядит довольно глупо – скорее всего, потребуется просто переименовать поле url в uri. Если это число и тип останутся неизменными, сохранится совместимость между старой и новой версией:

      message AddUrlRequest {

       required string uri = 1; // The URI entered by user.

       optional string comment = 2; // Comments made by the user.

      }

      Написав файл addurl.proto, разработчик переходит к созданию правила сборки proto_library, которое генерирует исходные файлы C++, определяющие сущности из addurl.proto, и компилирует их в статическую библиотеку addurl C++. С дополнительными параметрами можно сгенерировать исходный код для языков Java и Python.

      File: depot/addurl/BUILD

      proto_library(name="addurl",

       srcs=["addurl.proto"])

      Разработчик запускает систему сборки и исправляет все проблемы, обнаруженные ею в addurl.proto и в файле BUILD. Система сборки вызывает компилятор Protocol Buffers, генерирует исходные файлы addurl.pb.h и addurl.pb.cc и статическую библиотеку addurl, которую теперь можно подключить.

      Пора писать AddUrlFrontend. Для этого мы объявляем класс AddUrlFrontend в новом файле addurl_frontend.h. Этот код в основном шаблонный.

      File: depot/addurl/addurl_frontend.h

      #ifndef ADDURL_ADDURL_FRONTEND_H_

      #define ADDURL_ADDURL_FRONTEND_H_

      // Forward-declaration of dependencies.

      class AddUrlService;

      class HTTPRequest;

      class HTTPReply;

      // Frontend for  the AddUrl system.

      // Accepts HTTP requests from web clients,

      // and forwards well-formed requests to the backend.

      class AddUrlFrontend {

       public:

       // Constructor which enables injection of an

       // AddUrlService dependency.

       explicit AddUrlFrontend(AddUrlService* add_url_service);

       ~AddUrlFrontend();

       // Method invoked by our HTTP server when a request arrives

       // for  the /addurl resource.

       void HandleAddUrlFrontendRequest(const HTTPRequest* http_request,

       HTTPReply* http_reply);

       private:

       AddUrlService* add_url_service_;

       // Declare copy constructor and operator= private  to prohibit

       // unintentional copying of instances of this class.

       AddUrlFrontend(const AddUrlFrontend&);

       AddUrlFrontend& operator=(const AddUrlFrontend& rhs);

       };

      #endif // ADDURL_ADDURL_FRONTEND_H_

      Продолжая определять классы AddUrlFrontend, разработчик создает файл addurl_frontend.cc, в котором описывает класс AddUrlFrontend. Для экономии места мы опустили часть файла.

      File: depot/addurl/addurl_frontend.cc

      #include "addurl/addurl_frontend.h"

      #include "addurl/addurl.pb.h"

      #include "path/to/httpqueryparams.h"

      // Functions used by HandleAddUrlFrontendRequest() below, but

      // whose definitions are omitted for brevity.

      void ExtractHttpQueryParams(const HTTPRequest* http_request,

       HTTPQueryParams* query_params);

      void WriteHttp200Reply(HTTPReply* reply);

      void WriteHttpReplyWithErrorDetails(

       HTTPReply* http_reply, const AddUrlReply& add_url_reply);

      // AddUrlFrontend constructor that injects the AddUrlService

      // dependency.

      AddUrlFrontend::AddUrlFrontend(AddUrlService* add_url_service)

       : add_url_service_(add_url_service) {

      }

      // AddUrlFrontend destructor – there's nothing to do here.

      AddUrlFrontend::~AddUrlFrontend() {

      }

      // HandleAddUrlFrontendRequest:

      // Handles requests to /addurl by parsing the request,

      // dispatching a backend request to an AddUrlService backend,

      // and transforming the backend reply into an appropriate

      // HTTP reply.

      //

      // Args:

      // http_request – The raw HTTP request received by the server.

      // http_reply – The raw HTTP reply to send in response.

      void AddUrlFrontend::HandleAddUrlFrontendRequest(

       const HTTPRequest* http_request, HTTPReply* http_reply) {

       // Extract the query parameters from the raw HTTP request.

       HTTPQueryParams