Expose "mnemonic" and "env" on skylark "Action" objects.

RELNOTES: Exposed "mnemonic" and "env" fields on skylark "Action" objects.
PiperOrigin-RevId: 192479783
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java
index 0adabd1..b101eec 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkActionProviderTest.java
@@ -18,12 +18,15 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
+import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.BuildView.AnalysisResult;
 import com.google.devtools.build.lib.analysis.ConfiguredAspect;
 import com.google.devtools.build.lib.analysis.util.AnalysisTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.SkylarkProvider.SkylarkKey;
+import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
+import java.util.List;
 import java.util.stream.Collectors;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -68,20 +71,36 @@
   }
 
   @Test
+  @SuppressWarnings("unchecked")
   public void aspectGetsActionProviderForSkylarkRule() throws Exception {
     scratch.file(
         "test/aspect.bzl",
         "foo = provider()",
         "def _impl(target, ctx):",
-        "   return [foo(actions = target.actions)]",
+        "   mnemonics = [a.mnemonic for a in target.actions]",
+        "   envs = [a.env for a in target.actions]",
+        "   inputs = [a.inputs.to_list() for a in target.actions]",
+        "   outputs = [a.outputs.to_list() for a in target.actions]",
+        "   argv = [a.argv for a in target.actions]",
+        "   return [foo(",
+        "       actions = target.actions,",
+        "       mnemonics = mnemonics,",
+        "       envs = envs,",
+        "       inputs = inputs,",
+        "       outputs = outputs,",
+        "       argv = argv",
+        "    )]",
         "MyAspect = aspect(implementation=_impl)");
     scratch.file(
         "test/rule.bzl",
         "def impl(ctx):",
         "  output_file0 = ctx.new_file('myfile0')",
         "  output_file1 = ctx.new_file('myfile1')",
-        "  ctx.action(outputs=[output_file0], command='fakecmd0', mnemonic='MyAction0')",
-        "  ctx.action(outputs=[output_file1], command='fakecmd1', mnemonic='MyAction1')",
+        "  executable = ctx.new_file('executable')",
+        "  ctx.actions.run(outputs=[output_file0], executable=executable,",
+        "      mnemonic='MyAction0', env={'foo':'bar', 'pet':'puppy'})",
+        "  ctx.actions.run_shell(outputs=[executable, output_file1],",
+        "      command='fakecmd', mnemonic='MyAction1', env={'pet':'bunny'})",
         "  return None",
         "my_rule = rule(impl)");
     scratch.file(
@@ -96,12 +115,41 @@
     SkylarkKey fooKey = new SkylarkKey(Label.parseAbsolute("//test:aspect.bzl"), "foo");
 
     assertThat(configuredAspect.get(fooKey).getValue("actions")).isNotNull();
-    @SuppressWarnings("unchecked")
+
     SkylarkList<ActionAnalysisMetadata> actions =
         (SkylarkList<ActionAnalysisMetadata>) configuredAspect.get(fooKey).getValue("actions");
     assertThat(actions).hasSize(2);
 
-    assertThat(actions.stream().map(action -> action.getMnemonic()).collect(Collectors.toList()))
-        .containsExactly("MyAction0", "MyAction1");
+    SkylarkList<String> mnemonics =
+        (SkylarkList<String>) configuredAspect.get(fooKey).getValue("mnemonics");
+    assertThat(mnemonics).containsExactly("MyAction0", "MyAction1");
+
+    SkylarkList<SkylarkDict<String, String>> envs =
+        (SkylarkList<SkylarkDict<String, String>>) configuredAspect.get(fooKey).getValue("envs");
+    assertThat(envs).containsExactly(
+        SkylarkDict.of(null, "foo", "bar", "pet", "puppy"),
+        SkylarkDict.of(null, "pet", "bunny"));
+
+    SkylarkList<SkylarkList<Artifact>> inputs =
+        (SkylarkList<SkylarkList<Artifact>>) configuredAspect.get(fooKey).getValue("inputs");
+    assertThat(flattenArtifactNames(inputs)).containsExactly("executable");
+
+    SkylarkList<SkylarkList<Artifact>> outputs =
+        (SkylarkList<SkylarkList<Artifact>>) configuredAspect.get(fooKey).getValue("outputs");
+    assertThat(flattenArtifactNames(outputs)).containsExactly("myfile0", "executable", "myfile1");
+
+    SkylarkList<SkylarkList<String>> argv =
+        (SkylarkList<SkylarkList<String>>) configuredAspect.get(fooKey).getValue("argv");
+    assertThat(argv.get(0)).hasSize(1);
+    assertThat(argv.get(0).get(0)).endsWith("executable");
+    assertThat(argv.get(1)).contains("fakecmd");
+  }
+
+  private static List<String> flattenArtifactNames(
+      SkylarkList<SkylarkList<Artifact>> artifactLists) {
+    return artifactLists.stream()
+        .flatMap(artifacts -> artifacts.stream())
+        .map(artifact -> artifact.getFilename())
+        .collect(Collectors.toList());
   }
 }