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