mirror of https://github.com/prometheus/prometheus
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.6 KiB
166 lines
4.6 KiB
// 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) |
|
} |
|
}
|
|
|