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 }