• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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