diff --git a/rebar b/rebar index 2ca040b..d53a235 100755 Binary files a/rebar and b/rebar differ diff --git a/rebar.config b/rebar.config index e94813b..bb37270 100644 --- a/rebar.config +++ b/rebar.config @@ -4,9 +4,6 @@ {erl_opts, [{parse_transform, lager_transform}, debug_info]}. {edoc_opts, [{dir, "./edoc"}]}. -{plugins, [riak_pb_msgcodegen]}. -{plugin_dir, "plugins"}. - {deps, [ {lager, ".*", {git, "git://github.com/basho/lager.git", {tag, "2.0.1"}}}, {protobuffs, "0.8.*", {git, "git://github.com/basho/erlang_protobuffs.git", {tag, "0.8.1p4"}}} diff --git a/src/machi.proto b/src/machi.proto index 05f8a0e..8a64769 100644 --- a/src/machi.proto +++ b/src/machi.proto @@ -35,7 +35,7 @@ option java_outer_classname = "MachiPB"; // ////////////////////////////////////////// -enum MpbGeneralStatusCode { +enum Mpb_GeneralStatusCode { OK = 0; BAD_ARG = 1; WEDGED = 2; @@ -43,7 +43,7 @@ enum MpbGeneralStatusCode { } // Must match with machi.hrl's values! -enum MpbCSumType { +enum Mpb_CSumType { CSUM_TAG_NONE = 0; CSUM_TAG_CLIENT_GEN = 1; CSUM_TAG_SERVER_GEN = 2; @@ -57,28 +57,22 @@ enum MpbCSumType { ////////////////////////////////////////// // chunk_pos() type -message MpbChunkPos { +message Mpb_ChunkPos { required uint64 offset = 1; required uint64 chunk_size = 2; required string file_name = 3; } // chunk_csum() type -message MpbChunkCSum { - required MpbCSumType type = 1; +message Mpb_ChunkCSum { + required Mpb_CSumType type = 1; required bytes csum = 2; } // epoch_id() type -message MpbEpochId { +message Mpb_EpochId { required uint32 epoch_num = 1; - required MpbChunkCSum epoch_csum = 2; -} - -// Error response - may be generated for any Req -message MpbErrorResp { - required string errmsg = 1; - required uint32 errcode = 2; + required Mpb_ChunkCSum epoch_csum = 2; } ////////////////////////////////////////// @@ -87,40 +81,48 @@ message MpbErrorResp { // ////////////////////////////////////////// +// Error response - may be generated for any Req +message Mpb_ErrorResp { + // Free-form (depends on server, which is probably a bad idea TODO) + required int32 code = 1; + required string msg = 2; + optional bytes extra = 3; +} + // ping() request & response -message MpbEchoReq { +message Mpb_EchoReq { optional string message = 1; } -message MpbEchoResp { +message Mpb_EchoResp { optional string message = 1; } // Authentication request & response -message MpbAuthReq { +message Mpb_AuthReq { required bytes user = 1; required bytes password = 2; } -message MpbAuthResp { +message Mpb_AuthResp { required uint32 code = 1; // TODO: not implemented yet } // append_chunk() request & response -message MpbAppendChunkReq { +message Mpb_AppendChunkReq { required string prefix = 1; optional bytes placement_key = 2; required bytes chunk = 3; optional uint32 chunk_extra = 4; } -message MpbAppendChunkResp { - required MpbGeneralStatusCode status = 1; - optional MpbChunkPos chunk_pos = 2; +message Mpb_AppendChunkResp { + required Mpb_GeneralStatusCode status = 1; + optional Mpb_ChunkPos chunk_pos = 2; optional MbpGeneralError = 3; } @@ -130,7 +132,7 @@ message MpbAppendChunkResp { // ////////////////////////////////////////// -message MpbRequest_v1 { +message Mpb_Request { // TODO: If we wish to support pipelined requests sometime in the // future, this is the placeholder to do it. required bytes req_id = 1; @@ -141,12 +143,12 @@ message MpbRequest_v1 { // NOTE: The erlang protobuffs compiler doesn't support 'oneof'. // But 'oneof' appears to be a very tiny memory optimization // that not all languages might care about? (Erlang doesn't) - optional MpbEchoReq echo = 10; - optional MpbAuthReq auth = 11; - optional MpbAppendChunkReq append_chunk = 12; + optional Mpb_EchoReq echo = 10; + optional Mpb_AuthReq auth = 11; + optional Mpb_AppendChunkReq append_chunk = 12; } -message MpbResponse_v1 { +message Mpb_Response { // TODO: If we wish to support pipelined requests sometime in the // future, this is the placeholder to do it. required bytes req_id = 1; @@ -157,10 +159,10 @@ message MpbResponse_v1 { // bad/unexpected happened within the server. // Clients should always check this response and, if defined, // ignroe any request-specific response at codes 10+. - optional MpbErrorResp = 2; + optional Mpb_ErrorResp generic = 2; // Specific responses. - optional MpbEchoResp echo = 10; - optional MpbAuthResp auth = 11; - optional MpbAppendChunkResp append_chunk = 12; + optional Mpb_EchoResp echo = 10; + optional Mpb_AuthResp auth = 11; + optional Mpb_AppendChunkResp append_chunk = 12; } diff --git a/test/machi_pb_test.erl b/test/machi_pb_test.erl new file mode 100644 index 0000000..41a224f --- /dev/null +++ b/test/machi_pb_test.erl @@ -0,0 +1,67 @@ +%% ------------------------------------------------------------------- +%% +%% Machi: a small village of replicated files +%% +%% Copyright (c) 2014-2015 Basho Technologies, Inc. All Rights Reserved. +%% +%% This file is provided to you under the Apache License, +%% Version 2.0 (the "License"); you may not use this file +%% except in compliance with the License. You may obtain +%% a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, +%% software distributed under the License is distributed on an +%% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +%% KIND, either express or implied. See the License for the +%% specific language governing permissions and limitations +%% under the License. +%% +%% ------------------------------------------------------------------- +-module(machi_pb_test). + +-include("machi_pb.hrl"). + +-compile(export_all). + +-ifdef(TEST). +-ifndef(PULSE). + +-include_lib("eunit/include/eunit.hrl"). + +%% We don't expect any problems with these functions: nearly all +%% code executed is compiled from the PB definition file(s) and so +%% ought to be bug-free. Errors are likely to be caused by +%% changes in the spec but without corresponding changes to +%% message types/names here. + +smoke_requests_test() -> + Echo0 = #mpb_request{req_id= <<"x">>, + echo=#mpb_echoreq{}}, + Echo0 = encdec_request(Echo0), + Echo1 = #mpb_request{req_id= <<"x">>, + echo=#mpb_echoreq{message="Yo!"}}, + Echo1 = encdec_request(Echo1), + + ok. + +smoke_responses_test() -> + R1 = #mpb_response{req_id= <<"x">>, + generic=#mpb_errorresp{code=7, + msg="foo", + extra= <<"bar">>}}, + R1 = encdec_response(R1), + + ok. + +encdec_request(M) -> + machi_pb:decode_mpb_request( + list_to_binary(machi_pb:encode_mpb_request(M))). + +encdec_response(M) -> + machi_pb:decode_mpb_response( + list_to_binary(machi_pb:encode_mpb_response(M))). + +-endif. % !PULSE +-endif. % TEST