mirror of
				https://github.com/prometheus/prometheus.git
				synced 2025-10-31 08:21:16 +01:00 
			
		
		
		
	Fix https://github.com/prometheus/prometheus/issues/9884 Signed-off-by: Julius Volz <julius.volz@gmail.com>
		
			
				
	
	
		
			167 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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)
 | |
| 	}
 | |
| }
 |