diff --git a/src/core/SkFlate.cpp b/src/core/SkFlate.cpp
index a9adece..ade1658 100644
--- a/src/core/SkFlate.cpp
+++ b/src/core/SkFlate.cpp
@@ -56,7 +56,7 @@
 
     uint8_t* input = (uint8_t*)src->getMemoryBase();
     size_t inputLength = src->getLength();
-    if (input == NULL || inputLength < 0) {
+    if (input == NULL || inputLength == 0) {
         input = NULL;
         flateData.next_in = inputBuffer;
         flateData.avail_in = 0;
@@ -75,6 +75,8 @@
             flateData.next_out = outputBuffer;
             flateData.avail_out = kBufferSize;
         }
+        if (rc != Z_OK)
+            break;
         if (flateData.avail_in == 0) {
             if (input != NULL)
                 break;
@@ -88,15 +90,13 @@
             rc = deflate(&flateData, Z_NO_FLUSH);
         else
             rc = inflate(&flateData, Z_NO_FLUSH);
-        if (rc != Z_OK)
-            break;
     }
     while (rc == Z_OK) {
         if (compress)
             rc = deflate(&flateData, Z_FINISH);
         else
             rc = inflate(&flateData, Z_FINISH);
-        if (flateData.avail_out > 0) {
+        if (flateData.avail_out < kBufferSize) {
             if (!dst->write(outputBuffer, kBufferSize - flateData.avail_out))
                 return false;
             flateData.next_out = outputBuffer;
diff --git a/tests/FlateTest.cpp b/tests/FlateTest.cpp
new file mode 100644
index 0000000..b9befe0
--- /dev/null
+++ b/tests/FlateTest.cpp
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "Test.h"
+#include "SkFlate.h"
+#include "SkStream.h"
+
+// A memory stream that reports zero size with the standard call, like
+// an unseekable file stream would.
+class SkSimulatedFileStream : public SkMemoryStream {
+public:
+    virtual size_t read(void* buffer, size_t size) {
+        if (buffer == NULL && size == 0)
+            return 0;
+        if (buffer == NULL && size == kGetSizeKey)
+            size = 0;
+        return SkMemoryStream::read(buffer, size);
+    }
+
+    static const size_t kGetSizeKey = 0xDEADBEEF;
+};
+
+static void TestFlate(skiatest::Reporter* reporter, SkMemoryStream* testStream,
+                      size_t dataSize) {
+    if (testStream == NULL)
+      return;
+
+    SkMemoryStream testData(dataSize);
+    uint8_t* data = (uint8_t*)testData.getMemoryBase();
+    srand(0);  // Make data deterministic.
+    for (size_t i = 0; i < dataSize; i++)
+        data[i] = rand() & 0xFF;
+
+    testStream->setMemory(testData.getMemoryBase(), dataSize, true);
+    SkDynamicMemoryWStream compressed;
+    bool status = SkFlate::Deflate(testStream, &compressed);
+    REPORTER_ASSERT(reporter, status);
+
+    // Check that the input data wasn't changed.
+    size_t inputSize = testStream->getLength();
+    if (inputSize == 0)
+        inputSize = testStream->read(NULL, SkSimulatedFileStream::kGetSizeKey);
+    REPORTER_ASSERT(reporter, testData.getLength() == inputSize);
+    REPORTER_ASSERT(reporter, memcmp(testData.getMemoryBase(),
+                                     testStream->getMemoryBase(),
+                                     testData.getLength()) == 0);
+
+    // Assume there are two test sizes, big and small.
+    if (dataSize < 1024)
+      REPORTER_ASSERT(reporter, compressed.getOffset() < 1024);
+    else
+      REPORTER_ASSERT(reporter, compressed.getOffset() > 1024);
+
+    testStream->setMemory(compressed.getStream(), compressed.getOffset(), true);
+    SkDynamicMemoryWStream uncompressed;
+    status = SkFlate::Inflate(testStream, &uncompressed);
+    REPORTER_ASSERT(reporter, status);
+
+    // Check that the input data wasn't changed.
+    inputSize = testStream->getLength();
+    if (inputSize == 0)
+        inputSize = testStream->read(NULL, SkSimulatedFileStream::kGetSizeKey);
+    REPORTER_ASSERT(reporter, compressed.getOffset() == inputSize);
+    REPORTER_ASSERT(reporter, memcmp(testStream->getMemoryBase(),
+                                     compressed.getStream(),
+                                     compressed.getOffset()) == 0);
+
+    // Check that the uncompressed data matches the source data.
+    REPORTER_ASSERT(reporter, testData.getLength() == uncompressed.getOffset());
+    REPORTER_ASSERT(reporter, memcmp(testData.getMemoryBase(),
+                                     uncompressed.getStream(),
+                                     testData.getLength()) == 0);
+}
+
+static void TestFlateCompression(skiatest::Reporter* reporter) {
+    TestFlate(reporter, NULL, 0);
+#ifdef SK_ZLIB_INCLUDE
+    REPORTER_ASSERT(reporter, SkFlate::HaveFlate());
+
+    SkMemoryStream memStream;
+    TestFlate(reporter, &memStream, 512);
+    TestFlate(reporter, &memStream, 10240);
+
+    SkSimulatedFileStream fileStream;
+    TestFlate(reporter, &fileStream, 512);
+    TestFlate(reporter, &fileStream, 10240);
+#endif
+}
+
+#include "TestClassDef.h"
+DEFINE_TESTCLASS("Flate", FlateTestClass, TestFlateCompression)
diff --git a/tests/tests_files.mk b/tests/tests_files.mk
index 98d703e..f6f8f51 100644
--- a/tests/tests_files.mk
+++ b/tests/tests_files.mk
@@ -1,24 +1,25 @@
 SOURCE := \
-	BlitRowTest.cpp \
-	ClipperTest.cpp \
-	GeometryTest.cpp \
+    BitmapCopyTest.cpp \
+    BlitRowTest.cpp \
+    ClipCubicTest.cpp \
+    ClipperTest.cpp \
+    FlateTest.cpp \
+    GeometryTest.cpp \
     MathTest.cpp \
     MatrixTest.cpp \
     PackBitsTest.cpp \
-    Sk64Test.cpp \
-    StringTest.cpp \
-    Test.cpp \
-    UtilsTest.cpp \
     PaintTest.cpp \
     ParsePathTest.cpp \
+    PathMeasureTest.cpp \
     PathTest.cpp \
     RegionTest.cpp \
-    ClipCubicTest.cpp \
+    Sk64Test.cpp \
+    skia_test.cpp \
+    SortTest.cpp \
     SrcOverTest.cpp \
     StreamTest.cpp \
-    SortTest.cpp \
-    BitmapCopyTest.cpp \
-    PathMeasureTest.cpp \
-    TriangulationTest.cpp \
+    StringTest.cpp \
+    Test.cpp \
     TestSize.cpp \
-    skia_test.cpp
+    TriangulationTest.cpp \
+    UtilsTest.cpp
