Update CodexTest to test valid_alpha.

Add a static function to CodexTest, which consolidates decoding,
comparing to an expected SkCodec::Result, and optionally comparing to a
digest.

Test decoding non-opaque to opaque (fails) and premul to unpremul/vice
versa (succeeds).

BUG=skia:3475

Review URL: https://codereview.chromium.org/1277253003
diff --git a/tests/CodexTest.cpp b/tests/CodexTest.cpp
index f3137a8..95cd563 100644
--- a/tests/CodexTest.cpp
+++ b/tests/CodexTest.cpp
@@ -42,6 +42,26 @@
     REPORTER_ASSERT(r, digest == goodDigest);
 }
 
+/**
+ *  Test decoding an SkCodec to a particular SkImageInfo.
+ *
+ *  Calling getPixels(info) should return expectedResult, and if goodDigest is non NULL,
+ *  the resulting decode should match.
+ */
+static void test_info(skiatest::Reporter* r, SkCodec* codec, const SkImageInfo& info,
+                      SkCodec::Result expectedResult, const SkMD5::Digest* goodDigest) {
+    SkBitmap bm;
+    bm.allocPixels(info);
+    SkAutoLockPixels autoLockPixels(bm);
+
+    SkCodec::Result result = codec->getPixels(info, bm.getPixels(), bm.rowBytes());
+    REPORTER_ASSERT(r, result == expectedResult);
+
+    if (goodDigest) {
+        compare_to_good_digest(r, *goodDigest, bm);
+    }
+}
+
 SkIRect generate_random_subset(SkRandom* rand, int w, int h) {
     SkIRect rect;
     do {
@@ -86,14 +106,32 @@
     SkMD5::Digest digest;
     md5(bm, &digest);
 
-    bm.eraseColor(SK_ColorYELLOW);
-
-    result =
-        codec->getPixels(info, bm.getPixels(), bm.rowBytes(), NULL, NULL, NULL);
-
-    REPORTER_ASSERT(r, result == SkCodec::kSuccess);
     // verify that re-decoding gives the same result.
-    compare_to_good_digest(r, digest, bm);
+    test_info(r, codec, info, SkCodec::kSuccess, &digest);
+
+    {
+        // Check alpha type conversions
+        if (info.alphaType() == kOpaque_SkAlphaType) {
+            test_info(r, codec, info.makeAlphaType(kUnpremul_SkAlphaType),
+                      SkCodec::kInvalidConversion, NULL);
+            test_info(r, codec, info.makeAlphaType(kPremul_SkAlphaType),
+                      SkCodec::kInvalidConversion, NULL);
+        } else {
+            // Decoding to opaque should fail
+            test_info(r, codec, info.makeAlphaType(kOpaque_SkAlphaType),
+                      SkCodec::kInvalidConversion, NULL);
+            SkAlphaType otherAt = info.alphaType();
+            if (kPremul_SkAlphaType == otherAt) {
+                otherAt = kUnpremul_SkAlphaType;
+            } else {
+                otherAt = kPremul_SkAlphaType;
+            }
+            // The other non-opaque alpha type should always succeed, but not match.
+            test_info(r, codec, info.makeAlphaType(otherAt), SkCodec::kSuccess, NULL);
+        }
+    }
+
+    // Scanline decoding follows.
 
     stream.reset(resource(path));
     SkAutoTDelete<SkScanlineDecoder> scanlineDecoder(