blob: 4df2dfd1e2555bea7f62cf078c0d198c6c5e9598 [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unittests for the field_mask_util.py module."""
from __future__ import print_function
import sys
from google.protobuf import field_mask_pb2
from chromite.lib import cros_test_lib
from chromite.utils import field_mask_util
assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'
class CreateFilteredDictTest(cros_test_lib.TestCase):
"""Unit tests for CreateFilteredDict"""
def testCreateFilteredDictWithFieldAndSubField(self):
"""Tests selecting top-level fields and sub-fields."""
original_dict = {
'a': {
'b': {
'c': 'val1',
'd': 2,
}
},
'e': {
'f': {
'g': 'val2',
'h': 3,
}
},
'i': 3,
'j': 'val3',
}
field_mask = field_mask_pb2.FieldMask(paths=['a.b.c', 'e.f', 'i'])
expected_dict = {
'a': {
'b': {
'c': 'val1',
}
},
'e': {
'f': {
'g': 'val2',
'h': 3,
}
},
'i': 3,
}
merged_dict = field_mask_util.CreateFilteredDict(field_mask, original_dict)
self.assertDictEqual(expected_dict, merged_dict)
def testCreateFilteredDictWithOverlappingSubFields(self):
"""Tests selecting overlapping sub-fields."""
original_dict = {
'a': {
'b': {
'c': 'val1',
'd': 2,
'e': 3,
},
},
}
field_mask = field_mask_pb2.FieldMask(paths=['a.b.c', 'a.b.e'])
expected_dict = {
'a': {
'b': {
'c': 'val1',
'e': 3,
},
},
}
merged_dict = field_mask_util.CreateFilteredDict(field_mask, original_dict)
self.assertDictEqual(expected_dict, merged_dict)
def testCreateFilteredDictWithEmptyPath(self):
"""Tests a FieldMask with the empty string as a path."""
original_dict = {'a': 1}
field_mask = field_mask_pb2.FieldMask(paths=[''])
with self.assertRaisesRegex(ValueError, 'Field cannot be empty string'):
field_mask_util.CreateFilteredDict(field_mask, original_dict)
def testCreateFilteredDictWithInvalidPath(self):
"""Tests a FieldMask with an invalid path."""
original_dict = {'a': 1, 'c': 2}
# Note that 'b' is not a path in the dict.
field_mask = field_mask_pb2.FieldMask(paths=['a', 'b'])
expected_dict = {'a': 1}
with cros_test_lib.LoggingCapturer() as logging_capturer:
merged_dict = field_mask_util.CreateFilteredDict(field_mask,
original_dict)
# The merged dict should contain only field 'a' ('b' does not exist, 'c'
# is not in the field mask). A warning about 'b' was logged.
self.assertTrue(logging_capturer.LogsContain('Field b not found.'))
self.assertDictEqual(expected_dict, merged_dict)
def testCreateFilteredDictWithLists(self):
"""Tests selecting fields that are lists."""
original_dict = {
'a': [1, 2],
'b': [3, 4],
'c': {
'd': [5, 6],
'e': [7, 8],
},
'f': [{
'g': 9,
'h': 10,
}, {
'g': 11,
'h': 12,
}],
}
field_mask = field_mask_pb2.FieldMask(paths=['a', 'c.d', 'f'])
expected_dict = {
'a': [1, 2],
'c': {
'd': [5, 6],
},
'f': [{
'g': 9,
'h': 10,
}, {
'g': 11,
'h': 12,
}],
}
merged_dict = field_mask_util.CreateFilteredDict(field_mask, original_dict)
self.assertDictEqual(expected_dict, merged_dict)
def testCreateFilteredDictWithListSubFields(self):
"""Tests selecting a list that is not the last position in a path."""
original_dict = {
'a': [1, 2],
'b': [3, 4],
'c': {
'd': [5, 6],
'e': [7, 8],
},
'f': [{
'g': 9,
'h': 10,
}, {
'g': 11,
'h': 12,
}],
}
field_mask = field_mask_pb2.FieldMask(paths=['f.g'])
with self.assertRaisesRegex(
ValueError, 'Field f is a list and cannot have sub-fields'
):
field_mask_util.CreateFilteredDict(field_mask, original_dict)
def testCreateFilteredDictWithEmptyFieldMask(self):
"""Tests a FieldMask with no paths."""
original_dict = {'a': 1}
field_mask = field_mask_pb2.FieldMask()
merged_dict = field_mask_util.CreateFilteredDict(field_mask, original_dict)
self.assertDictEqual({}, merged_dict)