Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / platform / graphics / ImageFrameGeneratorTest.cpp
index 8754eab..0d5390c 100644 (file)
 #include "public/platform/WebThread.h"
 #include <gtest/gtest.h>
 
-namespace WebCore {
+namespace blink {
 
 namespace {
 
 // Helper methods to generate standard sizes.
 SkISize fullSize() { return SkISize::Make(100, 100); }
 
+SkImageInfo imageInfo()
+{
+    return SkImageInfo::Make(100, 100, kBGRA_8888_SkColorType, kOpaque_SkAlphaType);
+}
+
 } // namespace
 
 class ImageFrameGeneratorTest : public ::testing::Test, public MockImageDecoderClient {
 public:
     virtual void SetUp() OVERRIDE
     {
-        ImageDecodingStore::initializeOnce();
-        ImageDecodingStore::instance()->setImageCachingEnabled(true);
+        ImageDecodingStore::instance()->setCacheLimitInBytes(1024 * 1024);
         m_data = SharedBuffer::create();
-        m_generator = ImageFrameGenerator::create(fullSize(), m_data, true);
+        m_generator = ImageFrameGenerator::create(fullSize(), m_data, false);
         useMockImageDecoderFactory();
         m_decodersDestroyed = 0;
         m_frameBufferRequestCount = 0;
@@ -59,7 +63,7 @@ public:
 
     virtual void TearDown() OVERRIDE
     {
-        ImageDecodingStore::shutdown();
+        ImageDecodingStore::instance()->clear();
     }
 
     virtual void decoderBeingDestroyed() OVERRIDE
@@ -89,14 +93,6 @@ protected:
         m_generator->setImageDecoderFactory(MockImageDecoderFactory::create(this, fullSize()));
     }
 
-    PassOwnPtr<ScaledImageFragment> createCompleteImage(const SkISize& size)
-    {
-        SkBitmap bitmap;
-        bitmap.setConfig(SkBitmap::kARGB_8888_Config, size.width(), size.height());
-        bitmap.allocPixels();
-        return ScaledImageFragment::createComplete(size, 0, bitmap);
-    }
-
     void addNewData()
     {
         m_data->append("g", 1);
@@ -106,18 +102,6 @@ protected:
     void setFrameStatus(ImageFrame::Status status)  { m_status = m_nextFrameStatus = status; }
     void setNextFrameStatus(ImageFrame::Status status)  { m_nextFrameStatus = status; }
 
-    SkBitmap::Allocator* allocator() const { return m_generator->allocator(); }
-    void setAllocator(PassOwnPtr<SkBitmap::Allocator> allocator)
-    {
-        m_generator->setAllocator(allocator);
-    }
-
-    PassOwnPtr<ScaledImageFragment> decode(size_t index)
-    {
-        ImageDecoder* decoder = 0;
-        return m_generator->decode(index, &decoder);
-    }
-
     RefPtr<SharedBuffer> m_data;
     RefPtr<ImageFrameGenerator> m_generator;
     int m_decodersDestroyed;
@@ -126,41 +110,17 @@ protected:
     ImageFrame::Status m_nextFrameStatus;
 };
 
-TEST_F(ImageFrameGeneratorTest, cacheHit)
-{
-    const ScaledImageFragment* fullImage = ImageDecodingStore::instance()->insertAndLockCache(
-        m_generator.get(), createCompleteImage(fullSize()));
-    EXPECT_EQ(fullSize(), fullImage->scaledSize());
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), fullImage);
-
-    const ScaledImageFragment* tempImage = m_generator->decodeAndScale(fullSize());
-    EXPECT_EQ(fullImage, tempImage);
-    EXPECT_EQ(fullSize(), tempImage->scaledSize());
-    EXPECT_TRUE(m_generator->hasAlpha(0));
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
-    EXPECT_EQ(0, m_frameBufferRequestCount);
-}
-
-TEST_F(ImageFrameGeneratorTest, cacheMissWithIncompleteDecode)
+TEST_F(ImageFrameGeneratorTest, incompleteDecode)
 {
     setFrameStatus(ImageFrame::FramePartial);
 
-    const ScaledImageFragment* tempImage= m_generator->decodeAndScale(fullSize());
-    EXPECT_FALSE(tempImage->isComplete());
+    char buffer[100 * 100 * 4];
+    m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4);
     EXPECT_EQ(1, m_frameBufferRequestCount);
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
-    EXPECT_EQ(2, ImageDecodingStore::instance()->cacheEntries());
-    EXPECT_EQ(1, ImageDecodingStore::instance()->imageCacheEntries());
-    EXPECT_EQ(1, ImageDecodingStore::instance()->decoderCacheEntries());
 
     addNewData();
-    tempImage = m_generator->decodeAndScale(fullSize());
-    EXPECT_FALSE(tempImage->isComplete());
+    m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4);
     EXPECT_EQ(2, m_frameBufferRequestCount);
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
-    EXPECT_EQ(3, ImageDecodingStore::instance()->cacheEntries());
-    EXPECT_EQ(2, ImageDecodingStore::instance()->imageCacheEntries());
-    EXPECT_EQ(1, ImageDecodingStore::instance()->decoderCacheEntries());
     EXPECT_EQ(0, m_decodersDestroyed);
 }
 
@@ -168,164 +128,71 @@ TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesComplete)
 {
     setFrameStatus(ImageFrame::FramePartial);
 
-    const ScaledImageFragment* tempImage = m_generator->decodeAndScale(fullSize());
-    EXPECT_FALSE(tempImage->isComplete());
+    char buffer[100 * 100 * 4];
+    m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4);
     EXPECT_EQ(1, m_frameBufferRequestCount);
     EXPECT_EQ(0, m_decodersDestroyed);
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
-    EXPECT_EQ(2, ImageDecodingStore::instance()->cacheEntries());
-    EXPECT_EQ(1, ImageDecodingStore::instance()->imageCacheEntries());
-    EXPECT_EQ(1, ImageDecodingStore::instance()->decoderCacheEntries());
 
     setFrameStatus(ImageFrame::FrameComplete);
     addNewData();
 
-    tempImage = m_generator->decodeAndScale(fullSize());
-    EXPECT_TRUE(tempImage->isComplete());
+    m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4);
     EXPECT_EQ(2, m_frameBufferRequestCount);
     EXPECT_EQ(1, m_decodersDestroyed);
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
-    EXPECT_EQ(2, ImageDecodingStore::instance()->cacheEntries());
-    EXPECT_EQ(2, ImageDecodingStore::instance()->imageCacheEntries());
-    EXPECT_EQ(0, ImageDecodingStore::instance()->decoderCacheEntries());
 
-    tempImage = m_generator->decodeAndScale(fullSize());
-    EXPECT_TRUE(tempImage->isComplete());
-    EXPECT_EQ(2, m_frameBufferRequestCount);
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
+    // Decoder created again.
+    m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4);
+    EXPECT_EQ(3, m_frameBufferRequestCount);
 }
 
 static void decodeThreadMain(ImageFrameGenerator* generator)
 {
-    const ScaledImageFragment* tempImage = generator->decodeAndScale(fullSize());
-    ImageDecodingStore::instance()->unlockCache(generator, tempImage);
+    char buffer[100 * 100 * 4];
+    generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4);
 }
 
 TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded)
 {
     setFrameStatus(ImageFrame::FramePartial);
 
-    const ScaledImageFragment* tempImage = m_generator->decodeAndScale(fullSize());
-    EXPECT_FALSE(tempImage->isComplete());
+    char buffer[100 * 100 * 4];
+    m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4);
     EXPECT_EQ(1, m_frameBufferRequestCount);
     EXPECT_EQ(0, m_decodersDestroyed);
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
-    EXPECT_EQ(2, ImageDecodingStore::instance()->cacheEntries());
-    EXPECT_EQ(1, ImageDecodingStore::instance()->imageCacheEntries());
-    EXPECT_EQ(1, ImageDecodingStore::instance()->decoderCacheEntries());
 
-    // Frame can now be decoded completely.
+    // LocalFrame can now be decoded completely.
     setFrameStatus(ImageFrame::FrameComplete);
     addNewData();
-    OwnPtr<blink::WebThread> thread = adoptPtr(blink::Platform::current()->createThread("DecodeThread"));
+    OwnPtr<WebThread> thread = adoptPtr(Platform::current()->createThread("DecodeThread"));
     thread->postTask(new Task(WTF::bind(&decodeThreadMain, m_generator.get())));
     thread.clear();
-
     EXPECT_EQ(2, m_frameBufferRequestCount);
     EXPECT_EQ(1, m_decodersDestroyed);
-    EXPECT_EQ(2, ImageDecodingStore::instance()->cacheEntries());
-    EXPECT_EQ(2, ImageDecodingStore::instance()->imageCacheEntries());
-    EXPECT_EQ(0, ImageDecodingStore::instance()->decoderCacheEntries());
 
-    tempImage = m_generator->decodeAndScale(fullSize());
-    EXPECT_TRUE(tempImage->isComplete());
-    EXPECT_EQ(2, m_frameBufferRequestCount);
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
+    // Decoder created again.
+    m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4);
+    EXPECT_EQ(3, m_frameBufferRequestCount);
 }
 
-TEST_F(ImageFrameGeneratorTest, incompleteBitmapCopied)
+TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
 {
     setFrameStatus(ImageFrame::FramePartial);
 
-    const ScaledImageFragment* tempImage= m_generator->decodeAndScale(fullSize());
-    EXPECT_FALSE(tempImage->isComplete());
+    char buffer[100 * 100 * 4];
+    m_generator->decodeAndScale(imageInfo(), 1, buffer, 100 * 4);
+    EXPECT_TRUE(m_generator->hasAlpha(1));
     EXPECT_EQ(1, m_frameBufferRequestCount);
 
     ImageDecoder* tempDecoder = 0;
     EXPECT_TRUE(ImageDecodingStore::instance()->lockDecoder(m_generator.get(), fullSize(), &tempDecoder));
     ASSERT_TRUE(tempDecoder);
-    EXPECT_NE(tempDecoder->frameBufferAtIndex(0)->getSkBitmap().getPixels(), tempImage->bitmap().getPixels());
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
-    ImageDecodingStore::instance()->unlockDecoder(m_generator.get(), tempDecoder);
-}
-
-TEST_F(ImageFrameGeneratorTest, resumeDecodeEmptyFrameTurnsComplete)
-{
-    m_generator = ImageFrameGenerator::create(fullSize(), m_data, false, true);
-    useMockImageDecoderFactory();
-    setFrameStatus(ImageFrame::FrameComplete);
-
-    const ScaledImageFragment* tempImage = m_generator->decodeAndScale(fullSize(), 0);
-    EXPECT_TRUE(tempImage->isComplete());
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
-
-    setFrameStatus(ImageFrame::FrameEmpty);
-    setNextFrameStatus(ImageFrame::FrameComplete);
-    EXPECT_FALSE(m_generator->decodeAndScale(fullSize(), 1));
-}
-
-TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
-{
-    setFrameStatus(ImageFrame::FramePartial);
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), m_generator->decodeAndScale(fullSize(), 0));
-    EXPECT_TRUE(m_generator->hasAlpha(0));
-
-    ImageDecoder* tempDecoder = 0;
-    EXPECT_TRUE(ImageDecodingStore::instance()->lockDecoder(m_generator.get(), fullSize(), &tempDecoder));
-    ASSERT_TRUE(tempDecoder);
     static_cast<MockImageDecoder*>(tempDecoder)->setFrameHasAlpha(false);
     ImageDecodingStore::instance()->unlockDecoder(m_generator.get(), tempDecoder);
 
     setFrameStatus(ImageFrame::FrameComplete);
-    ImageDecodingStore::instance()->unlockCache(m_generator.get(), m_generator->decodeAndScale(fullSize(), 0));
-    EXPECT_FALSE(m_generator->hasAlpha(0));
-}
-
-namespace {
-
-class MockAllocator : public SkBitmap::Allocator {
-public:
-    // N starts from 0.
-    MockAllocator(int failAtNthCall)
-        : m_callCount(0)
-        , m_failAtNthCall(failAtNthCall)
-        , m_defaultAllocator(adoptPtr(new DiscardablePixelRefAllocator()))
-    {
-    }
-
-    virtual bool allocPixelRef(SkBitmap* bitmap, SkColorTable* colorTable) OVERRIDE
-    {
-        if (m_callCount++ == m_failAtNthCall)
-            return false;
-        return m_defaultAllocator->allocPixelRef(bitmap, colorTable);
-    }
-
-    int m_callCount;
-    int m_failAtNthCall;
-    OwnPtr<SkBitmap::Allocator> m_defaultAllocator;
-};
-
-} // namespace
-
-TEST_F(ImageFrameGeneratorTest, decodingAllocatorFailure)
-{
-    // Try to emulate allocation failures at different stages. For now, the
-    // first allocation is for the bitmap in ImageFrame, the second is for the
-    // copy of partial bitmap. The loop will still work if the number or purpose
-    // of allocations change in the future.
-    for (int i = 0; ; ++i) {
-        SCOPED_TRACE(testing::Message() << "Allocation failure at call " << i);
-        setFrameStatus(ImageFrame::FramePartial);
-        setAllocator(adoptPtr(new MockAllocator(i)));
-        OwnPtr<ScaledImageFragment> image = decode(0);
-        if (i >= static_cast<MockAllocator*>(allocator())->m_callCount) {
-            // We have tested failures of all stages. This time all allocations
-            // were successful.
-            EXPECT_TRUE(image);
-            break;
-        }
-        EXPECT_FALSE(image);
-    }
+    m_generator->decodeAndScale(imageInfo(), 1, buffer, 100 * 4);
+    EXPECT_EQ(2, m_frameBufferRequestCount);
+    EXPECT_FALSE(m_generator->hasAlpha(1));
 }
 
-} // namespace WebCore
+} // namespace blink