Back to Repositories

Validating Data URI Processing Workflow in Glide

This test suite validates the data URI handling capabilities in Glide, focusing on loading and converting different image formats (JPEG, PNG) from data URIs into Bitmaps. It ensures proper handling of base64-encoded image data and URI parsing functionality.

Test Coverage Overview

The test suite comprehensively covers data URI processing in Glide:

  • Loading JPEG and PNG images from data URI strings
  • Converting data URIs to Bitmaps
  • Handling different image format conversions
  • Base64 encoding validation
  • URI parsing verification

Implementation Analysis

The testing approach utilizes JUnit4 with AndroidJUnit4 runner for Android-specific testing. It implements concurrent testing patterns through ConcurrencyHelper and employs Glide’s builder pattern for image loading. The tests validate both string-based and Uri-based data URI handling.

Technical Details

Testing tools and configuration:

  • JUnit4 test framework
  • AndroidJUnit4 test runner
  • Glide image loading library
  • ConcurrencyHelper for async operations
  • TearDownGlide rule for cleanup
  • Base64 encoding utilities
  • ByteArrayOutputStream for image processing

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Proper test isolation using @Rule for cleanup
  • Consistent test method naming convention
  • Helper methods for repeated operations
  • Format-specific test cases
  • Null checking and assertions
  • Proper resource management

bumptech/glide

instrumentation/src/androidTest/java/com/bumptech/glide/DataUriTest.java

            
package com.bumptech.glide;

import static com.google.common.truth.Truth.assertThat;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.Base64;
import androidx.core.content.ContextCompat;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.bumptech.glide.test.ResourceIds;
import com.bumptech.glide.testutil.ConcurrencyHelper;
import com.bumptech.glide.testutil.TearDownGlide;
import com.bumptech.glide.util.Preconditions;
import java.io.ByteArrayOutputStream;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
public class DataUriTest {
  @Rule public TearDownGlide tearDownGlide = new TearDownGlide();
  private final ConcurrencyHelper concurrency = new ConcurrencyHelper();
  private final Context context = ApplicationProvider.getApplicationContext();

  @Test
  public void load_withJpegAsDataUriString_returnsBitmap() {
    Bitmap bitmap =
        concurrency.get(
            Glide.with(context).asBitmap().load(getDataUriString(CompressFormat.JPEG)).submit());
    assertThat(bitmap).isNotNull();
  }

  @Test
  public void load_withPngDataUriString_returnsBitmap() {
    Bitmap bitmap =
        concurrency.get(
            Glide.with(context).asBitmap().load(getDataUriString(CompressFormat.PNG)).submit());
    assertThat(bitmap).isNotNull();
  }

  @Test
  public void load_withJpegAsDataUri_returnsBitmap() {
    Bitmap bitmap =
        concurrency.get(
            Glide.with(context).asBitmap().load(getDataUri(CompressFormat.JPEG)).submit());
    assertThat(bitmap).isNotNull();
  }

  @Test
  public void load_withPngAsDataUri_returnsBitmap() {
    Bitmap bitmap =
        concurrency.get(
            Glide.with(context).asBitmap().load(getDataUri(CompressFormat.PNG)).submit());
    assertThat(bitmap).isNotNull();
  }

  private Uri getDataUri(CompressFormat format) {
    return Uri.parse(getDataUriString(format));
  }

  private String getDataUriString(CompressFormat format) {
    String bytes = getBase64BitmapBytes(format);
    String imageType;
    switch (format) {
      case PNG:
        imageType = "png";
        break;
      case JPEG:
        imageType = "jpeg";
        break;
      case WEBP:
        imageType = "webp";
        break;
      default:
        throw new IllegalArgumentException("Unrecognized format: " + format);
    }

    String mimeType = "image/" + imageType;
    return "data:" + mimeType + ";base64," + bytes;
  }

  @SuppressWarnings("deprecation")
  private String getBase64BitmapBytes(CompressFormat format) {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    Drawable drawable =
        Preconditions.checkNotNull(ContextCompat.getDrawable(context, ResourceIds.raw.canonical));
    Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
    bitmap.compress(format, 100, bos);
    byte[] data = bos.toByteArray();
    return Base64.encodeToString(data, /* flags= */ 0);
  }
}