From 144cb8c1566ad3c0cbb9e96bc4cdec319a983737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Rasc=C3=A3o?= Date: Sat, 27 Sep 2014 11:59:05 +0100 Subject: [PATCH] Add proto compiler gpb inttest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit exercises rebar/gpb integration The bulk of these tests are written by Luis Rascão, hence he is the author of this commit. As the committer, I have cherry-picked his two commits 4c87bcd and ebb8182, from the feature/support_gpb_protobuf branch in the git://github.com/lrascao/rebar repo, and have slightly adapted it to fit this pluggable-proto-compilers-gpb branch. Update the THANKS file --- THANKS | 3 +- inttest/proto_gpb/include/.gitignore | 4 + inttest/proto_gpb/proto_gpb_rt.erl | 110 ++++++++++++++++++++++++++ inttest/proto_gpb/rebar.config | 18 +++++ inttest/proto_gpb/src/a/b/test3.proto | 19 +++++ inttest/proto_gpb/src/a/test2.proto | 19 +++++ inttest/proto_gpb/src/c/d/test5.proto | 19 +++++ inttest/proto_gpb/src/c/test4.proto | 19 +++++ inttest/proto_gpb/src/foo.erl | 39 +++++++++ inttest/proto_gpb/src/foo_app.erl | 12 +++ inttest/proto_gpb/src/foo_sup.erl | 15 ++++ inttest/proto_gpb/src/test.proto | 19 +++++ 12 files changed, 295 insertions(+), 1 deletion(-) create mode 100644 inttest/proto_gpb/include/.gitignore create mode 100644 inttest/proto_gpb/proto_gpb_rt.erl create mode 100644 inttest/proto_gpb/rebar.config create mode 100644 inttest/proto_gpb/src/a/b/test3.proto create mode 100644 inttest/proto_gpb/src/a/test2.proto create mode 100644 inttest/proto_gpb/src/c/d/test5.proto create mode 100644 inttest/proto_gpb/src/c/test4.proto create mode 100644 inttest/proto_gpb/src/foo.erl create mode 100644 inttest/proto_gpb/src/foo_app.erl create mode 100644 inttest/proto_gpb/src/foo_sup.erl create mode 100644 inttest/proto_gpb/src/test.proto diff --git a/THANKS b/THANKS index 9b9a448..b5d19be 100644 --- a/THANKS +++ b/THANKS @@ -127,4 +127,5 @@ alisdair sullivan Alexander Verbitsky Andras Horvath Drew Varner -Roberto Aloi \ No newline at end of file +Roberto Aloi +Luis Rascao diff --git a/inttest/proto_gpb/include/.gitignore b/inttest/proto_gpb/include/.gitignore new file mode 100644 index 0000000..5e7d273 --- /dev/null +++ b/inttest/proto_gpb/include/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore diff --git a/inttest/proto_gpb/proto_gpb_rt.erl b/inttest/proto_gpb/proto_gpb_rt.erl new file mode 100644 index 0000000..aafc677 --- /dev/null +++ b/inttest/proto_gpb/proto_gpb_rt.erl @@ -0,0 +1,110 @@ +%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ts=4 sw=4 et +%% ------------------------------------------------------------------- +%% +%% rebar: Erlang Build Tools +%% +%% Copyright (c) 2014 Luis Rascão (luis.rascao@gmail.com) +%% +%% Permission is hereby granted, free of charge, to any person obtaining a copy +%% of this software and associated documentation files (the "Software"), to deal +%% in the Software without restriction, including without limitation the rights +%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%% copies of the Software, and to permit persons to whom the Software is +%% furnished to do so, subject to the following conditions: +%% +%% The above copyright notice and this permission notice shall be included in +%% all copies or substantial portions of the Software. +%% +%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +%% THE SOFTWARE. +%% ------------------------------------------------------------------- +-module(proto_gpb_rt). +-export([files/0, + run/1]). + +-include_lib("eunit/include/eunit.hrl"). + +-define(MODULES, + [foo, + foo_app, + foo_sup]). + +-define(GENERATED_MODULES, + [test_gpb, + test2_gpb, + test3_gpb, + test4_gpb, + test5_gpb]). + +files() -> + [ + {copy, "../../rebar", "rebar"}, + {copy, "rebar.config", "rebar.config"}, + {copy, "include", "include"}, + {copy, "src", "src"}, + {create, "ebin/foo.app", app(foo, ?MODULES ++ ?GENERATED_MODULES)} + ]. + +run(_Dir) -> + ?assertMatch({ok, _}, retest_sh:run("./rebar prepare-deps", [])), + ?assertMatch({ok, _}, retest_sh:run("./rebar clean", [])), + ?assertMatch({ok, _}, retest_sh:run("./rebar compile", [])), + %% Foo includes test_gpb.hrl, + %% So if it compiled, that also means gpb succeeded in + %% generating the test_gpb.hrl file, and also that it generated + %% the .hrl file was generated before foo was compiled. + ok = check_beams_generated(), + ?assertMatch({ok, _}, retest_sh:run("./rebar clean", [])), + ok = check_files_deleted(), + ok. + +check_beams_generated() -> + check(fun filelib:is_regular/1, + beam_files()). + +check_files_deleted() -> + check(fun file_does_not_exist/1, + beam_files() ++ generated_erl_files() ++ generated_hrl_files()). + +beam_files() -> + add_dir("ebin", add_ext(?MODULES, ".beam")). + +generated_erl_files() -> + add_dir("src", add_ext(?GENERATED_MODULES, ".erl")). + +generated_hrl_files() -> + add_dir("include", add_ext(?GENERATED_MODULES, ".hrl")). + +file_does_not_exist(F) -> + not filelib:is_regular(F). + +add_ext(Modules, Ext) -> + [lists:concat([Module, Ext]) || Module <- Modules]. + +add_dir(Dir, Files) -> + [filename:join(Dir, File) || File <- Files]. + +check(Check, Files) -> + lists:foreach( + fun(F) -> + ?assertMatch({true, _}, {Check(F), F}) + end, + Files). + +%% +%% Generate the contents of a simple .app file +%% +app(Name, Modules) -> + App = {application, Name, + [{description, atom_to_list(Name)}, + {vsn, "1"}, + {modules, Modules}, + {registered, []}, + {applications, [kernel, stdlib, gpb]}]}, + io_lib:format("~p.\n", [App]). diff --git a/inttest/proto_gpb/rebar.config b/inttest/proto_gpb/rebar.config new file mode 100644 index 0000000..a002245 --- /dev/null +++ b/inttest/proto_gpb/rebar.config @@ -0,0 +1,18 @@ +%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ts=4 sw=4 ft=erlang et + +{erl_opts, + [ + {i, "deps/gpb/include"}, + {platform_define, "R13|R14", 'NO_CALLBACK_ATTRIBUTE'} + ]}. + +{deps, + [ + {gpb, [], {git, "git://github.com/tomas-abrahamsson/gpb", + {branch, "master"}}} + ]}. + +{proto_compiler, gpb}. + +{gpb_opts, [{module_name_suffix, "_gpb"}]}. diff --git a/inttest/proto_gpb/src/a/b/test3.proto b/inttest/proto_gpb/src/a/b/test3.proto new file mode 100644 index 0000000..6e3372f --- /dev/null +++ b/inttest/proto_gpb/src/a/b/test3.proto @@ -0,0 +1,19 @@ +// -*- c-basic-offset: 4; indent-tabs-mode: nil -*- +// ex: ts=4 sw=4 et + +package test3; + +service test3 +{ + rpc testRpc3(RPC_INPUT3) returns (RPC_OUTPUT3); +} + +message RPC_INPUT3 +{ + optional string str = 1; +} + +message RPC_OUTPUT3 +{ + optional string str = 1; +} diff --git a/inttest/proto_gpb/src/a/test2.proto b/inttest/proto_gpb/src/a/test2.proto new file mode 100644 index 0000000..6a2d1ac --- /dev/null +++ b/inttest/proto_gpb/src/a/test2.proto @@ -0,0 +1,19 @@ +// -*- c-basic-offset: 4; indent-tabs-mode: nil -*- +// ex: ts=4 sw=4 et + +package test2; + +service test2 +{ + rpc testRpc2(RPC_INPUT2) returns (RPC_OUTPUT2); +} + +message RPC_INPUT2 +{ + optional string str = 1; +} + +message RPC_OUTPUT2 +{ + optional string str = 1; +} diff --git a/inttest/proto_gpb/src/c/d/test5.proto b/inttest/proto_gpb/src/c/d/test5.proto new file mode 100644 index 0000000..e94b3bc --- /dev/null +++ b/inttest/proto_gpb/src/c/d/test5.proto @@ -0,0 +1,19 @@ +// -*- c-basic-offset: 4; indent-tabs-mode: nil -*- +// ex: ts=4 sw=4 et + +package test5; + +service test5 +{ + rpc testRpc5(RPC_INPUT5) returns (RPC_OUTPUT5); +} + +message RPC_INPUT5 +{ + optional string str = 1; +} + +message RPC_OUTPUT5 +{ + optional string str = 1; +} diff --git a/inttest/proto_gpb/src/c/test4.proto b/inttest/proto_gpb/src/c/test4.proto new file mode 100644 index 0000000..3e1de74 --- /dev/null +++ b/inttest/proto_gpb/src/c/test4.proto @@ -0,0 +1,19 @@ +// -*- c-basic-offset: 4; indent-tabs-mode: nil -*- +// ex: ts=4 sw=4 et + +package test4; + +service test4 +{ + rpc testRpc4(RPC_INPUT4) returns (RPC_OUTPUT4); +} + +message RPC_INPUT4 +{ + optional string str = 1; +} + +message RPC_OUTPUT4 +{ + optional string str = 1; +} diff --git a/inttest/proto_gpb/src/foo.erl b/inttest/proto_gpb/src/foo.erl new file mode 100644 index 0000000..3fdee54 --- /dev/null +++ b/inttest/proto_gpb/src/foo.erl @@ -0,0 +1,39 @@ +%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ts=4 sw=4 et +-module(foo). + +-export([start_link/0, + start_link/1, + init/1, + terminate/2, + handle_info/2, + handle_call/3, + handle_cast/2, + code_change/3]). + +-behavior(gen_server). + +-include("../include/test_gpb.hrl"). +-include("../include/test2_gpb.hrl"). +-include("../include/test3_gpb.hrl"). +-include("../include/test4_gpb.hrl"). +-include("../include/test5_gpb.hrl"). + +-record(state, {node :: node()}). + +start_link() -> start_link(undefined). + +start_link(Args) -> + gen_server:start_link({local, ?MODULE}, ?MODULE, Args, []). + +init(_Args) -> {ok, #state{node=node()}}. + +terminate(_Reason, _Data) -> ok. + +handle_info(_Info, State) -> {noreply, State}. + +handle_cast(_Msg, State) -> {noreply, State}. + +handle_call(_Msg, _From, State) -> {reply, ok, State}. + +code_change(_OldVsn, State, _Extra) -> {ok, State}. diff --git a/inttest/proto_gpb/src/foo_app.erl b/inttest/proto_gpb/src/foo_app.erl new file mode 100644 index 0000000..49e6d4b --- /dev/null +++ b/inttest/proto_gpb/src/foo_app.erl @@ -0,0 +1,12 @@ +%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ts=4 sw=4 et +-module(foo_app). + +-behaviour(application). + +-export([start/2, + stop/1]). + +start(_Type, _Args) -> foo_sup:start_link(). + +stop(_State) -> ok. diff --git a/inttest/proto_gpb/src/foo_sup.erl b/inttest/proto_gpb/src/foo_sup.erl new file mode 100644 index 0000000..dbef2b8 --- /dev/null +++ b/inttest/proto_gpb/src/foo_sup.erl @@ -0,0 +1,15 @@ +%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- +%% ex: ts=4 sw=4 et +-module(foo_sup). + +-behavior(supervisor). + +-export([start_link/0, + init/1]). + +start_link() -> + supervisor:start_link({local, ?MODULE}, ?MODULE, []). + +init(_Args) -> + FooChild = {foo,{foo, start_link, []}, permanent, 5000, worker, [foo]}, + {ok,{{one_for_all,1,1}, [FooChild]}}. diff --git a/inttest/proto_gpb/src/test.proto b/inttest/proto_gpb/src/test.proto new file mode 100644 index 0000000..9b3cf59 --- /dev/null +++ b/inttest/proto_gpb/src/test.proto @@ -0,0 +1,19 @@ +// -*- c-basic-offset: 4; indent-tabs-mode: nil -*- +// ex: ts=4 sw=4 et + +package test; + +service test +{ + rpc testRpc(RPC_INPUT) returns (RPC_OUTPUT); +} + +message RPC_INPUT +{ + optional string str = 1; +} + +message RPC_OUTPUT +{ + optional string str = 1; +}