// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.naming;

import static org.junit.Assert.assertTrue;

import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapChecker;
import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapChecker.VerifyMappingFileHashResult;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

@RunWith(Parameterized.class)
public class MappingFileHashTest extends TestBase {

  @Parameterized.Parameters(name = "{0}")
  public static TestParametersCollection data() {
    return getTestParameters().withNoneRuntime().build();
  }

  public MappingFileHashTest(TestParameters parameters) {
    parameters.assertNoneRuntime();
  }

  @Test
  public void testUnixLineEnd() throws Exception {
    String newline = "\n";
    // Hash as given by sha256 command on the content using unix-style newlines.
    String hash = "539a6b5614c65c7473a995507163a4559cea3229d3cada164a2ca4935bbbd597";
    verifyHash(newline, hash);
  }

  @Test
  public void testWindowsLineEnd() throws Exception {
    // R8 will only use \n in mapping files, but if a file is written using dos-style newlines,
    // those newlines will be part of the content hashing. This is a regression test that the file
    // will compute the right hash in such cases.
    String newline = "\r\n";
    // Hash as given by sha256 command on the content using dos-style newlines.
    String hash = "6ef47f7b9b6d5013628073ebdadad27dd2e7e57ef911e9d6cbee0f92c434e48a";
    verifyHash(newline, hash);
  }

  private void verifyHash(String newline, String hash) throws Exception {
    // Some header info. This should never affect the hash.
    String header =
        String.join(
            newline,
            "# compiler: R8",
            "", // Empty header line.
            "# junk header info: " + System.nanoTime(),
            "# pg_map_hash: SHA-256 " + hash);
    // Actually hashed content (modulo newlines).
    String hashed =
        String.join(
            newline,
            "triviæl.Triviål -> a.œ:",
            "    void main(java.lang.String[]) -> a",
            "" // Always end with newline.
            );
    String content = String.join(newline, header, hashed);
    VerifyMappingFileHashResult result = ProguardMapChecker.validateProguardMapHash(content);
    assertTrue(result.isOk());
  }
}
