github.com/cloudwego/hertz@v0.9.3/pkg/protocol/http1/resp/header_test.go (about)

     1  /*
     2   * Copyright 2022 CloudWeGo Authors
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   *
    16   * The MIT License (MIT)
    17   *
    18   * Copyright (c) 2015-present Aliaksandr Valialkin, VertaMedia, Kirill Danshin, Erik Dubbelboer, FastHTTP Authors
    19   *
    20   * Permission is hereby granted, free of charge, to any person obtaining a copy
    21   * of this software and associated documentation files (the "Software"), to deal
    22   * in the Software without restriction, including without limitation the rights
    23   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    24   * copies of the Software, and to permit persons to whom the Software is
    25   * furnished to do so, subject to the following conditions:
    26   *
    27   * The above copyright notice and this permission notice shall be included in
    28   * all copies or substantial portions of the Software.
    29   *
    30   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    31   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    32   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    33   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    34   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    35   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    36   * THE SOFTWARE.
    37   *
    38   * This file may have been modified by CloudWeGo authors. All CloudWeGo
    39   * Modifications are Copyright 2022 CloudWeGo Authors.
    40   */
    41  
    42  package resp
    43  
    44  import (
    45  	"bytes"
    46  	"testing"
    47  
    48  	"github.com/cloudwego/hertz/pkg/protocol"
    49  	"github.com/cloudwego/netpoll"
    50  )
    51  
    52  func TestResponseHeaderCookie(t *testing.T) {
    53  	t.Parallel()
    54  
    55  	var h protocol.ResponseHeader
    56  	var c protocol.Cookie
    57  
    58  	c.SetKey("foobar")
    59  	c.SetValue("aaa")
    60  	h.SetCookie(&c)
    61  
    62  	c.SetKey("йцук")
    63  	c.SetDomain("foobar.com")
    64  	h.SetCookie(&c)
    65  
    66  	c.Reset()
    67  	c.SetKey("foobar")
    68  	if !h.Cookie(&c) {
    69  		t.Fatalf("Cannot find cookie %q", c.Key())
    70  	}
    71  
    72  	var expectedC1 protocol.Cookie
    73  	expectedC1.SetKey("foobar")
    74  	expectedC1.SetValue("aaa")
    75  	if !equalCookie(&expectedC1, &c) {
    76  		t.Fatalf("unexpected cookie\n%#v\nExpected\n%#v\n", &c, &expectedC1)
    77  	}
    78  
    79  	c.SetKey("йцук")
    80  	if !h.Cookie(&c) {
    81  		t.Fatalf("cannot find cookie %q", c.Key())
    82  	}
    83  
    84  	var expectedC2 protocol.Cookie
    85  	expectedC2.SetKey("йцук")
    86  	expectedC2.SetValue("aaa")
    87  	expectedC2.SetDomain("foobar.com")
    88  	if !equalCookie(&expectedC2, &c) {
    89  		t.Fatalf("unexpected cookie\n%v\nExpected\n%v\n", &c, &expectedC2)
    90  	}
    91  
    92  	h.VisitAllCookie(func(key, value []byte) {
    93  		var cc protocol.Cookie
    94  		if err := cc.ParseBytes(value); err != nil {
    95  			t.Fatal(err)
    96  		}
    97  		if !bytes.Equal(key, cc.Key()) {
    98  			t.Fatalf("Unexpected cookie key %q. Expected %q", key, cc.Key())
    99  		}
   100  		switch {
   101  		case bytes.Equal(key, []byte("foobar")):
   102  			if !equalCookie(&expectedC1, &cc) {
   103  				t.Fatalf("unexpected cookie\n%v\nExpected\n%v\n", &cc, &expectedC1)
   104  			}
   105  		case bytes.Equal(key, []byte("йцук")):
   106  			if !equalCookie(&expectedC2, &cc) {
   107  				t.Fatalf("unexpected cookie\n%v\nExpected\n%v\n", &cc, &expectedC2)
   108  			}
   109  		default:
   110  			t.Fatalf("unexpected cookie key %q", key)
   111  		}
   112  	})
   113  
   114  	w := &bytes.Buffer{}
   115  	zw := netpoll.NewWriter(w)
   116  	if err := WriteHeader(&h, zw); err != nil {
   117  		t.Fatalf("unexpected error: %s", err)
   118  	}
   119  	if err := zw.Flush(); err != nil {
   120  		t.Fatalf("unexpected error: %s", err)
   121  	}
   122  
   123  	h.DelAllCookies()
   124  
   125  	var h1 protocol.ResponseHeader
   126  	zr := netpoll.NewReader(w)
   127  	if err := ReadHeader(&h1, zr); err != nil {
   128  		t.Fatalf("unexpected error: %s", err)
   129  	}
   130  
   131  	c.SetKey("foobar")
   132  	if !h1.Cookie(&c) {
   133  		t.Fatalf("Cannot find cookie %q", c.Key())
   134  	}
   135  	if !equalCookie(&expectedC1, &c) {
   136  		t.Fatalf("unexpected cookie\n%v\nExpected\n%v\n", &c, &expectedC1)
   137  	}
   138  
   139  	h1.DelCookie("foobar")
   140  	if h.Cookie(&c) {
   141  		t.Fatalf("Unexpected cookie found: %v", &c)
   142  	}
   143  	if h1.Cookie(&c) {
   144  		t.Fatalf("Unexpected cookie found: %v", &c)
   145  	}
   146  
   147  	c.SetKey("йцук")
   148  	if !h1.Cookie(&c) {
   149  		t.Fatalf("cannot find cookie %q", c.Key())
   150  	}
   151  	if !equalCookie(&expectedC2, &c) {
   152  		t.Fatalf("unexpected cookie\n%v\nExpected\n%v\n", &c, &expectedC2)
   153  	}
   154  
   155  	h1.DelCookie("йцук")
   156  	if h.Cookie(&c) {
   157  		t.Fatalf("Unexpected cookie found: %v", &c)
   158  	}
   159  	if h1.Cookie(&c) {
   160  		t.Fatalf("Unexpected cookie found: %v", &c)
   161  	}
   162  }
   163  
   164  func equalCookie(c1, c2 *protocol.Cookie) bool {
   165  	if !bytes.Equal(c1.Key(), c2.Key()) {
   166  		return false
   167  	}
   168  	if !bytes.Equal(c1.Value(), c2.Value()) {
   169  		return false
   170  	}
   171  	if !c1.Expire().Equal(c2.Expire()) {
   172  		return false
   173  	}
   174  	if !bytes.Equal(c1.Domain(), c2.Domain()) {
   175  		return false
   176  	}
   177  	if !bytes.Equal(c1.Path(), c2.Path()) {
   178  		return false
   179  	}
   180  	return true
   181  }