github.com/swiftstack/ProxyFS@v0.0.0-20210203235616-4017c267d62f/pfs_middleware/tests/test_rpc.py (about) 1 # Copyright (c) 2015-2021, NVIDIA CORPORATION. 2 # SPDX-License-Identifier: Apache-2.0 3 4 5 import unittest 6 7 import pfs_middleware.rpc as rpc 8 9 10 class TestAddressParsing(unittest.TestCase): 11 def test_ipv4(self): 12 resp = {"IsBimodal": True, 13 "ActivePeerPrivateIPAddr": "10.2.3.4"} 14 15 _, parsed_ip = rpc.parse_is_account_bimodal_response(resp) 16 self.assertEqual(parsed_ip, "10.2.3.4") 17 18 def test_ipv6_no_brackets(self): 19 addr = "fc00:df02:c928:4ef2:f085:8af2:cf1b:6b4" 20 resp = {"IsBimodal": True, 21 "ActivePeerPrivateIPAddr": addr} 22 23 _, parsed_ip = rpc.parse_is_account_bimodal_response(resp) 24 self.assertEqual(parsed_ip, addr) 25 26 def test_ipv6_brackets(self): 27 addr = "fc00:bbb9:a634:aa7d:8cb1:1c1e:d1cb:519c" 28 resp = {"IsBimodal": True, 29 "ActivePeerPrivateIPAddr": "[{0}]".format(addr)} 30 31 _, parsed_ip = rpc.parse_is_account_bimodal_response(resp) 32 self.assertEqual(parsed_ip, addr) 33 34 35 class TestResponseParsing(unittest.TestCase): 36 # These maybe aren't great, but they're more than what we had 37 def test_get_object(self): 38 resp = { 39 "ReadEntsOut": 'a', 40 "Metadata": 'Yg==', # 'b' 41 "FileSize": 'c', 42 "ModificationTime": 'd', 43 "AttrChangeTime": 'e', 44 "IsDir": 'f', 45 "InodeNumber": 'g', 46 "NumWrites": 'h', 47 "LeaseId": 'i', 48 } 49 self.assertEqual(rpc.parse_get_object_response(resp), ( 50 'a', 'b', 'c', 'e', 'f', 'g', 'h', 'i')) 51 52 # older proxyfsd didn't send IsDir, so it will not be present in 53 # older responses, but older GET would fail on a directory object 54 # so False is correct if IsDir is not present. 55 del resp["IsDir"] 56 self.assertEqual(rpc.parse_get_object_response(resp), ( 57 'a', 'b', 'c', 'e', False, 'g', 'h', 'i')) 58 59 # Old proxyfsd didn't send AttrChangeTime, but we've always had 60 # ModificationTime available, which is the next-best option 61 del resp["AttrChangeTime"] 62 self.assertEqual(rpc.parse_get_object_response(resp), ( 63 'a', 'b', 'c', 'd', False, 'g', 'h', 'i')) 64 65 def test_coalesce_object(self): 66 resp = { 67 "ModificationTime": 'a', 68 "AttrChangeTime": 'b', 69 "InodeNumber": 'c', 70 "NumWrites": 'd', 71 } 72 self.assertEqual(rpc.parse_coalesce_object_response(resp), ( 73 'b', 'c', 'd')) 74 # Old proxyfsd didn't send AttrChangeTime, but we've always had 75 # ModificationTime available, which is the next-best option 76 del resp["AttrChangeTime"] 77 self.assertEqual(rpc.parse_coalesce_object_response(resp), ( 78 'a', 'c', 'd')) 79 80 def test_put_complete(self): 81 resp = { 82 "ModificationTime": 'a', 83 "AttrChangeTime": 'b', 84 "InodeNumber": 'c', 85 "NumWrites": 'd', 86 } 87 self.assertEqual(rpc.parse_put_complete_response(resp), ( 88 'b', 'c', 'd')) 89 # Old proxyfsd didn't send AttrChangeTime, but we've always had 90 # ModificationTime available, which is the next-best option 91 del resp["AttrChangeTime"] 92 self.assertEqual(rpc.parse_put_complete_response(resp), ( 93 'a', 'c', 'd')) 94 95 def test_mkdir(self): 96 resp = { 97 "ModificationTime": 'a', 98 "AttrChangeTime": 'b', 99 "InodeNumber": 'c', 100 "NumWrites": 'd', 101 } 102 self.assertEqual(rpc.parse_middleware_mkdir_response(resp), ( 103 'b', 'c', 'd')) 104 # Old proxyfsd didn't send AttrChangeTime, but we've always had 105 # ModificationTime available, which is the next-best option 106 del resp["AttrChangeTime"] 107 self.assertEqual(rpc.parse_middleware_mkdir_response(resp), ( 108 'a', 'c', 'd')) 109 110 def test_get_account(self): 111 resp = { 112 "ModificationTime": 'a', 113 "AttrChangeTime": 'b', 114 "AccountEntries": ['c'], 115 } 116 self.assertEqual(rpc.parse_get_account_response(resp), ('b', ['c'])) 117 del resp["AttrChangeTime"] 118 self.assertEqual(rpc.parse_get_account_response(resp), ('a', ['c'])) 119 120 resp = { 121 "ModificationTime": 'a', 122 "AttrChangeTime": 'b', 123 "AccountEntries": None, 124 } 125 self.assertEqual(rpc.parse_get_account_response(resp), ('b', [])) 126 del resp["AttrChangeTime"] 127 self.assertEqual(rpc.parse_get_account_response(resp), ('a', [])) 128 129 def test_head(self): 130 resp = { 131 "Metadata": 'YQ==', # 'a' 132 "ModificationTime": 'b', 133 "AttrChangeTime": 'c', 134 "FileSize": 'd', 135 "IsDir": 'e', 136 "InodeNumber": 'f', 137 "NumWrites": 'g', 138 } 139 self.assertEqual(rpc.parse_head_response(resp), ( 140 'a', 'c', 'd', 'e', 'f', 'g')) 141 142 # Old proxyfsd didn't send AttrChangeTime, but we've always had 143 # ModificationTime available, which is the next-best option 144 del resp["AttrChangeTime"] 145 self.assertEqual(rpc.parse_head_response(resp), ( 146 'a', 'b', 'd', 'e', 'f', 'g'))