// Copyright 2015 The Prometheus Authors // 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. // // NOTE: The test code in this file has been adapted from the "strconv" // package of the Go standard library to work for Prometheus-style strings. // // The original copyright notice from the Go project for these parts is // reproduced here: // // ======================================================================== // Copyright (c) 2009 The Go Authors. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ======================================================================== package strutil import ( "testing" "github.com/stretchr/testify/require" ) var quotetests = []struct { in string out string ascii string }{ {"\a\b\f\r\n\t\v", `"\a\b\f\r\n\t\v"`, `"\a\b\f\r\n\t\v"`}, {"\\", `"\\"`, `"\\"`}, {"abc\xffdef", `"abc\xffdef"`, `"abc\xffdef"`}, {"\u263a", `"☺"`, `"\u263a"`}, {"\U0010ffff", `"\U0010ffff"`, `"\U0010ffff"`}, {"\x04", `"\x04"`, `"\x04"`}, } var unquotetests = []struct { in string out string }{ {`""`, ""}, {`"a"`, "a"}, {`"abc"`, "abc"}, {`"☺"`, "☺"}, {`"hello world"`, "hello world"}, {`"\xFF"`, "\xFF"}, {`"\377"`, "\377"}, {`"\u1234"`, "\u1234"}, {`"\U00010111"`, "\U00010111"}, {`"\U0001011111"`, "\U0001011111"}, {`"\a\b\f\n\r\t\v\\\""`, "\a\b\f\n\r\t\v\\\""}, {`"'"`, "'"}, {`''`, ""}, {`'a'`, "a"}, {`'abc'`, "abc"}, {`'☺'`, "☺"}, {`'hello world'`, "hello world"}, {`'\ahéllo world'`, "\ahéllo world"}, {`'\xFF'`, "\xFF"}, {`'\377'`, "\377"}, {`'\u1234'`, "\u1234"}, {`'\U00010111'`, "\U00010111"}, {`'\U0001011111'`, "\U0001011111"}, {`'\a\b\f\n\r\t\v\\\''`, "\a\b\f\n\r\t\v\\'"}, {`'"'`, "\""}, {"``", ``}, {"`a`", `a`}, {"`abc`", `abc`}, {"`☺`", `☺`}, {"`hello world`", `hello world`}, {"`\\xFF`", `\xFF`}, {"`\\377`", `\377`}, {"`\\`", `\`}, {"`\n`", "\n"}, {"` `", ` `}, } var misquoted = []string{ ``, `"`, `"a`, `"'`, `b"`, `"\"`, `"\9"`, `"\19"`, `"\129"`, `'\'`, `'\9'`, `'\19'`, `'\129'`, `'\400'`, `"\x1!"`, `"\U12345678"`, `"\z"`, "`", "`xxx", "`\"", `"\'"`, `'\"'`, "\"\n\"", "\"\\n\n\"", "'\n'", "`1`9`", `1231`, `'\xF'`, `""12345"`, } func TestUnquote(t *testing.T) { for _, tt := range unquotetests { out, err := Unquote(tt.in) if err != nil { require.Equal(t, tt.out, out, "Unquote(%#q)", tt.in) } } // Run the quote tests too, backward. for _, tt := range quotetests { in, err := Unquote(tt.out) require.Equal(t, tt.in, in, "Unquote(%#q)", tt.out) require.NoError(t, err) } for _, s := range misquoted { out, err := Unquote(s) require.Empty(t, out, "Unquote(%#q)", s) require.EqualError(t, err, ErrSyntax.Error(), "Unquote(%#q)", s) } }