xref: /aosp_15_r20/build/soong/java/genrule_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"reflect"
19*333d2b36SAndroid Build Coastguard Worker	"strings"
20*333d2b36SAndroid Build Coastguard Worker	"testing"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
23*333d2b36SAndroid Build Coastguard Worker)
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Workerfunc testGenruleContext(config android.Config) *android.TestContext {
26*333d2b36SAndroid Build Coastguard Worker	ctx := android.NewTestArchContext(config)
27*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("java_genrule", GenRuleFactory)
28*333d2b36SAndroid Build Coastguard Worker	ctx.Register()
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker	return ctx
31*333d2b36SAndroid Build Coastguard Worker}
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Workerfunc TestGenruleCmd(t *testing.T) {
34*333d2b36SAndroid Build Coastguard Worker	fs := map[string][]byte{
35*333d2b36SAndroid Build Coastguard Worker		"tool": nil,
36*333d2b36SAndroid Build Coastguard Worker		"foo":  nil,
37*333d2b36SAndroid Build Coastguard Worker	}
38*333d2b36SAndroid Build Coastguard Worker	bp := `
39*333d2b36SAndroid Build Coastguard Worker				java_genrule {
40*333d2b36SAndroid Build Coastguard Worker					name: "gen",
41*333d2b36SAndroid Build Coastguard Worker					tool_files: ["tool"],
42*333d2b36SAndroid Build Coastguard Worker					cmd: "$(location tool) $(in) $(out)",
43*333d2b36SAndroid Build Coastguard Worker					srcs: ["foo"],
44*333d2b36SAndroid Build Coastguard Worker					out: ["out"],
45*333d2b36SAndroid Build Coastguard Worker				}
46*333d2b36SAndroid Build Coastguard Worker			`
47*333d2b36SAndroid Build Coastguard Worker	config := android.TestArchConfig(t.TempDir(), nil, bp, fs)
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Worker	ctx := testGenruleContext(config)
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker	_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
52*333d2b36SAndroid Build Coastguard Worker	if errs == nil {
53*333d2b36SAndroid Build Coastguard Worker		_, errs = ctx.PrepareBuildActions(config)
54*333d2b36SAndroid Build Coastguard Worker	}
55*333d2b36SAndroid Build Coastguard Worker	if errs != nil {
56*333d2b36SAndroid Build Coastguard Worker		t.Fatal(errs)
57*333d2b36SAndroid Build Coastguard Worker	}
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Worker	gen := ctx.ModuleForTests("gen", "android_common").Output("out")
60*333d2b36SAndroid Build Coastguard Worker	expected := []string{"foo"}
61*333d2b36SAndroid Build Coastguard Worker	if !reflect.DeepEqual(expected, gen.Implicits.Strings()[:len(expected)]) {
62*333d2b36SAndroid Build Coastguard Worker		t.Errorf(`want arm inputs %v, got %v`, expected, gen.Implicits.Strings())
63*333d2b36SAndroid Build Coastguard Worker	}
64*333d2b36SAndroid Build Coastguard Worker}
65*333d2b36SAndroid Build Coastguard Worker
66*333d2b36SAndroid Build Coastguard Workerfunc TestJarGenrules(t *testing.T) {
67*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testJava(t, `
68*333d2b36SAndroid Build Coastguard Worker		java_library {
69*333d2b36SAndroid Build Coastguard Worker			name: "foo",
70*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
71*333d2b36SAndroid Build Coastguard Worker		}
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker		java_genrule {
74*333d2b36SAndroid Build Coastguard Worker			name: "jargen",
75*333d2b36SAndroid Build Coastguard Worker			tool_files: ["b.java"],
76*333d2b36SAndroid Build Coastguard Worker			cmd: "$(location b.java) $(in) $(out)",
77*333d2b36SAndroid Build Coastguard Worker			out: ["jargen.jar"],
78*333d2b36SAndroid Build Coastguard Worker			srcs: [":foo"],
79*333d2b36SAndroid Build Coastguard Worker		}
80*333d2b36SAndroid Build Coastguard Worker
81*333d2b36SAndroid Build Coastguard Worker		java_library {
82*333d2b36SAndroid Build Coastguard Worker			name: "bar",
83*333d2b36SAndroid Build Coastguard Worker			static_libs: ["jargen"],
84*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
85*333d2b36SAndroid Build Coastguard Worker		}
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker		java_library {
88*333d2b36SAndroid Build Coastguard Worker			name: "baz",
89*333d2b36SAndroid Build Coastguard Worker			libs: ["jargen"],
90*333d2b36SAndroid Build Coastguard Worker			srcs: ["c.java"],
91*333d2b36SAndroid Build Coastguard Worker		}
92*333d2b36SAndroid Build Coastguard Worker	`)
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker	foo := ctx.ModuleForTests("foo", "android_common").Output("javac/foo.jar")
95*333d2b36SAndroid Build Coastguard Worker	jargen := ctx.ModuleForTests("jargen", "android_common").Output("jargen.jar")
96*333d2b36SAndroid Build Coastguard Worker	bar := ctx.ModuleForTests("bar", "android_common").Output("javac/bar.jar")
97*333d2b36SAndroid Build Coastguard Worker	baz := ctx.ModuleForTests("baz", "android_common").Output("javac/baz.jar")
98*333d2b36SAndroid Build Coastguard Worker	barCombined := ctx.ModuleForTests("bar", "android_common").Output("combined/bar.jar")
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker	if g, w := jargen.Implicits.Strings(), foo.Output.String(); !android.InList(w, g) {
101*333d2b36SAndroid Build Coastguard Worker		t.Errorf("expected jargen inputs [%q], got %q", w, g)
102*333d2b36SAndroid Build Coastguard Worker	}
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(bar.Args["classpath"], jargen.Output.String()) {
105*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bar classpath %v does not contain %q", bar.Args["classpath"], jargen.Output.String())
106*333d2b36SAndroid Build Coastguard Worker	}
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(baz.Args["classpath"], jargen.Output.String()) {
109*333d2b36SAndroid Build Coastguard Worker		t.Errorf("baz classpath %v does not contain %q", baz.Args["classpath"], jargen.Output.String())
110*333d2b36SAndroid Build Coastguard Worker	}
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Worker	if len(barCombined.Inputs) != 2 ||
113*333d2b36SAndroid Build Coastguard Worker		barCombined.Inputs[0].String() != bar.Output.String() ||
114*333d2b36SAndroid Build Coastguard Worker		barCombined.Inputs[1].String() != jargen.Output.String() {
115*333d2b36SAndroid Build Coastguard Worker		t.Errorf("bar combined jar inputs %v is not [%q, %q]",
116*333d2b36SAndroid Build Coastguard Worker			barCombined.Inputs.Strings(), bar.Output.String(), jargen.Output.String())
117*333d2b36SAndroid Build Coastguard Worker	}
118*333d2b36SAndroid Build Coastguard Worker}
119