aboutsummaryrefslogtreecommitdiffstats
path: root/androidmk
diff options
context:
space:
mode:
authorDan Willemsen <dwillemsen@google.com>2016-06-01 21:37:40 -0700
committerDan Willemsen <dwillemsen@google.com>2016-06-03 00:00:50 -0700
commit6c2ac0673d889dd8a319901812eedaf23fe786c0 (patch)
tree39eca1d7229eab1cdb83bb178fc5bcf97be38832 /androidmk
parenta1ad8d1889e81be97b98f19969ed9147094f199c (diff)
downloadbuild_soong-6c2ac0673d889dd8a319901812eedaf23fe786c0.tar.gz
build_soong-6c2ac0673d889dd8a319901812eedaf23fe786c0.tar.bz2
build_soong-6c2ac0673d889dd8a319901812eedaf23fe786c0.zip
Add tests for androidmk
Change-Id: Ic31bf68f75c8dd4d7737d9ea01f2d93637cdaca2
Diffstat (limited to 'androidmk')
-rw-r--r--androidmk/cmd/androidmk/androidmk.go24
-rw-r--r--androidmk/cmd/androidmk/test.go252
2 files changed, 268 insertions, 8 deletions
diff --git a/androidmk/cmd/androidmk/androidmk.go b/androidmk/cmd/androidmk/androidmk.go
index d50b5e14..e5407b6c 100644
--- a/androidmk/cmd/androidmk/androidmk.go
+++ b/androidmk/cmd/androidmk/androidmk.go
@@ -71,14 +71,23 @@ func main() {
return
}
- p := mkparser.NewParser(os.Args[1], bytes.NewBuffer(b))
-
- nodes, errs := p.Parse()
+ output, errs := convertFile(os.Args[1], bytes.NewBuffer(b))
if len(errs) > 0 {
for _, err := range errs {
- fmt.Println("ERROR: ", err)
+ fmt.Fprintln(os.Stderr, "ERROR: ", err)
}
- return
+ os.Exit(1)
+ }
+
+ fmt.Print(output)
+}
+
+func convertFile(filename string, buffer *bytes.Buffer) (string, []error) {
+ p := mkparser.NewParser(filename, buffer)
+
+ nodes, errs := p.Parse()
+ if len(errs) > 0 {
+ return "", errs
}
file := &bpFile{
@@ -169,11 +178,10 @@ func main() {
Comments: file.comments,
})
if err != nil {
- fmt.Println(err)
- return
+ return "", []error{err}
}
- fmt.Print(string(out))
+ return string(out), nil
}
func handleAssignment(file *bpFile, assignment *mkparser.Assignment, c *conditional) {
diff --git a/androidmk/cmd/androidmk/test.go b/androidmk/cmd/androidmk/test.go
new file mode 100644
index 00000000..23dd8c06
--- /dev/null
+++ b/androidmk/cmd/androidmk/test.go
@@ -0,0 +1,252 @@
+// Copyright 2016 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package main
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+ "strings"
+ "testing"
+
+ bpparser "github.com/google/blueprint/parser"
+)
+
+var testCases = []struct {
+ desc string
+ in string
+ expected string
+}{
+ {
+ desc: "basic cc_library_shared with comments",
+ in: `
+#
+# Copyright
+#
+
+# Module Comment
+include $(CLEAR_VARS)
+# Name Comment
+LOCAL_MODULE := test
+# Source comment
+LOCAL_SRC_FILES := a.c
+# Second source comment
+LOCAL_SRC_FILES += b.c
+include $(BUILD_SHARED_LIBRARY)`,
+ expected: `
+//
+// Copyright
+//
+
+// Module Comment
+cc_library_shared {
+ // Name Comment
+ name: "test",
+ // Source comment
+ srcs: ["a.c"] + ["b.c"], // Second source comment
+
+}`,
+ },
+ {
+ desc: "split local/global include_dirs (1)",
+ in: `
+include $(CLEAR_VARS)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)
+include $(BUILD_SHARED_LIBRARY)`,
+ expected: `
+cc_library_shared {
+ local_include_dirs: ["."],
+}`,
+ },
+ {
+ desc: "split local/global include_dirs (2)",
+ in: `
+include $(CLEAR_VARS)
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
+include $(BUILD_SHARED_LIBRARY)`,
+ expected: `
+cc_library_shared {
+ local_include_dirs: ["include"],
+}`,
+ },
+ {
+ desc: "split local/global include_dirs (3)",
+ in: `
+include $(CLEAR_VARS)
+LOCAL_C_INCLUDES := system/core/include
+include $(BUILD_SHARED_LIBRARY)`,
+ expected: `
+cc_library_shared {
+ include_dirs: ["system/core/include"],
+}`,
+ },
+ {
+ desc: "split local/global include_dirs (4)",
+ in: `
+input := testing/include
+include $(CLEAR_VARS)
+# Comment 1
+LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/include system/core/include $(input)
+# Comment 2
+LOCAL_C_INCLUDES += $(TOP)/system/core/include $(LOCAL_PATH)/test/include
+# Comment 3
+include $(BUILD_SHARED_LIBRARY)`,
+ expected: `
+input = ["testing/include"]
+cc_library_shared {
+ // Comment 1
+ include_dirs: ["system/core/include"] + // Comment 2
+ input + [TOP + "/system/core/include"],
+ local_include_dirs: ["."] + ["include"] + ["test/include"],
+ // Comment 3
+}`,
+ },
+ {
+ desc: "LOCAL_MODULE_STEM",
+ in: `
+include $(CLEAR_VARS)
+LOCAL_MODULE := libtest
+LOCAL_MODULE_STEM := $(LOCAL_MODULE).so
+include $(BUILD_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libtest2
+LOCAL_MODULE_STEM := testing.so
+include $(BUILD_SHARED_LIBRARY)
+`,
+ expected: `
+cc_library_shared {
+ name: "libtest",
+ suffix: ".so",
+}
+
+cc_library_shared {
+ name: "libtest2",
+ stem: "testing.so",
+}
+`,
+ },
+ {
+ desc: "LOCAL_MODULE_HOST_OS",
+ in: `
+include $(CLEAR_VARS)
+LOCAL_MODULE := libtest
+LOCAL_MODULE_HOST_OS := linux darwin windows
+include $(BUILD_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libtest2
+LOCAL_MODULE_HOST_OS := linux
+include $(BUILD_SHARED_LIBRARY)
+`,
+ expected: `
+cc_library_shared {
+ name: "libtest",
+ target: {
+ windows: {
+ enabled: true,
+ }
+ }
+}
+
+cc_library_shared {
+ name: "libtest2",
+ target: {
+ darwin: {
+ enabled: false,
+ }
+ }
+}
+`,
+ },
+ {
+ desc: "LOCAL_RTTI_VALUE",
+ in: `
+include $(CLEAR_VARS)
+LOCAL_MODULE := libtest
+LOCAL_RTTI_FLAG := # Empty flag
+include $(BUILD_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := libtest2
+LOCAL_RTTI_FLAG := -frtti
+include $(BUILD_SHARED_LIBRARY)
+`,
+ expected: `
+cc_library_shared {
+ name: "libtest",
+ rtti: false, // Empty flag
+}
+
+cc_library_shared {
+ name: "libtest2",
+ rtti: true,
+}
+`,
+ },
+ {
+ desc: "LOCAL_ARM_MODE",
+ in: `
+include $(CLEAR_VARS)
+LOCAL_ARM_MODE := arm
+include $(BUILD_SHARED_LIBRARY)
+`,
+ expected: `
+cc_library_shared {
+ arch: {
+ arm: {
+ instruction_set: "arm",
+ },
+ },
+}
+`,
+ },
+}
+
+func reformatBlueprint(input string) string {
+ file, errs := bpparser.Parse("<testcase>", bytes.NewBufferString(input), bpparser.NewScope(nil))
+ if len(errs) > 0 {
+ for _, err := range errs {
+ fmt.Fprintln(os.Stderr, err)
+ }
+ panic(fmt.Sprintf("%d parsing errors in testcase:\n%s", len(errs), input))
+ }
+
+ res, err := bpparser.Print(file)
+ if err != nil {
+ panic(fmt.Sprintf("Error printing testcase: %q", err))
+ }
+
+ return string(res)
+}
+
+func TestEndToEnd(t *testing.T) {
+ for i, test := range testCases {
+ expected := reformatBlueprint(test.expected)
+
+ got, errs := convertFile(fmt.Sprintf("<testcase %d>", i), bytes.NewBufferString(test.in))
+ if len(errs) > 0 {
+ t.Errorf("Unexpected errors: %q", errs)
+ continue
+ }
+
+ // TODO(dwillemsen): remove once bpfmt and androidmk agree
+ got = reformatBlueprint(got)
+
+ if got != expected {
+ t.Errorf("failed testcase '%s'\ninput:\n%s\n\nexpected:\n%s\ngot:\n%s\n", test.desc, strings.TrimSpace(test.in), expected, got)
+ }
+ }
+}