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'))