1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 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 response 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "bytes" 19*333d2b36SAndroid Build Coastguard Worker "reflect" 20*333d2b36SAndroid Build Coastguard Worker "testing" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workerfunc TestReadRspFile(t *testing.T) { 24*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 25*333d2b36SAndroid Build Coastguard Worker name, in string 26*333d2b36SAndroid Build Coastguard Worker out []string 27*333d2b36SAndroid Build Coastguard Worker }{ 28*333d2b36SAndroid Build Coastguard Worker { 29*333d2b36SAndroid Build Coastguard Worker name: "single quoting test case 1", 30*333d2b36SAndroid Build Coastguard Worker in: `./cmd '"'-C`, 31*333d2b36SAndroid Build Coastguard Worker out: []string{"./cmd", `"-C`}, 32*333d2b36SAndroid Build Coastguard Worker }, 33*333d2b36SAndroid Build Coastguard Worker { 34*333d2b36SAndroid Build Coastguard Worker name: "single quoting test case 2", 35*333d2b36SAndroid Build Coastguard Worker in: `./cmd '-C`, 36*333d2b36SAndroid Build Coastguard Worker out: []string{"./cmd", `-C`}, 37*333d2b36SAndroid Build Coastguard Worker }, 38*333d2b36SAndroid Build Coastguard Worker { 39*333d2b36SAndroid Build Coastguard Worker name: "single quoting test case 3", 40*333d2b36SAndroid Build Coastguard Worker in: `./cmd '\"'-C`, 41*333d2b36SAndroid Build Coastguard Worker out: []string{"./cmd", `\"-C`}, 42*333d2b36SAndroid Build Coastguard Worker }, 43*333d2b36SAndroid Build Coastguard Worker { 44*333d2b36SAndroid Build Coastguard Worker name: "single quoting test case 4", 45*333d2b36SAndroid Build Coastguard Worker in: `./cmd '\\'-C`, 46*333d2b36SAndroid Build Coastguard Worker out: []string{"./cmd", `\\-C`}, 47*333d2b36SAndroid Build Coastguard Worker }, 48*333d2b36SAndroid Build Coastguard Worker { 49*333d2b36SAndroid Build Coastguard Worker name: "none quoting test case 1", 50*333d2b36SAndroid Build Coastguard Worker in: `./cmd \'-C`, 51*333d2b36SAndroid Build Coastguard Worker out: []string{"./cmd", `'-C`}, 52*333d2b36SAndroid Build Coastguard Worker }, 53*333d2b36SAndroid Build Coastguard Worker { 54*333d2b36SAndroid Build Coastguard Worker name: "none quoting test case 2", 55*333d2b36SAndroid Build Coastguard Worker in: `./cmd \\-C`, 56*333d2b36SAndroid Build Coastguard Worker out: []string{"./cmd", `\-C`}, 57*333d2b36SAndroid Build Coastguard Worker }, 58*333d2b36SAndroid Build Coastguard Worker { 59*333d2b36SAndroid Build Coastguard Worker name: "none quoting test case 3", 60*333d2b36SAndroid Build Coastguard Worker in: `./cmd \"-C`, 61*333d2b36SAndroid Build Coastguard Worker out: []string{"./cmd", `"-C`}, 62*333d2b36SAndroid Build Coastguard Worker }, 63*333d2b36SAndroid Build Coastguard Worker { 64*333d2b36SAndroid Build Coastguard Worker name: "double quoting test case 1", 65*333d2b36SAndroid Build Coastguard Worker in: `./cmd "'"-C`, 66*333d2b36SAndroid Build Coastguard Worker out: []string{"./cmd", `'-C`}, 67*333d2b36SAndroid Build Coastguard Worker }, 68*333d2b36SAndroid Build Coastguard Worker { 69*333d2b36SAndroid Build Coastguard Worker name: "double quoting test case 2", 70*333d2b36SAndroid Build Coastguard Worker in: `./cmd "\\"-C`, 71*333d2b36SAndroid Build Coastguard Worker out: []string{"./cmd", `\-C`}, 72*333d2b36SAndroid Build Coastguard Worker }, 73*333d2b36SAndroid Build Coastguard Worker { 74*333d2b36SAndroid Build Coastguard Worker name: "double quoting test case 3", 75*333d2b36SAndroid Build Coastguard Worker in: `./cmd "\""-C`, 76*333d2b36SAndroid Build Coastguard Worker out: []string{"./cmd", `"-C`}, 77*333d2b36SAndroid Build Coastguard Worker }, 78*333d2b36SAndroid Build Coastguard Worker { 79*333d2b36SAndroid Build Coastguard Worker name: "ninja rsp file", 80*333d2b36SAndroid Build Coastguard Worker in: "'a'\nb\n'@'\n'foo'\\''bar'\n'foo\"bar'", 81*333d2b36SAndroid Build Coastguard Worker out: []string{"a", "b", "@", "foo'bar", `foo"bar`}, 82*333d2b36SAndroid Build Coastguard Worker }, 83*333d2b36SAndroid Build Coastguard Worker } 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 86*333d2b36SAndroid Build Coastguard Worker t.Run(testCase.name, func(t *testing.T) { 87*333d2b36SAndroid Build Coastguard Worker got, err := ReadRspFile(bytes.NewBuffer([]byte(testCase.in))) 88*333d2b36SAndroid Build Coastguard Worker if err != nil { 89*333d2b36SAndroid Build Coastguard Worker t.Errorf("unexpected error: %q", err) 90*333d2b36SAndroid Build Coastguard Worker } 91*333d2b36SAndroid Build Coastguard Worker if !reflect.DeepEqual(got, testCase.out) { 92*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %q got %q", testCase.out, got) 93*333d2b36SAndroid Build Coastguard Worker } 94*333d2b36SAndroid Build Coastguard Worker }) 95*333d2b36SAndroid Build Coastguard Worker } 96*333d2b36SAndroid Build Coastguard Worker} 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Workerfunc TestWriteRspFile(t *testing.T) { 99*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 100*333d2b36SAndroid Build Coastguard Worker name string 101*333d2b36SAndroid Build Coastguard Worker in []string 102*333d2b36SAndroid Build Coastguard Worker out string 103*333d2b36SAndroid Build Coastguard Worker }{ 104*333d2b36SAndroid Build Coastguard Worker { 105*333d2b36SAndroid Build Coastguard Worker name: "ninja rsp file", 106*333d2b36SAndroid Build Coastguard Worker in: []string{"a", "b", "@", "foo'bar", `foo"bar`}, 107*333d2b36SAndroid Build Coastguard Worker out: "a b '@' 'foo'\\''bar' 'foo\"bar'", 108*333d2b36SAndroid Build Coastguard Worker }, 109*333d2b36SAndroid Build Coastguard Worker } 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker for _, testCase := range testCases { 112*333d2b36SAndroid Build Coastguard Worker t.Run(testCase.name, func(t *testing.T) { 113*333d2b36SAndroid Build Coastguard Worker buf := &bytes.Buffer{} 114*333d2b36SAndroid Build Coastguard Worker err := WriteRspFile(buf, testCase.in) 115*333d2b36SAndroid Build Coastguard Worker if err != nil { 116*333d2b36SAndroid Build Coastguard Worker t.Errorf("unexpected error: %q", err) 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker if buf.String() != testCase.out { 119*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected %q got %q", testCase.out, buf.String()) 120*333d2b36SAndroid Build Coastguard Worker } 121*333d2b36SAndroid Build Coastguard Worker }) 122*333d2b36SAndroid Build Coastguard Worker } 123*333d2b36SAndroid Build Coastguard Worker} 124