From 5b8da02296b9c4fa56e7b2af13d5d74be86a70ce Mon Sep 17 00:00:00 2001 From: Nicola Corti Date: Fri, 24 Sep 2021 08:17:37 -0700 Subject: [PATCH] Fix GenerateCodegenArtifactsTask calling two generators with Java enabled Summary: This diff fixes a bug with `GenerateCodegenArtifactsTask` that was causing two generators to be called one after the other (first the JS and then the Java one). Now they're mutually exclusive. Changelog: [Internal] [Changed] - Fix GenerateCodegenArtifactsTask calling two generators with Java enabled Reviewed By: ShikaSD Differential Revision: D31169379 fbshipit-source-id: 668d8e440ad6b3f06654f29c5cbc344ef82c4b9c --- .../codegen/generator/JavaGenerator.java | 2 +- .../com/facebook/react/ReactAppPlugin.kt | 1 - .../tasks/GenerateCodegenArtifactsTask.kt | 25 ++-- .../tasks/GenerateCodegenArtifactsTaskTest.kt | 111 ++++++++++++++++++ 4 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt diff --git a/packages/react-native-gradle-plugin/src/main/java/com/facebook/react/codegen/generator/JavaGenerator.java b/packages/react-native-gradle-plugin/src/main/java/com/facebook/react/codegen/generator/JavaGenerator.java index c0abf23bbb7..feed3fc21e0 100644 --- a/packages/react-native-gradle-plugin/src/main/java/com/facebook/react/codegen/generator/JavaGenerator.java +++ b/packages/react-native-gradle-plugin/src/main/java/com/facebook/react/codegen/generator/JavaGenerator.java @@ -30,7 +30,7 @@ import java.util.stream.Collectors; * generator is isolated to a single schema, and a single Java package output. */ public final class JavaGenerator { - public static String LICENSE_HEADER = + public static final String LICENSE_HEADER = "/*\n" + " * Copyright (c) Facebook, Inc. and its affiliates.\n" + " *\n" diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactAppPlugin.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactAppPlugin.kt index 9d39851f684..1a17fbf2c74 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactAppPlugin.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactAppPlugin.kt @@ -76,7 +76,6 @@ class ReactAppPlugin : Plugin { "generateCodegenArtifactsFromSchema", GenerateCodegenArtifactsTask::class.java) { it.dependsOn(generateCodegenSchemaTask) it.reactRoot.set(extension.reactRoot) - it.jsRootDir.set(extension.jsRootDir) it.nodeExecutableAndArgs.set(extension.nodeExecutableAndArgs) it.codegenDir.set(extension.codegenDir) it.useJavaGenerator.set(extension.useJavaGenerator) diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt index 971b3ee887a..d6890c310ed 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTask.kt @@ -22,8 +22,6 @@ abstract class GenerateCodegenArtifactsTask : Exec() { @get:Internal abstract val reactRoot: DirectoryProperty - @get:Internal abstract val jsRootDir: DirectoryProperty - @get:Internal abstract val codegenDir: DirectoryProperty @get:Internal abstract val generatedSrcDir: DirectoryProperty @@ -48,17 +46,11 @@ abstract class GenerateCodegenArtifactsTask : Exec() { @get:OutputDirectory val generatedJniFiles: Provider = generatedSrcDir.dir("jni") override fun exec() { - commandLine( - windowsAwareYarn( - *nodeExecutableAndArgs.get().toTypedArray(), - reactRoot.file("scripts/generate-specs-cli.js").get().asFile.absolutePath, - "android", - generatedSchemaFile.get().asFile.absolutePath, - generatedSrcDir.get().asFile.absolutePath, - libraryName.get(), - codegenJavaPackageName.get())) + setupCommandLine() super.exec() + } + internal fun setupCommandLine() { if (useJavaGenerator.getOrElse(false)) { // Use Java-based generator implementation to produce the source files, // instead of using the JS-based generator. @@ -71,6 +63,17 @@ abstract class GenerateCodegenArtifactsTask : Exec() { } catch (e: Exception) { throw GradleException("Failed to generate Java from schema.", e) } + commandLine("echo", "Used JavaGenerator to generate files instead of generate-specs-cli.js") + } else { + commandLine( + windowsAwareYarn( + *nodeExecutableAndArgs.get().toTypedArray(), + reactRoot.file("scripts/generate-specs-cli.js").get().asFile.absolutePath, + "android", + generatedSchemaFile.get().asFile.absolutePath, + generatedSrcDir.get().asFile.absolutePath, + libraryName.get(), + codegenJavaPackageName.get())) } } } diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt new file mode 100644 index 00000000000..b07244f49e8 --- /dev/null +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenArtifactsTaskTest.kt @@ -0,0 +1,111 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.tasks + +import com.facebook.react.tests.OS +import com.facebook.react.tests.OsRule +import com.facebook.react.tests.WithOs +import com.facebook.react.tests.createTestTask +import java.io.File +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class GenerateCodegenArtifactsTaskTest { + + @get:Rule val tempFolder = TemporaryFolder() + + @get:Rule val osRule = OsRule() + + @Test + fun generateCodegenSchema_inputFiles_areSetCorrectly() { + val codegenDir = tempFolder.newFolder("codegen") + val outputDir = tempFolder.newFolder("output") + + val task = + createTestTask { + it.codegenDir.set(codegenDir) + it.generatedSrcDir.set(outputDir) + } + + assertEquals( + File(codegenDir, "lib/cli/combine/combine-js-to-schema-cli.js"), + task.combineJsToSchemaCli.get().asFile) + assertEquals(File(outputDir, "schema.json"), task.generatedSchemaFile.get().asFile) + } + + @Test + fun generateCodegenSchema_outputFile_isSetCorrectly() { + val codegenDir = tempFolder.newFolder("codegen") + val outputDir = tempFolder.newFolder("output") + + val task = + createTestTask { + it.codegenDir.set(codegenDir) + it.generatedSrcDir.set(outputDir) + } + + assertEquals(File(outputDir, "java"), task.generatedJavaFiles.get().asFile) + assertEquals(File(outputDir, "jni"), task.generatedJniFiles.get().asFile) + } + + @Test + fun generateCodegenSchema_simpleProperties_areInsideInput() { + val task = + createTestTask { + it.nodeExecutableAndArgs.set(listOf("npm", "help")) + it.useJavaGenerator.set(true) + it.codegenJavaPackageName.set("com.example.test") + it.libraryName.set("example-test") + } + + assertEquals(listOf("npm", "help"), task.nodeExecutableAndArgs.get()) + assertEquals(true, task.useJavaGenerator.get()) + assertEquals("com.example.test", task.codegenJavaPackageName.get()) + assertEquals("example-test", task.libraryName.get()) + assertTrue(task.inputs.properties.containsKey("nodeExecutableAndArgs")) + assertTrue(task.inputs.properties.containsKey("useJavaGenerator")) + assertTrue(task.inputs.properties.containsKey("codegenJavaPackageName")) + assertTrue(task.inputs.properties.containsKey("libraryName")) + } + + @Test + @WithOs(OS.UNIX) + fun setupCommandLine_withoutJavaGenerator_willSetupCorrectly() { + val reactRoot = tempFolder.newFolder("node_modules/react-native/") + val codegenDir = tempFolder.newFolder("codegen") + val outputDir = tempFolder.newFolder("output") + + val task = + createTestTask { + it.reactRoot.set(reactRoot) + it.codegenDir.set(codegenDir) + it.generatedSrcDir.set(outputDir) + it.nodeExecutableAndArgs.set(listOf("--verbose")) + it.codegenJavaPackageName.set("com.example.test") + it.libraryName.set("example-test") + } + + task.setupCommandLine() + + assertEquals( + listOf( + "yarn", + "--verbose", + File(reactRoot, "scripts/generate-specs-cli.js").toString(), + "android", + File(outputDir, "schema.json").toString(), + outputDir.toString(), + "example-test", + "com.example.test", + ), + task.commandLine.toMutableList()) + } +}