Fix publish_P and add test coverage

This commit is contained in:
Nick O'Leary 2014-02-07 20:57:12 +00:00
parent bc80d7cf77
commit c6bb3caf57
4 changed files with 54 additions and 10 deletions

View File

@ -273,10 +273,10 @@ boolean PubSubClient::publish(char* topic, uint8_t* payload, unsigned int plengt
boolean PubSubClient::publish_P(char* topic, uint8_t* PROGMEM payload, unsigned int plength, boolean retained) { boolean PubSubClient::publish_P(char* topic, uint8_t* PROGMEM payload, unsigned int plength, boolean retained) {
uint8_t llen = 0; uint8_t llen = 0;
uint8_t digit; uint8_t digit;
int rc; unsigned int rc = 0;
uint16_t tlen; uint16_t tlen;
int pos = 0; unsigned int pos = 0;
int i; unsigned int i;
uint8_t header; uint8_t header;
unsigned int len; unsigned int len;
@ -311,7 +311,8 @@ boolean PubSubClient::publish_P(char* topic, uint8_t* PROGMEM payload, unsigned
} }
lastOutActivity = millis(); lastOutActivity = millis();
return rc == len + 1 + plength;
return rc == tlen + 4 + plength;
} }
boolean PubSubClient::write(uint8_t header, uint8_t* buf, uint16_t length) { boolean PubSubClient::write(uint8_t header, uint8_t* buf, uint16_t length) {

View File

@ -15,8 +15,9 @@ extern "C"{
extern void setup( void ) ; extern void setup( void ) ;
extern void loop( void ) ; extern void loop( void ) ;
uint32_t millis( void ); uint32_t millis( void );
uint8_t pgm_read_byte_near(uint8_t*);
#define PROGMEM
} }
#define PROGMEM
#define pgm_read_byte_near(x) *(x)
#endif // Arduino_h #endif // Arduino_h

View File

@ -8,9 +8,6 @@ extern "C" {
uint32_t millis(void) { uint32_t millis(void) {
return time(0)*1000; return time(0)*1000;
} }
uint8_t pgm_read_byte_near(uint8_t*) {
return 0;
}
} }
ShimClient::ShimClient() { ShimClient::ShimClient() {
@ -57,7 +54,23 @@ int ShimClient::connect(const char *host, uint16_t port) {
} }
return this->_connected; return this->_connected;
} }
size_t ShimClient::write(uint8_t b) { std::cout << "!!not implemented!! " << b; return 1; } size_t ShimClient::write(uint8_t b) {
this->_received += 1;
TRACE(std::hex << (unsigned int)b);
if (!this->expectAnything) {
if (this->expectBuffer->available()) {
uint8_t expected = this->expectBuffer->next();
if (expected != b) {
this->_error = true;
TRACE("!=" << (unsigned int)expected);
}
} else {
this->_error = true;
}
}
TRACE("\n"<< std::dec);
return 1;
}
size_t ShimClient::write(const uint8_t *buf, size_t size) { size_t ShimClient::write(const uint8_t *buf, size_t size) {
this->_received += size; this->_received += size;
TRACE( "[" << std::dec << (unsigned int)(size) << "] "); TRACE( "[" << std::dec << (unsigned int)(size) << "] ");

View File

@ -102,12 +102,41 @@ int test_publish_not_connected() {
END_IT END_IT
} }
int test_publish_P() {
IT("publishes using PROGMEM");
ShimClient shimClient;
shimClient.setAllowConnect(true);
byte payload[] = { 0x01,0x02,0x03,0x0,0x05 };
int length = 5;
byte connack[] = { 0x20, 0x02, 0x00, 0x00 };
shimClient.respond(connack,4);
PubSubClient client(server, 1883, callback, shimClient);
int rc = client.connect((char*)"client_test1");
IS_TRUE(rc);
byte publish[] = {0x31,0xc,0x0,0x5,0x74,0x6f,0x70,0x69,0x63,0x1,0x2,0x3,0x0,0x5};
shimClient.expect(publish,14);
rc = client.publish_P((char*)"topic",payload,length,true);
IS_TRUE(rc);
IS_FALSE(shimClient.error());
END_IT
}
int main() int main()
{ {
test_publish(); test_publish();
test_publish_bytes(); test_publish_bytes();
test_publish_retained(); test_publish_retained();
test_publish_not_connected(); test_publish_not_connected();
test_publish_P();
FINISH FINISH
} }