diff --git a/trunk/.gitignore b/trunk/.gitignore index ead136276..d715241e8 100644 --- a/trunk/.gitignore +++ b/trunk/.gitignore @@ -35,4 +35,5 @@ .DS_Store srs *.dSYM/ +*.gcov diff --git a/trunk/src/utest/srs_utest.hpp b/trunk/src/utest/srs_utest.hpp index 711fb1af6..26691c743 100644 --- a/trunk/src/utest/srs_utest.hpp +++ b/trunk/src/utest/srs_utest.hpp @@ -36,6 +36,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // we add an empty macro for upp to show the smart tips. #define VOID +// Public all private and protected members. +#define private public +#define protected public + // the asserts of gtest: // * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual // * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2 diff --git a/trunk/src/utest/srs_utest_kernel.cpp b/trunk/src/utest/srs_utest_kernel.cpp index bdb6e64ed..8db7053a7 100644 --- a/trunk/src/utest/srs_utest_kernel.cpp +++ b/trunk/src/utest/srs_utest_kernel.cpp @@ -30,17 +30,21 @@ using namespace std; #include #include #include +#include #define MAX_MOCK_DATA_SIZE 1024 * 1024 MockSrsFileWriter::MockSrsFileWriter() { data = new char[MAX_MOCK_DATA_SIZE]; - offset = -1; + offset = 0; + err = srs_success; + error_offset = 0; } MockSrsFileWriter::~MockSrsFileWriter() { + srs_freep(err); srs_freep(data); } @@ -48,6 +52,10 @@ srs_error_t MockSrsFileWriter::open(string /*file*/) { offset = 0; + if (err != srs_success) { + return srs_error_copy(err); + } + return srs_success; } @@ -68,6 +76,10 @@ int64_t MockSrsFileWriter::tellg() srs_error_t MockSrsFileWriter::write(void* buf, size_t count, ssize_t* pnwrite) { + if (err != srs_success) { + return srs_error_copy(err); + } + int size = srs_min(MAX_MOCK_DATA_SIZE - offset, (int)count); memcpy(data + offset, buf, size); @@ -78,6 +90,10 @@ srs_error_t MockSrsFileWriter::write(void* buf, size_t count, ssize_t* pnwrite) offset += size; + if (error_offset > 0 && offset >= error_offset) { + return srs_error_new(-1, "exceed offset"); + } + return srs_success; } @@ -2165,7 +2181,7 @@ VOID TEST(KernelUtility, RTMPUtils2) } } -VOID TEST(KernelError, CoverAll) +VOID TEST(KernelErrorTest, CoverAll) { if (true) { EXPECT_TRUE(srs_is_system_control_error(ERROR_CONTROL_RTMP_CLOSE)); @@ -2215,3 +2231,106 @@ VOID TEST(KernelError, CoverAll) } } +VOID TEST(KernelAACTest, TransmaxRTMP2AAC) +{ + if (true) { + SrsAacTransmuxer m; + MockSrsFileWriter f; + EXPECT_TRUE(srs_success == m.initialize(&f)); + + srs_error_t err = m.write_audio(0, (char*)"", 0); + EXPECT_TRUE(ERROR_AAC_DECODE_ERROR == srs_error_code(err)); + srs_freep(err); + + err = m.write_audio(0, (char*)"\x0f", 1); + EXPECT_TRUE(ERROR_AAC_DECODE_ERROR == srs_error_code(err)); + srs_freep(err); + + err = m.write_audio(0, (char*)"\xaf", 1); + EXPECT_TRUE(ERROR_AAC_DECODE_ERROR == srs_error_code(err)); + srs_freep(err); + } + + if (true) { + SrsAacTransmuxer m; + MockSrsFileWriter f; + EXPECT_TRUE(srs_success == m.initialize(&f)); + + srs_error_t err = m.write_audio(0, (char*)"\xaf\x01\x00", 3); + EXPECT_TRUE(ERROR_AAC_DECODE_ERROR == srs_error_code(err)); + srs_freep(err); + + EXPECT_TRUE(!m.got_sequence_header); + } + + if (true) { + SrsAacTransmuxer m; + MockSrsFileWriter f; + EXPECT_TRUE(srs_success == m.initialize(&f)); + + srs_error_t err = m.write_audio(0, (char*)"\xaf\x00", 2); + EXPECT_TRUE(ERROR_AAC_DECODE_ERROR == srs_error_code(err)); + srs_freep(err); + + err = m.write_audio(0, (char*)"\xaf\x00\x12\x10", 4); + EXPECT_TRUE(srs_success == err); + srs_freep(err); + + EXPECT_TRUE(m.got_sequence_header); + EXPECT_EQ(44100, srs_aac_srates[m.aac_sample_rate]); + EXPECT_EQ(2, m.aac_channels); + + err = m.write_audio(0, (char*)"\xaf\x01\x00", 3); + EXPECT_TRUE(srs_success == err); + srs_freep(err); + } + + if (true) { + SrsAacTransmuxer m; + MockSrsFileWriter f; + EXPECT_TRUE(srs_success == m.initialize(&f)); + + srs_error_t err = m.write_audio(0, (char*)"\xaf\x00", 2); + EXPECT_TRUE(ERROR_AAC_DECODE_ERROR == srs_error_code(err)); + srs_freep(err); + + err = m.write_audio(0, (char*)"\xaf\x00\x12\x10", 4); + EXPECT_TRUE(srs_success == err); + srs_freep(err); + + EXPECT_TRUE(m.got_sequence_header); + EXPECT_EQ(44100, srs_aac_srates[m.aac_sample_rate]); + EXPECT_EQ(2, m.aac_channels); + + f.error_offset = 7; + + err = m.write_audio(0, (char*)"\xaf\x01\x00", 3); + EXPECT_TRUE(srs_success != err); + srs_freep(err); + } + + if (true) { + SrsAacTransmuxer m; + MockSrsFileWriter f; + EXPECT_TRUE(srs_success == m.initialize(&f)); + + srs_error_t err = m.write_audio(0, (char*)"\xaf\x00", 2); + EXPECT_TRUE(ERROR_AAC_DECODE_ERROR == srs_error_code(err)); + srs_freep(err); + + err = m.write_audio(0, (char*)"\xaf\x00\x12\x10", 4); + EXPECT_TRUE(srs_success == err); + srs_freep(err); + + EXPECT_TRUE(m.got_sequence_header); + EXPECT_EQ(44100, srs_aac_srates[m.aac_sample_rate]); + EXPECT_EQ(2, m.aac_channels); + + f.error_offset = 8; + + err = m.write_audio(0, (char*)"\xaf\x01\x00", 3); + EXPECT_TRUE(srs_success != err); + srs_freep(err); + } +} + diff --git a/trunk/src/utest/srs_utest_kernel.hpp b/trunk/src/utest/srs_utest_kernel.hpp index d931fb88d..6385384f9 100644 --- a/trunk/src/utest/srs_utest_kernel.hpp +++ b/trunk/src/utest/srs_utest_kernel.hpp @@ -50,6 +50,8 @@ class MockSrsFileWriter : public SrsFileWriter public: char* data; int offset; + srs_error_t err; + int error_offset; public: MockSrsFileWriter(); virtual ~MockSrsFileWriter();