aboutsummaryrefslogtreecommitdiffstats
path: root/android/paths_test.go
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2016-05-18 15:37:25 -0700
committerColin Cross <ccross@android.com>2016-05-18 15:37:25 -0700
commit635c3b0157f38c06833e5e789d0137f99844c0b6 (patch)
tree5552faac314ada024140d6fb0a4c3a501a90f0c9 /android/paths_test.go
parentc7fd91a2660c7e0af1ccea0d662e0804998769ee (diff)
downloadbuild_soong-635c3b0157f38c06833e5e789d0137f99844c0b6.tar.gz
build_soong-635c3b0157f38c06833e5e789d0137f99844c0b6.tar.bz2
build_soong-635c3b0157f38c06833e5e789d0137f99844c0b6.zip
Rename common to android
Rename the "common" package to "android", because common is too generic. Also removes all android.Android naming stutter. Ran: gomvpkg -from 'android/soong/common' -to 'android/soong/android' gorename -from '"android/soong/android".AndroidModuleContext' -to 'ModuleContext' gorename -from '"android/soong/android".AndroidBaseContext' -to 'BaseContext' gorename -from '"android/soong/android".AndroidModuleBase' -to 'ModuleBase' gorename -from '"android/soong/android".AndroidBottomUpMutatorContext' -to 'BottomUpMutatorContext' gorename -from '"android/soong/android".AndroidTopDownMutatorContext' -to 'TopDownMutatorContext' gorename -from '"android/soong/android".AndroidModule' -to 'Module' Change-Id: I3b23590b8ce7c8a1ea1139411d84a53163288da7
Diffstat (limited to 'android/paths_test.go')
-rw-r--r--android/paths_test.go182
1 files changed, 182 insertions, 0 deletions
diff --git a/android/paths_test.go b/android/paths_test.go
new file mode 100644
index 00000000..9d69473a
--- /dev/null
+++ b/android/paths_test.go
@@ -0,0 +1,182 @@
+// Copyright 2015 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 android
+
+import (
+ "errors"
+ "fmt"
+ "reflect"
+ "strings"
+ "testing"
+)
+
+type strsTestCase struct {
+ in []string
+ out string
+ err []error
+}
+
+var commonValidatePathTestCases = []strsTestCase{
+ {
+ in: []string{""},
+ out: "",
+ },
+ {
+ in: []string{"a/b"},
+ out: "a/b",
+ },
+ {
+ in: []string{"a/b", "c"},
+ out: "a/b/c",
+ },
+ {
+ in: []string{"a/.."},
+ out: ".",
+ },
+ {
+ in: []string{"."},
+ out: ".",
+ },
+ {
+ in: []string{".."},
+ out: "",
+ err: []error{errors.New("Path is outside directory: ..")},
+ },
+ {
+ in: []string{"../a"},
+ out: "",
+ err: []error{errors.New("Path is outside directory: ../a")},
+ },
+ {
+ in: []string{"b/../../a"},
+ out: "",
+ err: []error{errors.New("Path is outside directory: ../a")},
+ },
+ {
+ in: []string{"/a"},
+ out: "",
+ err: []error{errors.New("Path is outside directory: /a")},
+ },
+ {
+ in: []string{"a", "../b"},
+ out: "",
+ err: []error{errors.New("Path is outside directory: ../b")},
+ },
+ {
+ in: []string{"a", "b/../../c"},
+ out: "",
+ err: []error{errors.New("Path is outside directory: ../c")},
+ },
+ {
+ in: []string{"a", "./.."},
+ out: "",
+ err: []error{errors.New("Path is outside directory: ..")},
+ },
+}
+
+var validateSafePathTestCases = append(commonValidatePathTestCases, []strsTestCase{
+ {
+ in: []string{"$host/../$a"},
+ out: "$a",
+ },
+}...)
+
+var validatePathTestCases = append(commonValidatePathTestCases, []strsTestCase{
+ {
+ in: []string{"$host/../$a"},
+ out: "",
+ err: []error{errors.New("Path contains invalid character($): $host/../$a")},
+ },
+ {
+ in: []string{"$host/.."},
+ out: "",
+ err: []error{errors.New("Path contains invalid character($): $host/..")},
+ },
+}...)
+
+func TestValidateSafePath(t *testing.T) {
+ for _, testCase := range validateSafePathTestCases {
+ ctx := &configErrorWrapper{}
+ out := validateSafePath(ctx, testCase.in...)
+ check(t, "validateSafePath", p(testCase.in), out, ctx.errors, testCase.out, testCase.err)
+ }
+}
+
+func TestValidatePath(t *testing.T) {
+ for _, testCase := range validatePathTestCases {
+ ctx := &configErrorWrapper{}
+ out := validatePath(ctx, testCase.in...)
+ check(t, "validatePath", p(testCase.in), out, ctx.errors, testCase.out, testCase.err)
+ }
+}
+
+func TestOptionalPath(t *testing.T) {
+ var path OptionalPath
+ checkInvalidOptionalPath(t, path)
+
+ path = OptionalPathForPath(nil)
+ checkInvalidOptionalPath(t, path)
+}
+
+func checkInvalidOptionalPath(t *testing.T, path OptionalPath) {
+ if path.Valid() {
+ t.Errorf("Uninitialized OptionalPath should not be valid")
+ }
+ if path.String() != "" {
+ t.Errorf("Uninitialized OptionalPath String() should return \"\", not %q", path.String())
+ }
+ defer func() {
+ if r := recover(); r == nil {
+ t.Errorf("Expected a panic when calling Path() on an uninitialized OptionalPath")
+ }
+ }()
+ path.Path()
+}
+
+func check(t *testing.T, testType, testString string,
+ got interface{}, err []error,
+ expected interface{}, expectedErr []error) {
+
+ printedTestCase := false
+ e := func(s string, expected, got interface{}) {
+ if !printedTestCase {
+ t.Errorf("test case %s: %s", testType, testString)
+ printedTestCase = true
+ }
+ t.Errorf("incorrect %s", s)
+ t.Errorf(" expected: %s", p(expected))
+ t.Errorf(" got: %s", p(got))
+ }
+
+ if !reflect.DeepEqual(expectedErr, err) {
+ e("errors:", expectedErr, err)
+ }
+
+ if !reflect.DeepEqual(expected, got) {
+ e("output:", expected, got)
+ }
+}
+
+func p(in interface{}) string {
+ if v, ok := in.([]interface{}); ok {
+ s := make([]string, len(v))
+ for i := range v {
+ s[i] = fmt.Sprintf("%#v", v[i])
+ }
+ return "[" + strings.Join(s, ", ") + "]"
+ } else {
+ return fmt.Sprintf("%#v", in)
+ }
+}