void StreamDataBufferTest::test_getWritable()
{
    QByteArray data1("data1");
    {
        // Use case:
        // getWritable() called with no service data
        // Expect a valid object with no associate data.
        StreamDataBuffer buffer("test");
        buffer.setDataManager(_dataManager);
        WritableData data = buffer.getWritable(data1.size());
        CPPUNIT_ASSERT( data.isValid() );
        data.write(data1.data(),data1.size());
        CPPUNIT_ASSERT( data.isValid() );
        CPPUNIT_ASSERT_EQUAL(0, static_cast<LockableStreamData*>(data.data())->associateData().size() );
    }

    // Setup data manager with a service data buffer for remaining test cases
    ServiceDataBuffer* serveBuffer = new ServiceDataBuffer("test");
    QString service1("Service1");
    _dataManager->setServiceDataBuffer(service1,serveBuffer);
    {
        // Use case:
        // getWritable() called with service data supported, but no data
        // expect valid object with no associate data
        StreamDataBuffer b("test");
        b.setDataManager(_dataManager);
        WritableData data = b.getWritable(data1.size());
        CPPUNIT_ASSERT( data.isValid() );
        data.write(data1.data(),data1.size());
        CPPUNIT_ASSERT( data.isValid() );
        CPPUNIT_ASSERT_EQUAL(0, static_cast<LockableStreamData*>(data.data())->associateData().size() );
    }
    // inject some data into the service buffer for remaining tests
    serveBuffer->getWritable(1);
    _app->processEvents();
    {
        // Use case:
        // getWritable() called with service data supported, with data
        // expect valid object with associate data
        StreamDataBuffer b("test");
        b.setDataManager(_dataManager);
        WritableData data = b.getWritable(data1.size());
        CPPUNIT_ASSERT( data.isValid() );
        data.write(data1.data(),data1.size());
        CPPUNIT_ASSERT( data.isValid() );
        CPPUNIT_ASSERT_EQUAL(1, static_cast<LockableStreamData*>(data.data())->associateData().size() );
    }
}
void StreamDataBufferTest::test_getWritableStreams()
{
    std::cout << "#############################################" << std::endl;
    // Use case:
    // Multiple calls to getWritable() simulating filling of a stream buffer.
    // Expect: unique data pointers to be returned.
    {
        size_t dataSize = 8;
        StreamDataBuffer buffer("test");
        buffer.setDataManager(_dataManager);
        {
            WritableData dataChunk = buffer.getWritable(dataSize);
            void* dataPtr =  dataChunk.data()->data()->ptr();
            double value = 1;
            dataChunk.write(&value, 8, 0);
            std::cout << "[1] dataPtr = " << dataPtr << std::endl;
        }
        CPPUNIT_ASSERT_EQUAL(1, buffer._serveQueue.size());
        {
            WritableData dataChunk = buffer.getWritable(dataSize);
            void* dataPtr =  dataChunk.data()->data()->ptr();
            double value = 2;
            dataChunk.write(&value, 8, 0);
            std::cout << "[2] dataPtr = " << dataPtr << std::endl;
        }
        CPPUNIT_ASSERT_EQUAL(2, buffer._serveQueue.size());
        {
            WritableData dataChunk = buffer.getWritable(dataSize);
            void* dataPtr =  dataChunk.data()->data()->ptr();
            double value = 3;
            dataChunk.write(&value, 8, 0);
            std::cout << "[3] dataPtr = " << dataPtr << std::endl;
        }

        CPPUNIT_ASSERT_EQUAL(3, buffer._serveQueue.size());
        CPPUNIT_ASSERT_EQUAL(0, buffer._emptyQueue.size());
        {
            LockedData data("test");
            buffer.getNext(data);
            static_cast<LockableStreamData*>(data.object())->served() = true;
        }
        CPPUNIT_ASSERT_EQUAL(2, buffer._serveQueue.size());
        CPPUNIT_ASSERT_EQUAL(1, buffer._emptyQueue.size());
        {
            LockedData data("test");
            buffer.getNext(data);
            static_cast<LockableStreamData*>(data.object())->served() = true;
        }
        CPPUNIT_ASSERT_EQUAL(1, buffer._serveQueue.size());
        CPPUNIT_ASSERT_EQUAL(2, buffer._emptyQueue.size());

        {
            LockedData data("test");
            buffer.getNext(data);
            static_cast<LockableStreamData*>(data.object())->served() = true;
        }
        CPPUNIT_ASSERT_EQUAL(0, buffer._serveQueue.size());
        CPPUNIT_ASSERT_EQUAL(3, buffer._emptyQueue.size());
        {
            WritableData dataChunk = buffer.getWritable(dataSize);
            void* dataPtr =  dataChunk.data()->data()->ptr();
            double value = 4;
            dataChunk.write(&value, 8, 0);
            std::cout << "[4] dataPtr = " << dataPtr << std::endl;
        }
        CPPUNIT_ASSERT_EQUAL(1, buffer._serveQueue.size());
        CPPUNIT_ASSERT_EQUAL(2, buffer._emptyQueue.size());

    }
    std::cout << "#############################################" << std::endl;
}