Tests that the duplicate hashes get resolved by rehashing.
| 133 | |
| 134 | // Tests that the duplicate hashes get resolved by rehashing. |
| 135 | TEST_F(SigNodeTest, DuplicateHash) { |
| 136 | NodeDef node1 = MakeNodeConst("node1"); |
| 137 | NodeDef node2 = MakeNodeConst("node2"); |
| 138 | NodeDef node3 = MakeNodeShapeN("node3", "node1", "node2"); |
| 139 | |
| 140 | SigNode sn1(&node1); |
| 141 | SigNode sn2(&node2); |
| 142 | SigNode sn3(&node3); |
| 143 | |
| 144 | constexpr size_t kSameHash = 999; |
| 145 | |
| 146 | SigNode::Link link1; |
| 147 | link1.tag = SigNode::LinkTag(GenNode::Port(true, 0), GenNode::Port(false, 0)); |
| 148 | link1.unique_hash = kSameHash; |
| 149 | link1.peers.emplace_back(&sn1); |
| 150 | |
| 151 | SigNode::Link link2; |
| 152 | link2.tag = SigNode::LinkTag(GenNode::Port(true, 1), GenNode::Port(false, 0)); |
| 153 | link2.unique_hash = kSameHash; |
| 154 | link2.peers.emplace_back(&sn2); |
| 155 | |
| 156 | SigNode::Link link3; |
| 157 | link3.tag = SigNode::LinkTag(GenNode::Port(true, 2), GenNode::Port(false, 0)); |
| 158 | link3.unique_hash = kSameHash; |
| 159 | link3.peers.emplace_back(&sn3); |
| 160 | |
| 161 | std::map<SigNode::LinkTag, SigNode::Link> link_map; |
| 162 | link_map[link1.tag] = link1; |
| 163 | link_map[link2.tag] = link2; |
| 164 | link_map[link3.tag] = link3; |
| 165 | |
| 166 | CopyLinksPass2(&link_map, &sn3); |
| 167 | auto& hl = sn3.hash_to_link(); |
| 168 | EXPECT_THAT(hl, SizeIs(3)); |
| 169 | |
| 170 | // Check that the hashes are self_consistent, and put the entries into |
| 171 | // another map with a known order. |
| 172 | std::map<SigNode::LinkTag, SigNode::Link> rehashed; |
| 173 | auto hlit = hl.begin(); |
| 174 | ASSERT_THAT(hlit, Ne(hl.end())); |
| 175 | EXPECT_THAT(hlit->second.unique_hash, Eq(hlit->first)); |
| 176 | rehashed[hlit->second.tag] = hlit->second; |
| 177 | ++hlit; |
| 178 | ASSERT_THAT(hlit, Ne(hl.end())); |
| 179 | EXPECT_THAT(hlit->second.unique_hash, Eq(hlit->first)); |
| 180 | rehashed[hlit->second.tag] = hlit->second; |
| 181 | ++hlit; |
| 182 | ASSERT_THAT(hlit, Ne(hl.end())); |
| 183 | EXPECT_THAT(hlit->second.unique_hash, Eq(hlit->first)); |
| 184 | rehashed[hlit->second.tag] = hlit->second; |
| 185 | |
| 186 | // Just in case. |
| 187 | ASSERT_THAT(rehashed, SizeIs(3)); |
| 188 | |
| 189 | auto rhit = rehashed.begin(); |
| 190 | ASSERT_THAT(rhit, Ne(rehashed.end())); |
| 191 | EXPECT_TRUE(rhit->second.tag == link1.tag); |
| 192 | EXPECT_THAT(rhit->second.unique_hash, Eq(kSameHash)); |
nothing calls this directly
no test coverage detected