github.com/vmware/govmomi@v0.37.2/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  }