Back to Repositories

Validating AppGlideModule Annotation Processing in Glide Library

This test suite validates the functionality of AppGlideModule with library package integration in the Glide image loading library. It focuses on testing the annotation processor’s ability to generate correct Glide-specific classes when using the @Excludes annotation with modules in subpackages.

Test Coverage Overview

The test suite provides comprehensive coverage of Glide’s annotation processing system, specifically for AppGlideModule implementations. Key areas tested include:

  • Generation of GlideOptions, GlideRequest, and GlideRequests classes
  • Proper implementation of GeneratedAppGlideModuleImpl
  • Validation of RequestManagerFactory generation
  • Integration with library modules in subpackages

Implementation Analysis

The testing approach utilizes JUnit4 framework with custom compilation testing utilities. The implementation employs annotation-based testing patterns with @ReferencedResource annotations for resource validation. The suite leverages Google’s compile-testing framework for Java annotation processor testing.

Technical Details

Testing tools and configuration include:

  • JUnit4 test runner
  • Google’s compile-testing library
  • Custom RegenerateResourcesRule for resource management
  • GlideAnnotationProcessor for compilation testing
  • JavaFileObject utilities for resource handling

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Separation of compilation setup in @Before methods
  • Systematic verification of generated source files
  • Clear test method naming conventions
  • Resource management through custom rules
  • Modular test organization with interface implementation

bumptech/glide

annotation/compiler/test/src/test/java/com/bumptech/glide/annotation/compiler/AppGlideModuleWithLibraryInPackageTest.java

            
package com.bumptech.glide.annotation.compiler;

import static com.bumptech.glide.annotation.compiler.test.Util.appResource;
import static com.bumptech.glide.annotation.compiler.test.Util.glide;
import static com.bumptech.glide.annotation.compiler.test.Util.subpackage;
import static com.google.testing.compile.CompilationSubject.assertThat;
import static com.google.testing.compile.Compiler.javac;

import com.bumptech.glide.annotation.compiler.test.CompilationProvider;
import com.bumptech.glide.annotation.compiler.test.ReferencedResource;
import com.bumptech.glide.annotation.compiler.test.RegenerateResourcesRule;
import com.bumptech.glide.annotation.compiler.test.Util;
import com.google.testing.compile.Compilation;
import java.io.IOException;
import javax.tools.JavaFileObject;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/**
 * Tests AppGlideModules that use the @Excludes annotation with a single excluded Module class in a
 * strangely named subpackage.
 */
@RunWith(JUnit4.class)
public class AppGlideModuleWithLibraryInPackageTest implements CompilationProvider {
  @Rule
  public final RegenerateResourcesRule regenerateResourcesRule = new RegenerateResourcesRule(this);

  private Compilation compilation;

  @Before
  public void setUp() {
    compilation =
        javac()
            .withProcessors(new GlideAnnotationProcessor())
            .compile(
                forResource("AppModuleWithLibraryInPackage.java"),
                forResource("LibraryModuleInPackage.java"));
    assertThat(compilation).succeededWithoutWarnings();
  }

  @Override
  public Compilation getCompilation() {
    return compilation;
  }

  @Test
  @ReferencedResource
  public void compilation_generatesExpectedGlideOptionsClass() throws IOException {
    assertThat(compilation)
        .generatedSourceFile(subpackage("GlideOptions"))
        .hasSourceEquivalentTo(appResource("GlideOptions.java"));
  }

  @Test
  @ReferencedResource
  public void compilation_generatesExpectedGlideRequestClass() throws IOException {
    assertThat(compilation)
        .generatedSourceFile(subpackage("GlideRequest"))
        .hasSourceEquivalentTo(appResource("GlideRequest.java"));
  }

  @Test
  @ReferencedResource
  public void compilation_generatesExpectedGlideRequestsClass() throws IOException {
    assertThat(compilation)
        .generatedSourceFile(subpackage("GlideRequests"))
        .hasSourceEquivalentTo(appResource("GlideRequests.java"));
  }

  @Test
  @ReferencedResource
  public void compilationGeneratesExpectedGlideAppClass() throws IOException {
    assertThat(compilation)
        .generatedSourceFile(subpackage("GlideApp"))
        .hasSourceEquivalentTo(appResource("GlideApp.java"));
  }

  @Test
  public void compilation_generatesExpectedGeneratedAppGlideModuleImpl() throws IOException {
    assertThat(compilation)
        .generatedSourceFile(glide("GeneratedAppGlideModuleImpl"))
        .hasSourceEquivalentTo(forResource("GeneratedAppGlideModuleImpl.java"));
  }

  @Test
  @ReferencedResource
  public void compilation_generatesExpectedGeneratedRequestManagerFactory() throws IOException {
    assertThat(compilation)
        .generatedSourceFile(glide("GeneratedRequestManagerFactory"))
        .hasSourceEquivalentTo(appResource("GeneratedRequestManagerFactory.java"));
  }

  private JavaFileObject forResource(String name) {
    return Util.forResource(getClass().getSimpleName(), name);
  }
}