go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/lucicfg/graph/testdata/node.star (about)

     1  trace = stacktrace()
     2  
     3  def test_add_node_ok():
     4      g = new_graph()
     5      k = g.key("parent", "par", "kind", "name")
     6      g.add_node(k, props = {"prop": ["v1", "v2"]})
     7  
     8      g.finalize()
     9      n = g.node(k)
    10  
    11      assert.true(n != None)
    12      assert.true(n)
    13      assert.eq(str(n), 'kind("par/name")')
    14      assert.eq(type(n), "graph.node")
    15      assert.eq(n.key, k)
    16      assert.eq(n.props.prop, ["v1", "v2"])
    17      assert.eq(
    18          str(n.trace),
    19          "Traceback (most recent call last):\n" +
    20          "  testdata/node.star:25:17: in <toplevel>\n" +
    21          "  testdata/node.star:6:15: in test_add_node_ok\n" +
    22          "  <builtin>: in add_node\n",
    23      )
    24  
    25  test_add_node_ok()
    26  
    27  def test_stringification():
    28      def key_to_node_str(*pairs):
    29          g = new_graph()
    30          k = g.key(*pairs)
    31          g.add_node(k)
    32          g.finalize()
    33          return str(g.node(k))
    34  
    35      assert.eq(key_to_node_str("b", "b1", "kind", "name"), 'kind("b1/name")')
    36      assert.eq(key_to_node_str("_skip", "skip", "kind", "name"), 'kind("name")')
    37      assert.eq(key_to_node_str("@n", "ns", "b", "b1", "kind", "name"), 'kind("ns:b1/name")')
    38      assert.eq(key_to_node_str("@n", "ns", "_skip", "skip", "kind", "name"), 'kind("ns:name")')
    39      assert.eq(key_to_node_str("@n", "", "b", "b1", "kind", "name"), 'kind("b1/name")')
    40      assert.eq(key_to_node_str("@n", "", "_skip", "skip", "kind", "name"), 'kind("name")')
    41  
    42  test_stringification()
    43  
    44  def test_node_can_be_used_in_sets():
    45      g = new_graph()
    46  
    47      k1 = g.key("t1", "id1")
    48      k2 = g.key("t1", "id2")
    49  
    50      g.add_node(k1)
    51      g.add_node(k2)
    52  
    53      g.finalize()
    54  
    55      n1 = g.node(k1)
    56      n2 = g.node(k2)
    57  
    58      s = set([n1, n2])
    59      assert.true(n1 in s)
    60  
    61  test_node_can_be_used_in_sets()
    62  
    63  def test_redeclaration():
    64      g = new_graph()
    65      k = g.key("t1", "id1")
    66  
    67      g.add_node(k, {}, trace = trace)
    68      assert.fails(
    69          lambda: g.add_node(k, {}),
    70          r't1\("id1"\) is redeclared, previous declaration:\n' +
    71          r"Traceback \(most recent call last\)\:\n" +
    72          r"  testdata/node\.star\:.\:..\: in <toplevel>\n",
    73      )
    74  
    75  test_redeclaration()
    76  
    77  def test_idempotent_nodes():
    78      g = new_graph()
    79      k1 = g.key("t1", "id1")
    80      k2 = g.key("t1", "id2")
    81      k3 = g.key("t1", "id3")
    82  
    83      # Declaring idempotent node twice with exact same props is OK.
    84      g.add_node(k1, {"a": [1, 1]}, idempotent = True)
    85      g.add_node(k1, {"a": [1, 1]}, idempotent = True)
    86  
    87      # Redeclaring idempotent node as non-idempotent is not OK.
    88      assert.fails(
    89          lambda: g.add_node(k1, {"a": [1, 1]}, idempotent = False),
    90          "redeclared",
    91      )
    92  
    93      # Redeclaring idempotent node with different props is not OK.
    94      assert.fails(
    95          lambda: g.add_node(k1, {"a": [1, 2]}, idempotent = True),
    96          "redeclared",
    97      )
    98  
    99      # A node declared as non-idempotent cannot be redeclared as idempotent.
   100      g.add_node(k2, idempotent = False)
   101      assert.fails(lambda: g.add_node(k2, idempotent = True), "redeclared")
   102  
   103      # A node declared as idempotent cannot be redeclared as non-idempotent.
   104      g.add_node(k3, idempotent = True)
   105      assert.fails(lambda: g.add_node(k3, idempotent = False), "redeclared")
   106  
   107  test_idempotent_nodes()
   108  
   109  def test_freezes_props():
   110      g = new_graph()
   111      k = g.key("t1", "id1")
   112  
   113      vals = ["v1", "v2"]
   114      g.add_node(k, props = {"prop": vals})
   115  
   116      g.finalize()
   117      n = g.node(k)
   118  
   119      # Note that freezing is NOT copying, original 'vals' is also frozen now.
   120      assert.fails(lambda: n.props.prop.append("z"), "cannot append to frozen list")
   121      assert.fails(lambda: vals.append("z"), "cannot append to frozen list")
   122  
   123  test_freezes_props()
   124  
   125  def test_non_string_prop():
   126      g = new_graph()
   127      k = g.key("t1", "id1")
   128      assert.fails(lambda: g.add_node(k, props = {1: "2"}), "non-string key 1 in 'props'")
   129  
   130  test_non_string_prop()