1// Copyright 2015 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package proptools 16 17import ( 18 "os/exec" 19 "testing" 20) 21 22type escapeTestCase struct { 23 name string 24 in string 25 out string 26} 27 28var ninjaEscapeTestCase = []escapeTestCase{ 29 { 30 name: "no escaping", 31 in: `test`, 32 out: `test`, 33 }, 34 { 35 name: "leading $", 36 in: `$test`, 37 out: `$$test`, 38 }, 39 { 40 name: "trailing $", 41 in: `test$`, 42 out: `test$$`, 43 }, 44 { 45 name: "leading and trailing $", 46 in: `$test$`, 47 out: `$$test$$`, 48 }, 49} 50 51var shellEscapeTestCase = []escapeTestCase{ 52 { 53 name: "no escaping", 54 in: `test`, 55 out: `test`, 56 }, 57 { 58 name: "leading $", 59 in: `$test`, 60 out: `'$test'`, 61 }, 62 { 63 name: "trailing $", 64 in: `test$`, 65 out: `'test$'`, 66 }, 67 { 68 name: "leading and trailing $", 69 in: `$test$`, 70 out: `'$test$'`, 71 }, 72 { 73 name: "single quote", 74 in: `'`, 75 out: `''\'''`, 76 }, 77 { 78 name: "multiple single quote", 79 in: `''`, 80 out: `''\'''\'''`, 81 }, 82 { 83 name: "double quote", 84 in: `""`, 85 out: `'""'`, 86 }, 87 { 88 name: "ORIGIN", 89 in: `-Wl,--rpath,${ORIGIN}/../bionic-loader-test-libs`, 90 out: `'-Wl,--rpath,${ORIGIN}/../bionic-loader-test-libs'`, 91 }, 92} 93 94func TestNinjaEscaping(t *testing.T) { 95 for _, testCase := range ninjaEscapeTestCase { 96 got := NinjaEscape(testCase.in) 97 if got != testCase.out { 98 t.Errorf("%s: expected `%s` got `%s`", testCase.name, testCase.out, got) 99 } 100 } 101} 102 103func TestShellEscaping(t *testing.T) { 104 for _, testCase := range shellEscapeTestCase { 105 got := ShellEscape(testCase.in) 106 if got != testCase.out { 107 t.Errorf("%s: expected `%s` got `%s`", testCase.name, testCase.out, got) 108 } 109 } 110} 111 112func TestExternalShellEscaping(t *testing.T) { 113 if testing.Short() { 114 return 115 } 116 for _, testCase := range shellEscapeTestCase { 117 cmd := "echo -n " + ShellEscape(testCase.in) 118 got, err := exec.Command("/bin/sh", "-c", cmd).Output() 119 if err != nil { 120 t.Error(err) 121 } 122 if string(got) != testCase.in { 123 t.Errorf("%s: expected `%s` got `%s`", testCase.name, testCase.in, got) 124 } 125 } 126} 127