github.com/vmware/govmomi@v0.51.0/toolbox/hgfs/protocol_test.go (about)

     1  // © Broadcom. All Rights Reserved.
     2  // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package hgfs
     6  
     7  import (
     8  	"bytes"
     9  	"encoding/base64"
    10  	"io"
    11  	"testing"
    12  )
    13  
    14  func TestProtocolEncoding(t *testing.T) {
    15  	ps := packetSize
    16  	defer func() {
    17  		packetSize = ps
    18  	}()
    19  
    20  	// a few structs have padding of some sort, leave PacketSize as-is for now with these tests
    21  	packetSize = func(r *Packet) uint32 {
    22  		return r.PacketSize
    23  	}
    24  
    25  	decode := func(s string) []byte {
    26  		b, _ := base64.StdEncoding.DecodeString(s)
    27  		return b
    28  	}
    29  
    30  	// base64 encoded packets below were captured from vmtoolsd during:
    31  	// govc guest.download /etc/hosts -
    32  	// govc guest.upload /etc/hosts /tmp/hosts
    33  	tests := []struct {
    34  		pkt string
    35  		dec any
    36  	}{
    37  		{
    38  			"AQAAAP8AAABMAAAANAAAAAAAAIApAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAA==",
    39  			new(RequestCreateSessionV4),
    40  		},
    41  		{
    42  			"AQAAAP8AAABYAgAANAAAAAAAAIApAAAAAAAAAAIAAAAAAAAA//////////8AAAAAAAAAAF/NcjwZ1DYAQQAAAAD4AAAAAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAgAAAAEAAAADAAAAAQAAAAQAAAABAAAABQAAAAEAAAAGAAAAAQAAAAcAAAABAAAACAAAAAEAAAAJAAAAAQAAAAoAAAABAAAACwAAAAEAAAAMAAAAAQAAAA0AAAABAAAADgAAAAEAAAAPAAAAAQAAABAAAAABAAAAEQAAAAEAAAASAAAAAQAAABMAAAAAAAAAFAAAAAEAAAAVAAAAAQAAABYAAAABAAAAFwAAAAEAAAAYAAAAAQAAABkAAAABAAAAGgAAAAEAAAAbAAAAAQAAABwAAAABAAAAHQAAAAEAAAAeAAAAAQAAAB8AAAABAAAAIAAAAAEAAAAhAAAAAQAAACIAAAABAAAAIwAAAAEAAAAkAAAAAQAAACUAAAABAAAAJgAAAAEAAAAnAAAAAAAAACgAAAAAAAAAKQAAAAEAAAAqAAAAAQAAACsAAAAAAAAALAAAAAAAAAAtAAAAAAAAAC4AAAAAAAAALwAAAAAAAAAwAAAAAAAAADEAAAAAAAAAMgAAAAAAAAAzAAAAAAAAADQAAAAAAAAANQAAAAAAAAA2AAAAAAAAADcAAAAAAAAAOAAAAAAAAAA5AAAAAAAAADoAAAAAAAAAOwAAAAAAAAA8AAAAAAAAAD0AAAAAAAAAPgAAAAAAAAA/AAAAAAAAAEAAAAAAAAAA",
    43  			new(ReplyCreateSessionV4),
    44  		},
    45  		{
    46  			"AQAAAP8AAABbAAAANAAAAAAAAIAPAAAAAAAAAAEAAAAAAAAAX81yPBnUNgAAAAAAAAAAAAAAAIAPAAAAAAAAAAAAAAAAAACADgAAAHJvb3QAZXRjAGhvc3RzAA==",
    47  			new(RequestGetattrV2),
    48  		},
    49  		{
    50  			"AQAAAP8AAACpAAAANAAAAAAAAIAPAAAAAAAAAAIAAAAAAAAAX81yPBnUNgAAAAAAAAAAAAAAAAAAAAAA//sCAAAAAAAAAAAAxgAAAAAAAABkP/0QmUzSAaAHo3qfz9IBZD/9EJlM0gFkP/0QmUzSAQAGBAQAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAABY9xMAAAAAAAD8AAAEAAAAAAAAAAAAAAAAAAAAAA==",
    51  			new(ReplyGetattrV2),
    52  		},
    53  		{
    54  			"AQAAAP8AAABYAAAANAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAX81yPBnUNgAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAGDgAAAHJvb3QAZXRjAGhvc3Rzcw==",
    55  			new(RequestOpen),
    56  		},
    57  		{
    58  			"AQAAAP8AAABAAAAANAAAAAAAAIAAAAAAAAAAAAIAAAAAAAAAX81yPBnUNgAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
    59  			new(ReplyOpen),
    60  		},
    61  		{
    62  			"AQAAAP8AAABMAAAANAAAAAAAAIAZAAAAAAAAAAEAAAAAAAAAX81yPBnUNgAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAA==",
    63  			new(RequestReadV3),
    64  		},
    65  		{
    66  			"AQAAAP8AAAAHAQAANAAAAAAAAIAZAAAAAAAAAAIAAAAAAAAAX81yPBnUNgAAAAAAAAAAAMYAAAAAAAAAAAAAADEyNy4wLjAuMQlsb2NhbGhvc3QKMTI3LjAuMS4xCXZhZ3JhbnQudm0JdmFncmFudAoKIyBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBkZXNpcmFibGUgZm9yIElQdjYgY2FwYWJsZSBob3N0cwo6OjEgICAgIGxvY2FsaG9zdCBpcDYtbG9jYWxob3N0IGlwNi1sb29wYmFjawpmZjAyOjoxIGlwNi1hbGxub2RlcwpmZjAyOjoyIGlwNi1hbGxyb3V0ZXJzCgA=",
    67  			new(ReplyReadV3),
    68  		},
    69  		{
    70  			"AQAAAP8AAABAAAAANAAAAAAAAIADAAAAAAAAAAEAAAAAAAAAX81yPBnUNgAAAAAAAAAAAAAAAIADAAAAAAAAAA==",
    71  			new(RequestClose),
    72  		},
    73  		{
    74  			"AQAAAP8AAAA8AAAANAAAAAAAAIADAAAAAAAAAAIAAAAAAAAAX81yPBnUNgAAAAAAAAAAAAAAAAAAAAAA",
    75  			new(ReplyClose),
    76  		},
    77  		{
    78  			"AQAAAP8AAAA8AAAANAAAAAAAAIAqAAAAAAAAAAEAAAAAAAAAX81yPBnUNgAAAAAAAAAAAAAAAAAAAAAA",
    79  			new(RequestDestroySessionV4),
    80  		},
    81  		{
    82  			"AQAAAP8AAAA8AAAANAAAAAAAAIAqAAAAAAAAAAIAAAAAAAAAX81yPBnUNgAAAAAAAAAAAAAAAAAAAAAA",
    83  			new(ReplyDestroySessionV4),
    84  		},
    85  		{
    86  			"AQAAAP8AAACZAAAANAAAAAAAAIAYAAAAAAAAAAEAAAAAAAAAyXxnMKrzOwAAAAAAAAAAAAsIAAAAAAAAAQAAAAQAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAcm9vdAB0bXAAcmVzb2x2LmNvbmYA",
    87  			new(RequestOpenV3),
    88  		},
    89  		{
    90  			"AQAAAP8AAABEAAAANAAAAAAAAIAYAAAAAAAAAAIAAAAAAAAAyXxnMKrzOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
    91  			new(ReplyOpenV3),
    92  		},
    93  		{
    94  			"AQAAAP8AAADJAAAANAAAAAAAAIAQAAAAAAAAAAEAAAAAAAAAyXxnMKrzOwAAAAAAAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAcm9vdAB0bXAAcmVzb2x2LmNvbmYA",
    95  			new(RequestSetattrV2),
    96  		},
    97  		{
    98  			"AQAAAP8AAAA8AAAANAAAAAAAAIAQAAAAAAAAAAIAAAAAAAAAyXxnMKrzOwAAAAAAAAAAAAAAAAAAAAAA",
    99  			new(ReplySetattrV2),
   100  		},
   101  		{
   102  			"AQAAAP8AAACTAAAANAAAAAAAAIAaAAAAAAAAAAEAAAAAAAAAyXxnMKrzOwAAAAAAAAAAAAAAAAABAAAAAAAAAABGAAAAAAAAAAAAAABuYW1lc2VydmVyIDEwLjExOC42NS4xCm5hbWVzZXJ2ZXIgMTAuMTE4LjY1LjIKc2VhcmNoIGVuZy52bXdhcmUuY29tIAoK",
   103  			new(RequestWriteV3),
   104  		},
   105  		{
   106  			"AQAAAP8AAABAAAAANAAAAAAAAIAaAAAAAAAAAAIAAAAAAAAAyXxnMKrzOwAAAAAAAAAAAEYAAAAAAAAAAAAAAA==",
   107  			new(ReplyWriteV3),
   108  		},
   109  	}
   110  
   111  	for i, test := range tests {
   112  		dec := decode(test.pkt)
   113  		pkt := new(Packet)
   114  		err := pkt.UnmarshalBinary(dec)
   115  		if err != nil {
   116  			t.Fatal(err)
   117  		}
   118  
   119  		err = UnmarshalBinary(pkt.Payload, test.dec)
   120  		if err != nil {
   121  			t.Fatal(err)
   122  		}
   123  
   124  		pkt.Payload, err = MarshalBinary(test.dec)
   125  		if err != nil {
   126  			t.Fatal(err)
   127  		}
   128  
   129  		enc, err := pkt.MarshalBinary()
   130  		if err != nil {
   131  			t.Fatal(err)
   132  		}
   133  
   134  		if !bytes.HasPrefix(dec, enc) {
   135  			t.Errorf("%d: %T != %s\n", i, test.dec, test.pkt)
   136  		}
   137  	}
   138  }
   139  
   140  func TestFileName(t *testing.T) {
   141  	tests := []struct {
   142  		raw  string
   143  		name string
   144  	}{
   145  		{
   146  			"root\x00etc\x00hosts",
   147  			"/etc/hosts",
   148  		},
   149  	}
   150  
   151  	for i, test := range tests {
   152  		fn := FileName{
   153  			Name:   test.raw,
   154  			Length: uint32(len(test.raw)),
   155  		}
   156  
   157  		if fn.Path() != test.name {
   158  			t.Errorf("%d: %q != %q", i, fn.Path(), test.name)
   159  		}
   160  
   161  		var fs FileName
   162  		fs.FromString(test.name)
   163  		if fs != fn {
   164  			t.Errorf("%d: %v != %v", i, fn, fs)
   165  		}
   166  	}
   167  }
   168  
   169  func TestProtocolMarshal(t *testing.T) {
   170  	var buf []byte
   171  	var x uint64
   172  	err := UnmarshalBinary(buf, x)
   173  	if err == nil {
   174  		t.Fatal("expected error")
   175  	}
   176  
   177  	status := err.(*Status)
   178  	if status.Error() != io.EOF.Error() {
   179  		t.Errorf("err=%s", status.Err)
   180  	}
   181  
   182  	status.Err = nil
   183  	if status.Error() == "" {
   184  		t.Error("status")
   185  	}
   186  }