1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Cover protocol stack RTMP. 3.0.63

This commit is contained in:
winlin 2019-11-05 10:17:06 +08:00
parent 918a2943c9
commit ce8f778fe6
3 changed files with 85 additions and 10 deletions

View file

@ -95,6 +95,7 @@ MockBufferIO::MockBufferIO()
{ {
rtm = stm = SRS_UTIME_NO_TIMEOUT; rtm = stm = SRS_UTIME_NO_TIMEOUT;
rbytes = sbytes = 0; rbytes = sbytes = 0;
in_err = out_err = srs_success;
} }
MockBufferIO::~MockBufferIO() MockBufferIO::~MockBufferIO()
@ -109,6 +110,10 @@ MockBufferIO* MockBufferIO::append(string data)
srs_error_t MockBufferIO::read_fully(void* buf, size_t size, ssize_t* nread) srs_error_t MockBufferIO::read_fully(void* buf, size_t size, ssize_t* nread)
{ {
if (in_err != srs_success) {
return srs_error_copy(in_err);
}
if (in_buffer.length() < (int)size) { if (in_buffer.length() < (int)size) {
return srs_error_new(ERROR_SOCKET_READ, "read"); return srs_error_new(ERROR_SOCKET_READ, "read");
} }
@ -124,6 +129,10 @@ srs_error_t MockBufferIO::read_fully(void* buf, size_t size, ssize_t* nread)
srs_error_t MockBufferIO::write(void* buf, size_t size, ssize_t* nwrite) srs_error_t MockBufferIO::write(void* buf, size_t size, ssize_t* nwrite)
{ {
if (out_err != srs_success) {
return srs_error_copy(out_err);
}
sbytes += size; sbytes += size;
if (nwrite) { if (nwrite) {
*nwrite = size; *nwrite = size;
@ -165,6 +174,10 @@ int64_t MockBufferIO::get_send_bytes()
srs_error_t MockBufferIO::writev(const iovec *iov, int iov_size, ssize_t* nwrite) srs_error_t MockBufferIO::writev(const iovec *iov, int iov_size, ssize_t* nwrite)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
if (out_err != srs_success) {
return srs_error_copy(out_err);
}
ssize_t total = 0; ssize_t total = 0;
for (int i = 0; i <iov_size; i++) { for (int i = 0; i <iov_size; i++) {
@ -187,6 +200,10 @@ srs_error_t MockBufferIO::writev(const iovec *iov, int iov_size, ssize_t* nwrite
srs_error_t MockBufferIO::read(void* buf, size_t size, ssize_t* nread) srs_error_t MockBufferIO::read(void* buf, size_t size, ssize_t* nread)
{ {
if (in_err != srs_success) {
return srs_error_copy(in_err);
}
if (in_buffer.length() <= 0) { if (in_buffer.length() <= 0) {
return srs_error_new(ERROR_SOCKET_READ, "read"); return srs_error_new(ERROR_SOCKET_READ, "read");
} }
@ -199,6 +216,7 @@ srs_error_t MockBufferIO::read(void* buf, size_t size, ssize_t* nread)
*nread = available; *nread = available;
} }
in_buffer.erase(available); in_buffer.erase(available);
return srs_success; return srs_success;
} }

View file

@ -79,6 +79,10 @@ public:
SrsSimpleStream in_buffer; SrsSimpleStream in_buffer;
// data buffer for socket send. // data buffer for socket send.
SrsSimpleStream out_buffer; SrsSimpleStream out_buffer;
public:
// Mock error for io.
srs_error_t in_err;
srs_error_t out_err;
public: public:
MockBufferIO(); MockBufferIO();
virtual ~MockBufferIO(); virtual ~MockBufferIO();

View file

@ -38,19 +38,37 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
using namespace std; using namespace std;
class MockErrorPacket : public SrsPacket class MockPacket : public SrsPacket
{ {
public:
int size;
public:
MockPacket() {
size = 0;
}
virtual ~MockPacket() {
}
protected: protected:
virtual int get_size() { virtual int get_size() {
return 1024; return size;
} }
}; };
class MockPayloadErrorPacket : public SrsPacket class MockPacket2 : public MockPacket
{ {
protected: public:
char* payload;
public:
MockPacket2() {
payload = NULL;
}
virtual ~MockPacket2() {
srs_freep(payload);
}
virtual srs_error_t encode(int& size, char*& payload) { virtual srs_error_t encode(int& size, char*& payload) {
size = 1024; size = this->size;
payload = this->payload;
this->payload = NULL;
return srs_success; return srs_success;
} }
}; };
@ -63,12 +81,16 @@ VOID TEST(ProtoStackTest, PacketEncode)
char* payload; char* payload;
if (true) { if (true) {
MockErrorPacket pkt; MockPacket pkt;
pkt.size = 1024;
HELPER_EXPECT_FAILED(pkt.encode(size, payload)); HELPER_EXPECT_FAILED(pkt.encode(size, payload));
} }
if (true) { if (true) {
MockErrorPacket pkt; MockPacket pkt;
pkt.size = 1024;
SrsBuffer b; SrsBuffer b;
HELPER_EXPECT_FAILED(pkt.decode(&b)); HELPER_EXPECT_FAILED(pkt.decode(&b));
} }
@ -81,7 +103,9 @@ VOID TEST(ProtoStackTest, PacketEncode)
} }
if (true) { if (true) {
MockErrorPacket pkt; MockPacket pkt;
pkt.size = 1024;
EXPECT_EQ(1024, pkt.get_size()); EXPECT_EQ(1024, pkt.get_size());
} }
} }
@ -192,7 +216,8 @@ VOID TEST(ProtoStackTest, SendPacketsError)
MockBufferIO io; MockBufferIO io;
SrsProtocol p(&io); SrsProtocol p(&io);
SrsPacket* pkt = new MockErrorPacket(); MockPacket* pkt = new MockPacket();
pkt->size = 1024;
HELPER_EXPECT_FAILED(p.send_and_free_packet(pkt, 1)); HELPER_EXPECT_FAILED(p.send_and_free_packet(pkt, 1));
} }
@ -208,11 +233,39 @@ VOID TEST(ProtoStackTest, SendPacketsError)
MockBufferIO io; MockBufferIO io;
SrsProtocol p(&io); SrsProtocol p(&io);
SrsPacket* pkt = new MockPayloadErrorPacket(); MockPacket2* pkt = new MockPacket2();
pkt->size = 1024;
HELPER_EXPECT_SUCCESS(p.send_and_free_packet(pkt, 1)); HELPER_EXPECT_SUCCESS(p.send_and_free_packet(pkt, 1));
} }
} }
VOID TEST(ProtoStackTest, SendHugePacket)
{
srs_error_t err;
if (true) {
MockBufferIO io;
SrsProtocol p(&io);
MockPacket2* pkt = new MockPacket2();
pkt->size = 1024;
pkt->payload = new char[1024];
HELPER_EXPECT_SUCCESS(p.send_and_free_packet(pkt, 1));
}
if (true) {
MockBufferIO io;
SrsProtocol p(&io);
MockPacket2* pkt = new MockPacket2();
pkt->size = 16;
pkt->payload = new char[16];
io.out_err = srs_error_new(1, "fail");
HELPER_EXPECT_FAILED(p.send_and_free_packet(pkt, 1));
}
}
VOID TEST(ProtoStackTest, SendZeroMessages) VOID TEST(ProtoStackTest, SendZeroMessages)
{ {
srs_error_t err; srs_error_t err;