// Copyright 2011 Google Inc. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package googleapi import ( "bytes" "fmt" "net/http" "net/url" "strings" "testing" ) type SetOpaqueTest struct { in *url.URL wantRequestURI string } var setOpaqueTests = []SetOpaqueTest{ // no path { &url.URL{ Scheme: "http", Host: "www.golang.org", }, "http://www.golang.org", }, // path { &url.URL{ Scheme: "http", Host: "www.golang.org", Path: "/", }, "http://www.golang.org/", }, // file with hex escaping { &url.URL{ Scheme: "https", Host: "www.golang.org", Path: "/file%20one&two", }, "https://www.golang.org/file%20one&two", }, // query { &url.URL{ Scheme: "http", Host: "www.golang.org", Path: "/", RawQuery: "q=go+language", }, "http://www.golang.org/?q=go+language", }, // file with hex escaping in path plus query { &url.URL{ Scheme: "https", Host: "www.golang.org", Path: "/file%20one&two", RawQuery: "q=go+language", }, "https://www.golang.org/file%20one&two?q=go+language", }, // query with hex escaping { &url.URL{ Scheme: "http", Host: "www.golang.org", Path: "/", RawQuery: "q=go%20language", }, "http://www.golang.org/?q=go%20language", }, } // prefixTmpl is a template for the expected prefix of the output of writing // an HTTP request. const prefixTmpl = "GET %v HTTP/1.1\r\nHost: %v\r\n" func TestSetOpaque(t *testing.T) { for _, test := range setOpaqueTests { u := *test.in SetOpaque(&u) w := &bytes.Buffer{} r := &http.Request{URL: &u} if err := r.Write(w); err != nil { t.Errorf("write request: %v", err) continue } prefix := fmt.Sprintf(prefixTmpl, test.wantRequestURI, test.in.Host) if got := string(w.Bytes()); !strings.HasPrefix(got, prefix) { t.Errorf("got %q expected prefix %q", got, prefix) } } }