/**
   * Tests all options, checks if their default values are correct.
   *
   * @throws Exception
   */
  public void testDefaultConfig() throws Exception {
    ZipalignMojo mojo = createMojo("zipalign-config-project0");
    final ConfigHandler cfh = new ConfigHandler(mojo);
    cfh.parseConfiguration();

    Boolean skip = Whitebox.getInternalState(mojo, "parsedSkip");
    assertTrue("zipalign 'skip' parameter should be true", skip);

    Boolean verbose = Whitebox.getInternalState(mojo, "parsedVerbose");
    assertFalse("zipalign 'verbose' parameter should be false", verbose);

    MavenProject project = Whitebox.getInternalState(mojo, "project");

    String inputApk = Whitebox.getInternalState(mojo, "parsedInputApk");
    File inputApkFile =
        new File(project.getBuild().getDirectory(), project.getBuild().getFinalName() + ".apk");
    assertEquals(
        "zipalign 'inputApk' parameter should be equal", inputApkFile.getAbsolutePath(), inputApk);

    String outputApk = Whitebox.getInternalState(mojo, "parsedOutputApk");
    File outputApkFile =
        new File(
            project.getBuild().getDirectory(), project.getBuild().getFinalName() + "-aligned.apk");
    assertEquals(
        "zipalign 'outputApk' parameter should be equal",
        outputApkFile.getAbsolutePath(),
        outputApk);
  }
  /**
   * @throws MojoExecutionException
   * @throws MojoFailureException
   */
  public void execute() throws MojoExecutionException, MojoFailureException {

    // Make an early exit if we're not supposed to generate the APK
    if (!generateApk) {
      return;
    }

    ConfigHandler cfh = new ConfigHandler(this, this.session, this.execution);

    cfh.parseConfiguration();

    generateIntermediateApk();

    // Compile resource exclusion patterns, if any
    if (excludeJarResources != null && excludeJarResources.length > 0) {
      getLog().debug("Compiling " + excludeJarResources.length + " patterns");

      excludeJarResourcesPatterns = new Pattern[excludeJarResources.length];

      for (int index = 0; index < excludeJarResources.length; ++index) {
        excludeJarResourcesPatterns[index] = Pattern.compile(excludeJarResources[index]);
      }
    }

    // Initialize apk build configuration
    File outputFile =
        new File(project.getBuild().getDirectory(), project.getBuild().getFinalName() + "." + APK);
    final boolean signWithDebugKeyStore = getAndroidSigner().isSignWithDebugKeyStore();

    if (getAndroidSigner().shouldCreateBothSignedAndUnsignedApk()) {
      getLog().info("Creating debug key signed apk file " + outputFile);
      createApkFile(outputFile, true);
      final File unsignedOutputFile =
          new File(
              project.getBuild().getDirectory(),
              project.getBuild().getFinalName() + "-unsigned." + APK);
      getLog().info("Creating additional unsigned apk file " + unsignedOutputFile);
      createApkFile(unsignedOutputFile, false);
      projectHelper.attachArtifact(
          project, unsignedOutputFile, classifier == null ? "unsigned" : classifier + "_unsigned");
    } else {
      createApkFile(outputFile, signWithDebugKeyStore);
    }

    if (classifier == null) {
      // Set the generated .apk file as the main artifact (because the pom states
      // <packaging>apk</packaging>)
      project.getArtifact().setFile(outputFile);
    } else {
      // If there is a classifier specified, attach the artifact using that
      projectHelper.attachArtifact(project, outputFile, classifier);
    }
  }
  /**
   * Tests all parameters parsing
   *
   * <p>Probably not needed since it is like testing maven itself
   *
   * @throws Exception
   */
  public void testConfigParse() throws Exception {
    ZipalignMojo mojo = createMojo("zipalign-config-project1");
    final ConfigHandler cfh = new ConfigHandler(mojo);
    cfh.parseConfiguration();

    Boolean skip = Whitebox.getInternalState(mojo, "parsedSkip");
    assertFalse("zipalign 'skip' parameter should be false", skip);

    Boolean verbose = Whitebox.getInternalState(mojo, "parsedVerbose");
    assertTrue("zipalign 'verbose' parameter should be true", verbose);

    String inputApk = Whitebox.getInternalState(mojo, "parsedInputApk");
    assertEquals("zipalign 'inputApk' parameter should be equal", "app.apk", inputApk);

    String outputApk = Whitebox.getInternalState(mojo, "parsedOutputApk");
    assertEquals("zipalign 'outputApk' parameter should be equal", "app-updated.apk", outputApk);
  }