Hide server-only functionality for client builds and vice versa.

Coverage and Test targets forcefully enable both sides to do their things.

Re #17
This commit is contained in:
Johannes Schriewer 2018-07-30 23:25:55 +02:00
parent 7123331e6d
commit 7a2f11d76b
5 changed files with 77 additions and 23 deletions

View file

@ -10,16 +10,21 @@ PLATFORM_FLAGS=
AR=ar
CC=gcc
CFLAGS=-g -Os -Wall -pthread -I./platform -I./src $(PLATFORM_FLAGS)
EXTRA_CFLAGS=
CFLAGS=-g -Os -Wall -pthread -I./platform -I./src $(EXTRA_CFLAGS) $(PLATFORM_FLAGS)
COVERAGE_FLAGS=-fprofile-arcs -ftest-coverage
DEBUG_FLAGS=-DDEBUG=1 $(COVERAGE_FLAGS)
all: $(TARGET) $(DEBUG_TARGET)
test: $(DEBUG_TARGET)
test:
$(MAKE) EXTRA_CFLAGS="-DMQTT_SERVER=1 -DMQTT_CLIENT=1" clean all
$(MAKE) -C tests
$(MAKE) clean
coverage: test
coverage:
$(MAKE) EXTRA_CFLAGS="-DMQTT_SERVER=1 -DMQTT_CLIENT=1" clean all
$(MAKE) DEBUG_FLAGS= -C tests clean all
lcov --capture --directory . --output-file lcov.info
rm -rf coverage
mkdir -p coverage
@ -45,5 +50,7 @@ clean:
rm -f $(OBJS) $(DEBUG_OBJS)
rm -f $(COVERAGE_FILES)
rm -f *.gcov
rm -f lcov.info
rm -rf docs/
rm -rf coverage/
.PHONY: coverage test

View file

@ -1,6 +1,17 @@
#ifndef mqtt_h__included
#define mqtt_h__included
// re-define to 1 to enable server functionality
#ifndef MQTT_SERVER
# define MQTT_SERVER 0
#endif
// re-rdefine to 0 to disable client functionality
#ifndef MQTT_CLIENT
# define MQTT_CLIENT 1
#endif
#include <stdint.h>
#include <stdbool.h>

View file

@ -149,6 +149,7 @@ size_t utf8_string_encode(char *string, Buffer *buffer) {
* Decoder
*/
#if MQTT_SERVER
bool decode_connect(Buffer *buffer, ConnectPayload *payload) {
// Validate this is actually a connect packet
char template[] = { 0x00, 0x04, 'M', 'Q', 'T', 'T' };
@ -186,6 +187,7 @@ bool decode_connect(Buffer *buffer, ConnectPayload *payload) {
return true;
}
#endif /* MQTT_SERVER */
bool decode_connack(Buffer *buffer, ConnAckPayload *payload) {
payload->session_present = buffer->data[buffer->position++] & 0x01;
@ -227,6 +229,7 @@ bool decode_packet_id(Buffer *buffer, PacketIDPayload *payload) {
return true;
}
#if MQTT_SERVER
bool decode_subscribe(Buffer *buffer, SubscribePayload *payload) {
payload->packet_id =
(buffer->data[buffer->position] << 8)
@ -238,6 +241,7 @@ bool decode_subscribe(Buffer *buffer, SubscribePayload *payload) {
return true;
}
#endif /* MQTT_SERVER */
bool decode_suback(Buffer *buffer, SubAckPayload *payload) {
payload->packet_id =
@ -250,6 +254,7 @@ bool decode_suback(Buffer *buffer, SubAckPayload *payload) {
return true;
}
#if MQTT_SERVER
bool decode_unsubscribe(Buffer *buffer, UnsubscribePayload *payload) {
payload->packet_id =
(buffer->data[buffer->position] << 8)
@ -260,6 +265,7 @@ bool decode_unsubscribe(Buffer *buffer, UnsubscribePayload *payload) {
return true;
}
#endif /* MQTT_SERVER */
MQTTPacket *mqtt_packet_decode(Buffer *buffer) {
@ -275,24 +281,15 @@ MQTTPacket *mqtt_packet_decode(Buffer *buffer) {
bool valid = false;
switch (type) {
case PacketTypeConnect:
valid = decode_connect(buffer, result->payload);
break;
case PacketTypeConnAck:
valid = decode_connack(buffer, result->payload);
break;
case PacketTypePublish:
valid = decode_publish(buffer, result->payload, packet_size);
break;
case PacketTypeSubscribe:
valid = decode_subscribe(buffer, result->payload);
break;
case PacketTypeSubAck:
valid = decode_suback(buffer, result->payload);
break;
case PacketTypeUnsubscribe:
valid = decode_unsubscribe(buffer, result->payload);
break;
case PacketTypePubAck:
case PacketTypePubRec:
case PacketTypePubRel:
@ -300,11 +297,29 @@ MQTTPacket *mqtt_packet_decode(Buffer *buffer) {
case PacketTypeUnsubAck:
valid = decode_packet_id(buffer, result->payload);
break;
case PacketTypePingReq:
case PacketTypePingResp:
case PacketTypeDisconnect:
valid = true; // there is no payload
break;
#if MQTT_SERVER
case PacketTypePingReq:
valid = true; // there is no payload
break;
case PacketTypeConnect:
valid = decode_connect(buffer, result->payload);
break;
case PacketTypeSubscribe:
valid = decode_subscribe(buffer, result->payload);
break;
case PacketTypeUnsubscribe:
valid = decode_unsubscribe(buffer, result->payload);
break;
#endif /* MQTT_SERVER */
default:
valid = false;
break;
}
if (!valid) {
@ -396,6 +411,7 @@ Buffer *encode_connect(ConnectPayload *payload) {
return buffer;
}
#if MQTT_SERVER
Buffer *encode_connack(ConnAckPayload *payload) {
size_t sz = 2; // session flag and status
@ -406,6 +422,7 @@ Buffer *encode_connack(ConnAckPayload *payload) {
assert(buffer_eof(buffer));
return buffer;
}
#endif /* MQTT_SERVER */
Buffer *encode_publish(PublishPayload *payload) {
size_t sz = 0;
@ -477,6 +494,7 @@ Buffer *encode_subscribe(SubscribePayload *payload) {
return buffer;
}
#if MQTT_SERVER
Buffer *encode_suback(SubAckPayload *payload) {
size_t sz = 2; // packet id
sz += 1; // Status code
@ -493,6 +511,7 @@ Buffer *encode_suback(SubAckPayload *payload) {
assert(buffer_eof(buffer));
return buffer;
}
#endif /* MQTT_SERVER */
Buffer *encode_unsubscribe(UnsubscribePayload *payload) {
size_t sz = 2; // packet id
@ -522,29 +541,35 @@ Buffer *mqtt_packet_encode(MQTTPacket *packet) {
switch (packet->packet_type) {
case PacketTypeConnect:
return encode_connect((ConnectPayload *)packet->payload);
case PacketTypeConnAck:
return encode_connack((ConnAckPayload *)packet->payload);
case PacketTypePublish:
return encode_publish((PublishPayload *)packet->payload);
case PacketTypeSubscribe:
return encode_subscribe((SubscribePayload *)packet->payload);
case PacketTypeSubAck:
return encode_suback((SubAckPayload *)packet->payload);
case PacketTypeUnsubscribe:
return encode_unsubscribe((UnsubscribePayload *)packet->payload);
case PacketTypePubAck:
case PacketTypePubRec:
case PacketTypePubRel:
case PacketTypePubComp:
case PacketTypeUnsubAck:
return encode_packet_id((PacketIDPayload *)packet->payload, packet->packet_type);
case PacketTypePingReq:
case PacketTypePingResp:
case PacketTypeDisconnect:
return encode_no_payload(packet->packet_type);
}
return NULL;
#if MQTT_SERVER
case PacketTypePingResp:
return encode_no_payload(packet->packet_type);
case PacketTypeUnsubAck:
return encode_packet_id((PacketIDPayload *)packet->payload, packet->packet_type);
case PacketTypeConnAck:
return encode_connack((ConnAckPayload *)packet->payload);
case PacketTypeSubAck:
return encode_suback((SubAckPayload *)packet->payload);
#endif /* MQTT_SERVER */
default:
return NULL;
}
}
/*

View file

@ -20,6 +20,7 @@ bool send_buffer(MQTTHandle *handle, Buffer *buffer) {
return true;
}
#if MQTT_CLIENT
bool send_connect_packet(MQTTHandle *handle) {
ConnectPayload *payload = calloc(1, sizeof(ConnectPayload));
@ -44,6 +45,7 @@ bool send_connect_packet(MQTTHandle *handle) {
encoded->position = 0;
return send_buffer(handle, encoded);
}
#endif /* MQTT_CLIENT */
void remove_pending(MQTTHandle *handle, void *context) {
SubscribePayload *payload = (SubscribePayload *)context;
@ -54,6 +56,7 @@ void remove_pending(MQTTHandle *handle, void *context) {
free(payload);
}
#if MQTT_CLIENT
bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos) {
SubscribePayload *payload = calloc(1, sizeof(SubscribePayload));
@ -69,7 +72,9 @@ bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos) {
encoded->position = 0;
return send_buffer(handle, encoded);
}
#endif /* MQTT_CLIENT */
#if MQTT_CLIENT
bool send_unsubscribe_packet(MQTTHandle *handle, char *topic) {
UnsubscribePayload *payload = calloc(1, sizeof(UnsubscribePayload));
@ -85,6 +90,7 @@ bool send_unsubscribe_packet(MQTTHandle *handle, char *topic) {
encoded->position = 0;
return send_buffer(handle, encoded);
}
#endif /* MQTT_CLIENT */
void handle_pubrec(MQTTHandle *handle, void *context) {
PublishPayload *payload = (PublishPayload *)context;
@ -132,8 +138,10 @@ bool send_publish_packet(MQTTHandle *handle, char *topic, char *message, MQTTQos
return send_buffer(handle, encoded);
}
#if MQTT_CLIENT
bool send_disconnect_packet(MQTTHandle *handle) {
Buffer *encoded = mqtt_packet_encode(&(MQTTPacket){ PacketTypeDisconnect, NULL });
encoded->position = 0;
return send_buffer(handle, encoded);
}
#endif /* MQTT_CLIENT */

View file

@ -3,10 +3,13 @@
#include "mqtt.h"
#if MQTT_CLIENT
bool send_connect_packet(MQTTHandle *handle);
bool send_subscribe_packet(MQTTHandle *handle, char *topic, MQTTQosLevel qos);
bool send_unsubscribe_packet(MQTTHandle *handle, char *topic);
bool send_publish_packet(MQTTHandle *handle, char *topic, char *message, MQTTQosLevel qos);
bool send_disconnect_packet(MQTTHandle *handle);
#endif /* MQTT_CLIENT */
bool send_publish_packet(MQTTHandle *handle, char *topic, char *message, MQTTQosLevel qos);
#endif