xref: /aosp_15_r20/external/cronet/android/tools/license/mapper.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Workerfrom typing import Dict, List
2*6777b538SAndroid Build Coastguard Worker
3*6777b538SAndroid Build Coastguard Worker
4*6777b538SAndroid Build Coastguard Workerclass MapperException(Exception):
5*6777b538SAndroid Build Coastguard Worker  # Raised when the Mapper expectation equality fails.
6*6777b538SAndroid Build Coastguard Worker  pass
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Workerclass Mapper:
10*6777b538SAndroid Build Coastguard Worker  """
11*6777b538SAndroid Build Coastguard Worker  This will overwrite the value of the metadata field whose key is |dictionary_key|
12*6777b538SAndroid Build Coastguard Worker  with the value declared in |write_value|, before the overwrite happens, it
13*6777b538SAndroid Build Coastguard Worker  will check if the expected_value matches the value in the metadata field.
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker  Passing None to the |expected_value| will expect that the key does not exist
16*6777b538SAndroid Build Coastguard Worker  at all in the metadata.
17*6777b538SAndroid Build Coastguard Worker  """
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker  def __init__(self, dictionary_key: str, expected_value, write_value):
20*6777b538SAndroid Build Coastguard Worker    self._key = dictionary_key
21*6777b538SAndroid Build Coastguard Worker    self._expected_value = expected_value
22*6777b538SAndroid Build Coastguard Worker    self._write_value = write_value
23*6777b538SAndroid Build Coastguard Worker
24*6777b538SAndroid Build Coastguard Worker  def write(self,
25*6777b538SAndroid Build Coastguard Worker      metadata: Dict[str, str | List[str]]) -> None:
26*6777b538SAndroid Build Coastguard Worker    """
27*6777b538SAndroid Build Coastguard Worker    Writes the value |write_value| which is passed in the constructor of
28*6777b538SAndroid Build Coastguard Worker    the Mapper to the |metadata| provided. Before the write operation happens,
29*6777b538SAndroid Build Coastguard Worker    a check will occur to make sure that the value being overwritten matches
30*6777b538SAndroid Build Coastguard Worker    the |expected_value| that was passed in the constructor.
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker    If |None| was passed as |expected_value| then the expectation is that
33*6777b538SAndroid Build Coastguard Worker    the |key| should not exist in metadata.keys().
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker    :param metadata: A dictionary whose field with key |key| will be overwritten.
36*6777b538SAndroid Build Coastguard Worker    :raises: MapperException if the expectation check has failed.
37*6777b538SAndroid Build Coastguard Worker    """
38*6777b538SAndroid Build Coastguard Worker    if self._expected_value is None and self._key in metadata:
39*6777b538SAndroid Build Coastguard Worker      # We expected the key not to exist but it existed.
40*6777b538SAndroid Build Coastguard Worker      raise MapperException(
41*6777b538SAndroid Build Coastguard Worker          f"Expected absence of key `{self._key}` but "
42*6777b538SAndroid Build Coastguard Worker          f"found {metadata[self._key]}")
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker    if self._key not in metadata.keys() and self._expected_value:
45*6777b538SAndroid Build Coastguard Worker      # We expected a value but the key didn't exist, throw!
46*6777b538SAndroid Build Coastguard Worker      raise MapperException(f"Expected presence of key {self._key} but was"
47*6777b538SAndroid Build Coastguard Worker                            f"not found.")
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker    if self._key in metadata.keys() and metadata[
50*6777b538SAndroid Build Coastguard Worker      self._key] != self._expected_value:
51*6777b538SAndroid Build Coastguard Worker      # We expected the value to match but it didn't.
52*6777b538SAndroid Build Coastguard Worker      raise MapperException(
53*6777b538SAndroid Build Coastguard Worker          f"Expected \"{self._expected_value}\" but found"
54*6777b538SAndroid Build Coastguard Worker          f" {metadata[self._key]} in the README.chromium")
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker    metadata[self._key] = self._write_value
57