mirror of
https://github.com/seigler/dash-docs
synced 2025-07-27 17:56:16 +00:00
174 lines
117 KiB
HTML
174 lines
117 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
<meta name="generator" content="Doxygen 1.8.14"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>Dash Core: qa/rpc-tests/test_framework/comptool.py Source File</title>
|
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="jquery.js"></script>
|
|
<script type="text/javascript" src="dynsections.js"></script>
|
|
<link href="navtree.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="resize.js"></script>
|
|
<script type="text/javascript" src="navtreedata.js"></script>
|
|
<script type="text/javascript" src="navtree.js"></script>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(document).ready(initResizable);
|
|
/* @license-end */</script>
|
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
|
<script type="text/javascript" src="search/search.js"></script>
|
|
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
</head>
|
|
<body>
|
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
<div id="titlearea">
|
|
<table cellspacing="0" cellpadding="0">
|
|
<tbody>
|
|
<tr style="height: 56px;">
|
|
<td id="projectlogo"><img alt="Logo" src="bitcoin_logo_doxygen.png"/></td>
|
|
<td id="projectalign" style="padding-left: 0.5em;">
|
|
<div id="projectname">Dash Core
|
|
 <span id="projectnumber">0.12.2.1</span>
|
|
</div>
|
|
<div id="projectbrief">P2P Digital Currency</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.8.14 -->
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
/* @license-end */
|
|
</script>
|
|
<script type="text/javascript" src="menudata.js"></script>
|
|
<script type="text/javascript" src="menu.js"></script>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(function() {
|
|
initMenu('',true,false,'search.php','Search');
|
|
$(document).ready(function() { init_search(); });
|
|
});
|
|
/* @license-end */</script>
|
|
<div id="main-nav"></div>
|
|
</div><!-- top -->
|
|
<div id="side-nav" class="ui-resizable side-nav-resizable">
|
|
<div id="nav-tree">
|
|
<div id="nav-tree-contents">
|
|
<div id="nav-sync" class="sync"></div>
|
|
</div>
|
|
</div>
|
|
<div id="splitbar" style="-moz-user-select:none;"
|
|
class="ui-resizable-handle">
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(document).ready(function(){initNavTree('comptool_8py_source.html','');});
|
|
/* @license-end */
|
|
</script>
|
|
<div id="doc-content">
|
|
<!-- window showing the filter options -->
|
|
<div id="MSearchSelectWindow"
|
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
</div>
|
|
|
|
<!-- iframe showing the search results (closed by default) -->
|
|
<div id="MSearchResultsWindow">
|
|
<iframe src="javascript:void(0)" frameborder="0"
|
|
name="MSearchResults" id="MSearchResults">
|
|
</iframe>
|
|
</div>
|
|
|
|
<div class="header">
|
|
<div class="headertitle">
|
|
<div class="title">comptool.py</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<a href="comptool_8py.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"><a class="line" href="namespacetest__framework_1_1comptool.html"> 1</a></span> <span class="comment">#!/usr/bin/env python2</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">#</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"># Distributed under the MIT/X11 software license, see the accompanying</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"># file COPYING or http://www.opensource.org/licenses/mit-license.php.</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">#</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> </div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="keyword">from</span> .mininode <span class="keyword">import</span> *</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="keyword">from</span> .blockstore <span class="keyword">import</span> BlockStore, TxStore</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="keyword">from</span> .util <span class="keyword">import</span> p2p_port</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> </div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="stringliteral">'''</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="stringliteral">This is a tool for comparing two or more dashds to each other</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="stringliteral">using a script provided.</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="stringliteral"></span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="stringliteral">To use, create a class that implements get_tests(), and pass it in</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="stringliteral">as the test generator to TestManager. get_tests() should be a python</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="stringliteral">generator that returns TestInstance objects. See below for definition.</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="stringliteral">'''</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment"># TestNode behaves as follows:</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment"># Configure with a BlockStore and TxStore</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="comment"># on_inv: log the message but don't request</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment"># on_headers: log the chain tip</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"># on_pong: update ping response map (for synchronization)</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"># on_getheaders: provide headers via BlockStore</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"># on_getdata: provide blocks via BlockStore</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> </div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="keyword">global</span> mininode_lock</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1RejectResult.html"> 30</a></span> <span class="keyword">class </span><a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html">RejectResult</a>(object):</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <span class="stringliteral">'''</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="stringliteral"> Outcome that expects rejection of a transaction or block.</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="stringliteral"> '''</span></div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1RejectResult.html#a9b7edc47973288c6239ebeb872a3a111"> 34</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html#a9b7edc47973288c6239ebeb872a3a111">__init__</a>(self, code, reason=b''):</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1RejectResult.html#a0dd8c5fedfd6396fd096edfaf7f53205"> 35</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html#a0dd8c5fedfd6396fd096edfaf7f53205">code</a> = code</div><div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1RejectResult.html#ad4627d616a43a531702f4b6115771a95"> 36</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html#ad4627d616a43a531702f4b6115771a95">reason</a> = reason</div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1RejectResult.html#a1d42c4f510937c54af6348d2b7f0522b"> 37</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html#a1d42c4f510937c54af6348d2b7f0522b">match</a>(self, other):</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <span class="keywordflow">if</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html#a0dd8c5fedfd6396fd096edfaf7f53205">code</a> != other.code:</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <span class="keywordflow">return</span> other.reason.startswith(self.<a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html#ad4627d616a43a531702f4b6115771a95">reason</a>)</div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1RejectResult.html#a5b696ee693bd074cc59e6b42fc4dd82b"> 41</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html#a5b696ee693bd074cc59e6b42fc4dd82b">__repr__</a>(self):</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <span class="keywordflow">return</span> <span class="stringliteral">'%i:%s'</span> % (self.<a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html#a0dd8c5fedfd6396fd096edfaf7f53205">code</a>,self.<a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html#ad4627d616a43a531702f4b6115771a95">reason</a> <span class="keywordflow">or</span> <span class="stringliteral">'*'</span>)</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> </div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html"> 44</a></span> <span class="keyword">class </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html">TestNode</a>(<a class="code" href="classtest__framework_1_1mininode_1_1NodeConnCB.html">NodeConnCB</a>):</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span> </div><div class="line"><a name="l00046"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#ad2ebc867660c3d12f0537de4f9457d2e"> 46</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ad2ebc867660c3d12f0537de4f9457d2e">__init__</a>(self, block_store, tx_store):</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  NodeConnCB.__init__(self)</div><div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a32afb3300f4ba7d3dd6b9abe7cbad092"> 48</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a32afb3300f4ba7d3dd6b9abe7cbad092">conn</a> = <span class="keywordtype">None</span></div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#ada9c0551b5b98546772eecd0d0d9edcb"> 49</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ada9c0551b5b98546772eecd0d0d9edcb">bestblockhash</a> = <span class="keywordtype">None</span></div><div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a41837ee3241c15535fbc1891b7d50525"> 50</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a41837ee3241c15535fbc1891b7d50525">block_store</a> = block_store</div><div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#ac3fa58de54f107569930a64843ee5373"> 51</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ac3fa58de54f107569930a64843ee5373">block_request_map</a> = {}</div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a33e1cd9b56327a92d1ff3a283a48f9ae"> 52</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a33e1cd9b56327a92d1ff3a283a48f9ae">tx_store</a> = tx_store</div><div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a84630257ff564a0c187e6549e6f0b6ea"> 53</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a84630257ff564a0c187e6549e6f0b6ea">tx_request_map</a> = {}</div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#af10ebbc8c0f0eaa0f0af459334f0b682"> 54</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#af10ebbc8c0f0eaa0f0af459334f0b682">block_reject_map</a> = {}</div><div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a37398b9cc9fd8c821a6b202f2b3acb72"> 55</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a37398b9cc9fd8c821a6b202f2b3acb72">tx_reject_map</a> = {}</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> </div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="comment"># When the pingmap is non-empty we're waiting for </span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="comment"># a response</span></div><div class="line"><a name="l00059"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#ae89ea4d3b51c34206b07de0aa2a8b7b0"> 59</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ae89ea4d3b51c34206b07de0aa2a8b7b0">pingMap</a> = {} </div><div class="line"><a name="l00060"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#ade52954c0f1d513c3629e643df9e42b8"> 60</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ade52954c0f1d513c3629e643df9e42b8">lastInv</a> = []</div><div class="line"><a name="l00061"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a3c59b27f18b5ef9814a339709834ef88"> 61</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a3c59b27f18b5ef9814a339709834ef88">closed</a> = <span class="keyword">False</span></div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> </div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#acb14d94e65391ada499cf2de515da785"> 63</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#acb14d94e65391ada499cf2de515da785">on_close</a>(self, conn):</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a3c59b27f18b5ef9814a339709834ef88">closed</a> = <span class="keyword">True</span></div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> </div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#ad6b043836a1b6b9ed982fcefbfd63657"> 66</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ad6b043836a1b6b9ed982fcefbfd63657">add_connection</a>(self, conn):</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a32afb3300f4ba7d3dd6b9abe7cbad092">conn</a> = conn</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> </div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#acd31f41f37b4458d41f3efa97c744479"> 69</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#acd31f41f37b4458d41f3efa97c744479">on_headers</a>(self, conn, message):</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keywordflow">if</span> len(message.headers) > 0:</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  best_header = message.headers[-1]</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  best_header.calc_sha256()</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ada9c0551b5b98546772eecd0d0d9edcb">bestblockhash</a> = best_header.sha256</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span> </div><div class="line"><a name="l00075"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a6205eb45bb709604bf35692a3aba91f5"> 75</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a6205eb45bb709604bf35692a3aba91f5">on_getheaders</a>(self, conn, message):</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  response = self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a41837ee3241c15535fbc1891b7d50525">block_store</a>.headers_for(message.locator, message.hashstop)</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  <span class="keywordflow">if</span> response <span class="keywordflow">is</span> <span class="keywordflow">not</span> <span class="keywordtype">None</span>:</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  conn.send_message(response)</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span> </div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a48d23cf0613862933b9c6207eef58a80"> 80</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a48d23cf0613862933b9c6207eef58a80">on_getdata</a>(self, conn, message):</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  [conn.send_message(r) <span class="keywordflow">for</span> r <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a41837ee3241c15535fbc1891b7d50525">block_store</a>.get_blocks(message.inv)]</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  [conn.send_message(r) <span class="keywordflow">for</span> r <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a33e1cd9b56327a92d1ff3a283a48f9ae">tx_store</a>.get_transactions(message.inv)]</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="keywordflow">for</span> i <span class="keywordflow">in</span> message.inv:</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordflow">if</span> i.type == 1:</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a84630257ff564a0c187e6549e6f0b6ea">tx_request_map</a>[i.hash] = <span class="keyword">True</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordflow">elif</span> i.type == 2:</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ac3fa58de54f107569930a64843ee5373">block_request_map</a>[i.hash] = <span class="keyword">True</span></div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> </div><div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#ae7aabbff3a47105cd354c25fe6c2e92e"> 90</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ae7aabbff3a47105cd354c25fe6c2e92e">on_inv</a>(self, conn, message):</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ade52954c0f1d513c3629e643df9e42b8">lastInv</a> = [x.hash <span class="keywordflow">for</span> x <span class="keywordflow">in</span> message.inv]</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span> </div><div class="line"><a name="l00093"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a6a07a61fe3c683a5b0074d95f9b86d7a"> 93</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a6a07a61fe3c683a5b0074d95f9b86d7a">on_pong</a>(self, conn, message):</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keywordflow">try</span>:</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  del self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ae89ea4d3b51c34206b07de0aa2a8b7b0">pingMap</a>[message.nonce]</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordflow">except</span> KeyError:</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="keywordflow">raise</span> AssertionError(<span class="stringliteral">"Got pong for unknown ping [%s]"</span> % repr(message))</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span> </div><div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#adf82006f0f145589d881a446f49a7af7"> 99</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#adf82006f0f145589d881a446f49a7af7">on_reject</a>(self, conn, message):</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keywordflow">if</span> message.message == b<span class="stringliteral">'tx'</span>:</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a37398b9cc9fd8c821a6b202f2b3acb72">tx_reject_map</a>[message.data] = <a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html">RejectResult</a>(message.code, message.reason)</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keywordflow">if</span> message.message == b<span class="stringliteral">'block'</span>:</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#af10ebbc8c0f0eaa0f0af459334f0b682">block_reject_map</a>[message.data] = <a class="code" href="classtest__framework_1_1comptool_1_1RejectResult.html">RejectResult</a>(message.code, message.reason)</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> </div><div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#af4c6646b94834ca76f6b49e1d6000973"> 105</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#af4c6646b94834ca76f6b49e1d6000973">send_inv</a>(self, obj):</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  mtype = 2 <span class="keywordflow">if</span> isinstance(obj, CBlock) <span class="keywordflow">else</span> 1</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a32afb3300f4ba7d3dd6b9abe7cbad092">conn</a>.send_message(<a class="code" href="classtest__framework_1_1mininode_1_1msg__inv.html">msg_inv</a>([<a class="code" href="classtest__framework_1_1mininode_1_1CInv.html">CInv</a>(mtype, obj.sha256)]))</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span> </div><div class="line"><a name="l00109"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a5815b74f81f163d3d430a6166c1c5b8e"> 109</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a5815b74f81f163d3d430a6166c1c5b8e">send_getheaders</a>(self):</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="comment"># We ask for headers from their last tip.</span></div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  m = <a class="code" href="classtest__framework_1_1mininode_1_1msg__getheaders.html">msg_getheaders</a>()</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  m.locator = self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a41837ee3241c15535fbc1891b7d50525">block_store</a>.get_locator(self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ada9c0551b5b98546772eecd0d0d9edcb">bestblockhash</a>)</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a32afb3300f4ba7d3dd6b9abe7cbad092">conn</a>.send_message(m)</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> </div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <span class="comment"># This assumes BIP31</span></div><div class="line"><a name="l00116"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a67e7d56b5ae0f6b723e133727a348709"> 116</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a67e7d56b5ae0f6b723e133727a348709">send_ping</a>(self, nonce):</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ae89ea4d3b51c34206b07de0aa2a8b7b0">pingMap</a>[nonce] = <span class="keyword">True</span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a32afb3300f4ba7d3dd6b9abe7cbad092">conn</a>.send_message(<a class="code" href="classtest__framework_1_1mininode_1_1msg__ping.html">msg_ping</a>(nonce))</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#ac48ca37d31a530917d73bc6b478a1146"> 120</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ac48ca37d31a530917d73bc6b478a1146">received_ping_response</a>(self, nonce):</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">return</span> nonce <span class="keywordflow">not</span> <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ae89ea4d3b51c34206b07de0aa2a8b7b0">pingMap</a></div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> </div><div class="line"><a name="l00123"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestNode.html#a5e350a39570565fe7a4d7a5024dd9997"> 123</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a5e350a39570565fe7a4d7a5024dd9997">send_mempool</a>(self):</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#ade52954c0f1d513c3629e643df9e42b8">lastInv</a> = []</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html#a32afb3300f4ba7d3dd6b9abe7cbad092">conn</a>.send_message(<a class="code" href="classtest__framework_1_1mininode_1_1msg__mempool.html">msg_mempool</a>())</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> </div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> <span class="comment"># TestInstance:</span></div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span> <span class="comment">#</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> <span class="comment"># Instances of these are generated by the test generator, and fed into the</span></div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> <span class="comment"># comptool.</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> <span class="comment">#</span></div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> <span class="comment"># "blocks_and_transactions" should be an array of</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> <span class="comment"># [obj, True/False/None, hash/None]:</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span> <span class="comment"># - obj is either a CBlock, CBlockHeader, or a CTransaction, and</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span> <span class="comment"># - the second value indicates whether the object should be accepted</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> <span class="comment"># into the blockchain or mempool (for tests where we expect a certain</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span> <span class="comment"># answer), or "None" if we don't expect a certain answer and are just</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> <span class="comment"># comparing the behavior of the nodes being tested.</span></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> <span class="comment"># - the third value is the hash to test the tip against (if None or omitted,</span></div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> <span class="comment"># use the hash of the block)</span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span> <span class="comment"># - NOTE: if a block header, no test is performed; instead the header is</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> <span class="comment"># just added to the block_store. This is to facilitate block delivery</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> <span class="comment"># when communicating with headers-first clients (when withholding an</span></div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> <span class="comment"># intermediate block).</span></div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> <span class="comment"># sync_every_block: if True, then each block will be inv'ed, synced, and</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> <span class="comment"># nodes will be tested based on the outcome for the block. If False,</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> <span class="comment"># then inv's accumulate until all blocks are processed (or max inv size</span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span> <span class="comment"># is reached) and then sent out in one inv message. Then the final block</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> <span class="comment"># will be synced across all connections, and the outcome of the final </span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> <span class="comment"># block will be tested.</span></div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> <span class="comment"># sync_every_tx: analogous to behavior for sync_every_block, except if outcome</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span> <span class="comment"># on the final tx is None, then contents of entire mempool are compared</span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> <span class="comment"># across all connections. (If outcome of final tx is specified as true</span></div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> <span class="comment"># or false, then only the last tx is tested against outcome.)</span></div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </div><div class="line"><a name="l00156"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestInstance.html"> 156</a></span> <span class="keyword">class </span><a class="code" href="classtest__framework_1_1comptool_1_1TestInstance.html">TestInstance</a>(object):</div><div class="line"><a name="l00157"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestInstance.html#aea360281b3db185119c73e53a7c48b1c"> 157</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestInstance.html#aea360281b3db185119c73e53a7c48b1c">__init__</a>(self, objects=None, sync_every_block=True, sync_every_tx=False):</div><div class="line"><a name="l00158"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestInstance.html#aae20ee58091e5d9e41557309ba829751"> 158</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestInstance.html#aae20ee58091e5d9e41557309ba829751">blocks_and_transactions</a> = objects <span class="keywordflow">if</span> objects <span class="keywordflow">else</span> []</div><div class="line"><a name="l00159"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestInstance.html#ab8c1cb163609b30ba48adde7c2dcc1bb"> 159</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestInstance.html#ab8c1cb163609b30ba48adde7c2dcc1bb">sync_every_block</a> = sync_every_block</div><div class="line"><a name="l00160"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestInstance.html#ab96024e6ba6c4f5b5f75719a6e5fff66"> 160</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestInstance.html#ab96024e6ba6c4f5b5f75719a6e5fff66">sync_every_tx</a> = sync_every_tx</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span> </div><div class="line"><a name="l00162"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html"> 162</a></span> <span class="keyword">class </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html">TestManager</a>(object):</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a87ca2875a1e1d28e8e73268ebc5b3f9e"> 164</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a87ca2875a1e1d28e8e73268ebc5b3f9e">__init__</a>(self, testgen, datadir):</div><div class="line"><a name="l00165"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a60383c5799ad6523fdd61aca1ba315f7"> 165</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a60383c5799ad6523fdd61aca1ba315f7">test_generator</a> = testgen</div><div class="line"><a name="l00166"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477"> 166</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> = []</div><div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a4eac6b253201fbcb032c3a766ada70f9"> 167</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a4eac6b253201fbcb032c3a766ada70f9">test_nodes</a> = []</div><div class="line"><a name="l00168"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a3b58a804295ecc3b0962e649b2087975"> 168</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3b58a804295ecc3b0962e649b2087975">block_store</a> = <a class="code" href="classtest__framework_1_1blockstore_1_1BlockStore.html">BlockStore</a>(datadir)</div><div class="line"><a name="l00169"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a1d409068adf708a56826fd5e919c9f2d"> 169</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a1d409068adf708a56826fd5e919c9f2d">tx_store</a> = <a class="code" href="classtest__framework_1_1blockstore_1_1TxStore.html">TxStore</a>(datadir)</div><div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a3bfbbc44f3fc69d0bdd8585a7c3acbc5"> 170</a></span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3bfbbc44f3fc69d0bdd8585a7c3acbc5">ping_counter</a> = 1</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> </div><div class="line"><a name="l00172"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a3751dddb9faf918403a3068ee0819213"> 172</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3751dddb9faf918403a3068ee0819213">add_all_connections</a>(self, nodes):</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">for</span> i <span class="keywordflow">in</span> range(len(nodes)):</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="comment"># Create a p2p connection to each node</span></div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  test_node = <a class="code" href="classtest__framework_1_1comptool_1_1TestNode.html">TestNode</a>(self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3b58a804295ecc3b0962e649b2087975">block_store</a>, self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a1d409068adf708a56826fd5e919c9f2d">tx_store</a>)</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a4eac6b253201fbcb032c3a766ada70f9">test_nodes</a>.append(test_node)</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a>.append(<a class="code" href="classtest__framework_1_1mininode_1_1NodeConn.html">NodeConn</a>(<span class="stringliteral">'127.0.0.1'</span>, <a class="code" href="namespacetest__framework_1_1util.html#a34ded7a772f1910f8137937a1fb81f86">p2p_port</a>(i), nodes[i], test_node))</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="comment"># Make sure the TestNode (callback class) has a reference to its</span></div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="comment"># associated NodeConn</span></div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  test_node.add_connection(self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a>[-1])</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> </div><div class="line"><a name="l00182"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a6e5ddb6310fbf53844ffa4a0a61e6cd9"> 182</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a6e5ddb6310fbf53844ffa4a0a61e6cd9">clear_all_connections</a>(self):</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> = []</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a4eac6b253201fbcb032c3a766ada70f9">test_nodes</a> = []</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> </div><div class="line"><a name="l00186"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a4f4cfe943e3c9aed37bf8517eff89dbb"> 186</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a4f4cfe943e3c9aed37bf8517eff89dbb">wait_for_disconnections</a>(self):</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keyword">def </span>disconnected():</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <span class="keywordflow">return</span> all(node.closed <span class="keywordflow">for</span> node <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a4eac6b253201fbcb032c3a766ada70f9">test_nodes</a>)</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetest__framework_1_1mininode.html#ab31a602d974f3680fa75698eb77dfec9">wait_until</a>(disconnected, timeout=10)</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> </div><div class="line"><a name="l00191"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a7f0696c68ffdf5db71741ca1e0500744"> 191</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a7f0696c68ffdf5db71741ca1e0500744">wait_for_verack</a>(self):</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keyword">def </span>veracked():</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">return</span> all(node.verack_received <span class="keywordflow">for</span> node <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a4eac6b253201fbcb032c3a766ada70f9">test_nodes</a>)</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetest__framework_1_1mininode.html#ab31a602d974f3680fa75698eb77dfec9">wait_until</a>(veracked, timeout=10)</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00196"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#ac443a326f56be90e9fdec6b80d966934"> 196</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#ac443a326f56be90e9fdec6b80d966934">wait_for_pings</a>(self, counter):</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="keyword">def </span>received_pongs():</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keywordflow">return</span> all(node.received_ping_response(counter) <span class="keywordflow">for</span> node <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a4eac6b253201fbcb032c3a766ada70f9">test_nodes</a>)</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <span class="keywordflow">return</span> <a class="code" href="namespacetest__framework_1_1mininode.html#ab31a602d974f3680fa75698eb77dfec9">wait_until</a>(received_pongs)</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> </div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="comment"># sync_blocks: Wait for all connections to request the blockhash given</span></div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <span class="comment"># then send get_headers to find out the tip of each node, and synchronize</span></div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="comment"># the response by using a ping (and waiting for pong with same nonce).</span></div><div class="line"><a name="l00204"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a3d70fd0795e8480ee6635b8132c2e9a9"> 204</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3d70fd0795e8480ee6635b8132c2e9a9">sync_blocks</a>(self, blockhash, num_blocks):</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keyword">def </span>blocks_requested():</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordflow">return</span> all(</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  blockhash <span class="keywordflow">in</span> node.block_request_map <span class="keywordflow">and</span> node.block_request_map[blockhash]</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="keywordflow">for</span> node <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a4eac6b253201fbcb032c3a766ada70f9">test_nodes</a></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  )</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> </div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="comment"># --> error if not requested</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordflow">if</span> <span class="keywordflow">not</span> <a class="code" href="namespacetest__framework_1_1mininode.html#ab31a602d974f3680fa75698eb77dfec9">wait_until</a>(blocks_requested, attempts=20*num_blocks):</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="comment"># print [ c.cb.block_request_map for c in self.connections ]</span></div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keywordflow">raise</span> AssertionError(<span class="stringliteral">"Not all nodes requested block"</span>)</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> </div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="comment"># Send getheaders message</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  [ c.cb.send_getheaders() <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> </div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="comment"># Send ping and wait for response -- synchronization hack</span></div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  [ c.cb.send_ping(self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3bfbbc44f3fc69d0bdd8585a7c3acbc5">ping_counter</a>) <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#ac443a326f56be90e9fdec6b80d966934">wait_for_pings</a>(self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3bfbbc44f3fc69d0bdd8585a7c3acbc5">ping_counter</a>)</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3bfbbc44f3fc69d0bdd8585a7c3acbc5">ping_counter</a> += 1</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span> </div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="comment"># Analogous to sync_block (see above)</span></div><div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a8a79287ac15e00feee879400fe76cd7e"> 225</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a8a79287ac15e00feee879400fe76cd7e">sync_transaction</a>(self, txhash, num_events):</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="comment"># Wait for nodes to request transaction (50ms sleep * 20 tries * num_events)</span></div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="keyword">def </span>transaction_requested():</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordflow">return</span> all(</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  txhash <span class="keywordflow">in</span> node.tx_request_map <span class="keywordflow">and</span> node.tx_request_map[txhash]</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordflow">for</span> node <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a4eac6b253201fbcb032c3a766ada70f9">test_nodes</a></div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  )</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> </div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="comment"># --> error if not requested</span></div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordflow">if</span> <span class="keywordflow">not</span> <a class="code" href="namespacetest__framework_1_1mininode.html#ab31a602d974f3680fa75698eb77dfec9">wait_until</a>(transaction_requested, attempts=20*num_events):</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="comment"># print [ c.cb.tx_request_map for c in self.connections ]</span></div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keywordflow">raise</span> AssertionError(<span class="stringliteral">"Not all nodes requested transaction"</span>)</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span> </div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="comment"># Get the mempool</span></div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  [ c.cb.send_mempool() <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> </div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="comment"># Send ping and wait for response -- synchronization hack</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  [ c.cb.send_ping(self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3bfbbc44f3fc69d0bdd8585a7c3acbc5">ping_counter</a>) <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#ac443a326f56be90e9fdec6b80d966934">wait_for_pings</a>(self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3bfbbc44f3fc69d0bdd8585a7c3acbc5">ping_counter</a>)</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3bfbbc44f3fc69d0bdd8585a7c3acbc5">ping_counter</a> += 1</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span> </div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="comment"># Sort inv responses from each node</span></div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  with mininode_lock:</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  [ c.cb.lastInv.sort() <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> </div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="comment"># Verify that the tip of each connection all agree with each other, and</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  <span class="comment"># with the expected outcome (if given)</span></div><div class="line"><a name="l00252"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#ad07b854e96fc40f569f006831be674b6"> 252</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#ad07b854e96fc40f569f006831be674b6">check_results</a>(self, blockhash, outcome):</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  with mininode_lock:</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a>:</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="keywordflow">if</span> outcome <span class="keywordflow">is</span> <span class="keywordtype">None</span>:</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">if</span> c.cb.bestblockhash != self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a>[0].cb.bestblockhash:</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <span class="keywordflow">elif</span> isinstance(outcome, RejectResult): <span class="comment"># Check that block was rejected w/ code</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordflow">if</span> c.cb.bestblockhash == blockhash:</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordflow">if</span> blockhash <span class="keywordflow">not</span> <span class="keywordflow">in</span> c.cb.block_reject_map:</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="keywordflow">print</span> <span class="stringliteral">'Block not in reject map: %064x'</span> % (blockhash)</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keywordflow">if</span> <span class="keywordflow">not</span> outcome.match(c.cb.block_reject_map[blockhash]):</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">print</span> <span class="stringliteral">'Block rejected with %s instead of expected %s: %064x'</span> % (c.cb.block_reject_map[blockhash], outcome, blockhash)</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keywordflow">elif</span> ((c.cb.bestblockhash == blockhash) != outcome):</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="comment"># print c.cb.bestblockhash, blockhash, outcome</span></div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordflow">return</span> <span class="keyword">True</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span> </div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="comment"># Either check that the mempools all agree with each other, or that</span></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="comment"># txhash's presence in the mempool matches the outcome specified.</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="comment"># This is somewhat of a strange comparison, in that we're either comparing</span></div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="comment"># a particular tx to an outcome, or the entire mempools altogether;</span></div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="comment"># perhaps it would be useful to add the ability to check explicitly that</span></div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="comment"># a particular tx's existence in the mempool is the same across all nodes.</span></div><div class="line"><a name="l00278"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a3f30cbec7c486e3553d8c94ab9761245"> 278</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3f30cbec7c486e3553d8c94ab9761245">check_mempool</a>(self, txhash, outcome):</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  with mininode_lock:</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a>:</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="keywordflow">if</span> outcome <span class="keywordflow">is</span> <span class="keywordtype">None</span>:</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="comment"># Make sure the mempools agree with each other</span></div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <span class="keywordflow">if</span> c.cb.lastInv != self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a>[0].cb.lastInv:</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="comment"># print c.rpc.getrawmempool()</span></div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="keywordflow">elif</span> isinstance(outcome, RejectResult): <span class="comment"># Check that tx was rejected w/ code</span></div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="keywordflow">if</span> txhash <span class="keywordflow">in</span> c.cb.lastInv:</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">if</span> txhash <span class="keywordflow">not</span> <span class="keywordflow">in</span> c.cb.tx_reject_map:</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keywordflow">print</span> <span class="stringliteral">'Tx not in reject map: %064x'</span> % (txhash)</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keywordflow">if</span> <span class="keywordflow">not</span> outcome.match(c.cb.tx_reject_map[txhash]):</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="keywordflow">print</span> <span class="stringliteral">'Tx rejected with %s instead of expected %s: %064x'</span> % (c.cb.tx_reject_map[txhash], outcome, txhash)</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  <span class="keywordflow">elif</span> ((txhash <span class="keywordflow">in</span> c.cb.lastInv) != outcome):</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="comment"># print c.rpc.getrawmempool(), c.cb.lastInv</span></div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="keywordflow">return</span> <span class="keyword">False</span></div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="keywordflow">return</span> <span class="keyword">True</span></div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> </div><div class="line"><a name="l00300"></a><span class="lineno"><a class="line" href="classtest__framework_1_1comptool_1_1TestManager.html#a7865e3ef864fa0a4a52526b03322bb8f"> 300</a></span>  <span class="keyword">def </span><a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a7865e3ef864fa0a4a52526b03322bb8f">run</a>(self):</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="comment"># Wait until verack is received</span></div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a7f0696c68ffdf5db71741ca1e0500744">wait_for_verack</a>()</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span> </div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  test_number = 1</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <span class="keywordflow">for</span> test_instance <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a60383c5799ad6523fdd61aca1ba315f7">test_generator</a>.get_tests():</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="comment"># We use these variables to keep track of the last block</span></div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="comment"># and last transaction in the tests, which are used</span></div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="comment"># if we're not syncing on every block or every tx.</span></div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  [ block, block_outcome, tip ] = [ <span class="keywordtype">None</span>, <span class="keywordtype">None</span>, <span class="keywordtype">None</span> ]</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  [ tx, tx_outcome ] = [ <span class="keywordtype">None</span>, <span class="keywordtype">None</span> ]</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  invqueue = []</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span> </div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <span class="keywordflow">for</span> test_obj <span class="keywordflow">in</span> test_instance.blocks_and_transactions:</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  b_or_t = test_obj[0]</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  outcome = test_obj[1]</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="comment"># Determine if we're dealing with a block or tx</span></div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordflow">if</span> isinstance(b_or_t, CBlock): <span class="comment"># Block test runner</span></div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  block = b_or_t</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  block_outcome = outcome</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  tip = block.sha256</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <span class="comment"># each test_obj can have an optional third argument</span></div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="comment"># to specify the tip we should compare with</span></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="comment"># (default is to use the block being tested)</span></div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <span class="keywordflow">if</span> len(test_obj) >= 3:</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  tip = test_obj[2]</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> </div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="comment"># Add to shared block_store, set as current block</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="comment"># If there was an open getdata request for the block</span></div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  <span class="comment"># previously, and we didn't have an entry in the</span></div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <span class="comment"># block_store, then immediately deliver, because the</span></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="comment"># node wouldn't send another getdata request while</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="comment"># the earlier one is outstanding.</span></div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  first_block_with_hash = <span class="keyword">True</span></div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="keywordflow">if</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3b58a804295ecc3b0962e649b2087975">block_store</a>.get(block.sha256) <span class="keywordflow">is</span> <span class="keywordflow">not</span> <span class="keywordtype">None</span>:</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  first_block_with_hash = <span class="keyword">False</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  with mininode_lock:</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3b58a804295ecc3b0962e649b2087975">block_store</a>.add_block(block)</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a>:</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">if</span> first_block_with_hash <span class="keywordflow">and</span> block.sha256 <span class="keywordflow">in</span> c.cb.block_request_map <span class="keywordflow">and</span> c.cb.block_request_map[block.sha256] == <span class="keyword">True</span>:</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="comment"># There was a previous request for this block hash</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="comment"># Most likely, we delivered a header for this block</span></div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  <span class="comment"># but never had the block to respond to the getdata</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  c.send_message(<a class="code" href="classtest__framework_1_1mininode_1_1msg__block.html">msg_block</a>(block))</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <span class="keywordflow">else</span>:</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  c.cb.block_request_map[block.sha256] = <span class="keyword">False</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="comment"># Either send inv's to each node and sync, or add</span></div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="comment"># to invqueue for later inv'ing.</span></div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="keywordflow">if</span> (test_instance.sync_every_block):</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  [ c.cb.send_inv(block) <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3d70fd0795e8480ee6635b8132c2e9a9">sync_blocks</a>(block.sha256, 1)</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="keywordflow">if</span> (<span class="keywordflow">not</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#ad07b854e96fc40f569f006831be674b6">check_results</a>(tip, outcome)):</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="keywordflow">raise</span> AssertionError(<span class="stringliteral">"Test failed at test %d"</span> % test_number)</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="keywordflow">else</span>:</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  invqueue.append(<a class="code" href="classtest__framework_1_1mininode_1_1CInv.html">CInv</a>(2, block.sha256))</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <span class="keywordflow">elif</span> isinstance(b_or_t, CBlockHeader):</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  block_header = b_or_t</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3b58a804295ecc3b0962e649b2087975">block_store</a>.add_header(block_header)</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keywordflow">else</span>: <span class="comment"># Tx test runner</span></div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  assert(isinstance(b_or_t, CTransaction))</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  tx = b_or_t</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  tx_outcome = outcome</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="comment"># Add to shared tx store and clear map entry</span></div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  with mininode_lock:</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a1d409068adf708a56826fd5e919c9f2d">tx_store</a>.add_transaction(tx)</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a>:</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  c.cb.tx_request_map[tx.sha256] = <span class="keyword">False</span></div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="comment"># Again, either inv to all nodes or save for later</span></div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordflow">if</span> (test_instance.sync_every_tx):</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  [ c.cb.send_inv(tx) <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a8a79287ac15e00feee879400fe76cd7e">sync_transaction</a>(tx.sha256, 1)</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="keywordflow">if</span> (<span class="keywordflow">not</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3f30cbec7c486e3553d8c94ab9761245">check_mempool</a>(tx.sha256, outcome)):</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <span class="keywordflow">raise</span> AssertionError(<span class="stringliteral">"Test failed at test %d"</span> % test_number)</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <span class="keywordflow">else</span>:</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  invqueue.append(<a class="code" href="classtest__framework_1_1mininode_1_1CInv.html">CInv</a>(1, tx.sha256))</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="comment"># Ensure we're not overflowing the inv queue</span></div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keywordflow">if</span> len(invqueue) == MAX_INV_SZ:</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  [ c.send_message(<a class="code" href="classtest__framework_1_1mininode_1_1msg__inv.html">msg_inv</a>(invqueue)) <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  invqueue = []</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> </div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="comment"># Do final sync if we weren't syncing on every block or every tx.</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <span class="keywordflow">if</span> (<span class="keywordflow">not</span> test_instance.sync_every_block <span class="keywordflow">and</span> block <span class="keywordflow">is</span> <span class="keywordflow">not</span> <span class="keywordtype">None</span>):</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <span class="keywordflow">if</span> len(invqueue) > 0:</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  [ c.send_message(<a class="code" href="classtest__framework_1_1mininode_1_1msg__inv.html">msg_inv</a>(invqueue)) <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  invqueue = []</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3d70fd0795e8480ee6635b8132c2e9a9">sync_blocks</a>(block.sha256, len(test_instance.blocks_and_transactions))</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="keywordflow">if</span> (<span class="keywordflow">not</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#ad07b854e96fc40f569f006831be674b6">check_results</a>(tip, block_outcome)):</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keywordflow">raise</span> AssertionError(<span class="stringliteral">"Block test failed at test %d"</span> % test_number)</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keywordflow">if</span> (<span class="keywordflow">not</span> test_instance.sync_every_tx <span class="keywordflow">and</span> tx <span class="keywordflow">is</span> <span class="keywordflow">not</span> <span class="keywordtype">None</span>):</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <span class="keywordflow">if</span> len(invqueue) > 0:</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  [ c.send_message(<a class="code" href="classtest__framework_1_1mininode_1_1msg__inv.html">msg_inv</a>(invqueue)) <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  invqueue = []</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a8a79287ac15e00feee879400fe76cd7e">sync_transaction</a>(tx.sha256, len(test_instance.blocks_and_transactions))</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordflow">if</span> (<span class="keywordflow">not</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3f30cbec7c486e3553d8c94ab9761245">check_mempool</a>(tx.sha256, tx_outcome)):</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keywordflow">raise</span> AssertionError(<span class="stringliteral">"Mempool test failed at test %d"</span> % test_number)</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> </div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordflow">print</span> <span class="stringliteral">"Test %d: PASS"</span> % test_number, [ c.rpc.getblockcount() <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  test_number += 1</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> </div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  [ c.disconnect_node() <span class="keywordflow">for</span> c <span class="keywordflow">in</span> self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">connections</a> ]</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a4f4cfe943e3c9aed37bf8517eff89dbb">wait_for_disconnections</a>()</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a3b58a804295ecc3b0962e649b2087975">block_store</a>.close()</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  self.<a class="code" href="classtest__framework_1_1comptool_1_1TestManager.html#a1d409068adf708a56826fd5e919c9f2d">tx_store</a>.close()</div><div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a7865e3ef864fa0a4a52526b03322bb8f"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a7865e3ef864fa0a4a52526b03322bb8f">test_framework.comptool.TestManager.run</a></div><div class="ttdeci">def run(self)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00300">comptool.py:300</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a87ca2875a1e1d28e8e73268ebc5b3f9e"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a87ca2875a1e1d28e8e73268ebc5b3f9e">test_framework.comptool.TestManager.__init__</a></div><div class="ttdeci">def __init__(self, testgen, datadir)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00164">comptool.py:164</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a60383c5799ad6523fdd61aca1ba315f7"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a60383c5799ad6523fdd61aca1ba315f7">test_framework.comptool.TestManager.test_generator</a></div><div class="ttdeci">test_generator</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00165">comptool.py:165</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a41837ee3241c15535fbc1891b7d50525"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a41837ee3241c15535fbc1891b7d50525">test_framework.comptool.TestNode.block_store</a></div><div class="ttdeci">block_store</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00050">comptool.py:50</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_ae89ea4d3b51c34206b07de0aa2a8b7b0"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#ae89ea4d3b51c34206b07de0aa2a8b7b0">test_framework.comptool.TestNode.pingMap</a></div><div class="ttdeci">pingMap</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00059">comptool.py:59</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_ada9c0551b5b98546772eecd0d0d9edcb"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#ada9c0551b5b98546772eecd0d0d9edcb">test_framework.comptool.TestNode.bestblockhash</a></div><div class="ttdeci">bestblockhash</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00049">comptool.py:49</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1mininode_1_1CInv_html"><div class="ttname"><a href="classtest__framework_1_1mininode_1_1CInv.html">test_framework.mininode.CInv</a></div><div class="ttdef"><b>Definition:</b> <a href="mininode_8py_source.html#l00278">mininode.py:278</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1mininode_1_1msg__mempool_html"><div class="ttname"><a href="classtest__framework_1_1mininode_1_1msg__mempool.html">test_framework.mininode.msg_mempool</a></div><div class="ttdef"><b>Definition:</b> <a href="mininode_8py_source.html#l00909">mininode.py:909</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestInstance_html_aea360281b3db185119c73e53a7c48b1c"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestInstance.html#aea360281b3db185119c73e53a7c48b1c">test_framework.comptool.TestInstance.__init__</a></div><div class="ttdeci">def __init__(self, objects=None, sync_every_block=True, sync_every_tx=False)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00157">comptool.py:157</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a4eac6b253201fbcb032c3a766ada70f9"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a4eac6b253201fbcb032c3a766ada70f9">test_framework.comptool.TestManager.test_nodes</a></div><div class="ttdeci">test_nodes</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00167">comptool.py:167</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a32afb3300f4ba7d3dd6b9abe7cbad092"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a32afb3300f4ba7d3dd6b9abe7cbad092">test_framework.comptool.TestNode.conn</a></div><div class="ttdeci">conn</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00048">comptool.py:48</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a3bfbbc44f3fc69d0bdd8585a7c3acbc5"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a3bfbbc44f3fc69d0bdd8585a7c3acbc5">test_framework.comptool.TestManager.ping_counter</a></div><div class="ttdeci">ping_counter</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00170">comptool.py:170</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a6a07a61fe3c683a5b0074d95f9b86d7a"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a6a07a61fe3c683a5b0074d95f9b86d7a">test_framework.comptool.TestNode.on_pong</a></div><div class="ttdeci">def on_pong(self, conn, message)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00093">comptool.py:93</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a1d409068adf708a56826fd5e919c9f2d"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a1d409068adf708a56826fd5e919c9f2d">test_framework.comptool.TestManager.tx_store</a></div><div class="ttdeci">tx_store</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00169">comptool.py:169</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1RejectResult_html_a5b696ee693bd074cc59e6b42fc4dd82b"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1RejectResult.html#a5b696ee693bd074cc59e6b42fc4dd82b">test_framework.comptool.RejectResult.__repr__</a></div><div class="ttdeci">def __repr__(self)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00041">comptool.py:41</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_af10ebbc8c0f0eaa0f0af459334f0b682"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#af10ebbc8c0f0eaa0f0af459334f0b682">test_framework.comptool.TestNode.block_reject_map</a></div><div class="ttdeci">block_reject_map</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00054">comptool.py:54</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1blockstore_1_1BlockStore_html"><div class="ttname"><a href="classtest__framework_1_1blockstore_1_1BlockStore.html">test_framework.blockstore.BlockStore</a></div><div class="ttdef"><b>Definition:</b> <a href="blockstore_8py_source.html#l00010">blockstore.py:10</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1RejectResult_html_ad4627d616a43a531702f4b6115771a95"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1RejectResult.html#ad4627d616a43a531702f4b6115771a95">test_framework.comptool.RejectResult.reason</a></div><div class="ttdeci">reason</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00036">comptool.py:36</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1mininode_1_1msg__ping_html"><div class="ttname"><a href="classtest__framework_1_1mininode_1_1msg__ping.html">test_framework.mininode.msg_ping</a></div><div class="ttdef"><b>Definition:</b> <a href="mininode_8py_source.html#l00873">mininode.py:873</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1RejectResult_html_a0dd8c5fedfd6396fd096edfaf7f53205"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1RejectResult.html#a0dd8c5fedfd6396fd096edfaf7f53205">test_framework.comptool.RejectResult.code</a></div><div class="ttdeci">code</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00035">comptool.py:35</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1RejectResult_html_a9b7edc47973288c6239ebeb872a3a111"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1RejectResult.html#a9b7edc47973288c6239ebeb872a3a111">test_framework.comptool.RejectResult.__init__</a></div><div class="ttdeci">def __init__(self, code, reason=b'')</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00034">comptool.py:34</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a3c59b27f18b5ef9814a339709834ef88"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a3c59b27f18b5ef9814a339709834ef88">test_framework.comptool.TestNode.closed</a></div><div class="ttdeci">closed</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00061">comptool.py:61</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a67e7d56b5ae0f6b723e133727a348709"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a67e7d56b5ae0f6b723e133727a348709">test_framework.comptool.TestNode.send_ping</a></div><div class="ttdeci">def send_ping(self, nonce)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00116">comptool.py:116</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestInstance_html_ab96024e6ba6c4f5b5f75719a6e5fff66"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestInstance.html#ab96024e6ba6c4f5b5f75719a6e5fff66">test_framework.comptool.TestInstance.sync_every_tx</a></div><div class="ttdeci">sync_every_tx</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00160">comptool.py:160</a></div></div>
|
|
<div class="ttc" id="namespacetest__framework_1_1mininode_html_ab31a602d974f3680fa75698eb77dfec9"><div class="ttname"><a href="namespacetest__framework_1_1mininode.html#ab31a602d974f3680fa75698eb77dfec9">test_framework.mininode.wait_until</a></div><div class="ttdeci">def wait_until(predicate, attempts=float('inf'), timeout=float('inf'))</div><div class="ttdef"><b>Definition:</b> <a href="mininode_8py_source.html#l01020">mininode.py:1020</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a37398b9cc9fd8c821a6b202f2b3acb72"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a37398b9cc9fd8c821a6b202f2b3acb72">test_framework.comptool.TestNode.tx_reject_map</a></div><div class="ttdeci">tx_reject_map</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00055">comptool.py:55</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a4f4cfe943e3c9aed37bf8517eff89dbb"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a4f4cfe943e3c9aed37bf8517eff89dbb">test_framework.comptool.TestManager.wait_for_disconnections</a></div><div class="ttdeci">def wait_for_disconnections(self)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00186">comptool.py:186</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_ac3fa58de54f107569930a64843ee5373"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#ac3fa58de54f107569930a64843ee5373">test_framework.comptool.TestNode.block_request_map</a></div><div class="ttdeci">block_request_map</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00051">comptool.py:51</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a8a79287ac15e00feee879400fe76cd7e"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a8a79287ac15e00feee879400fe76cd7e">test_framework.comptool.TestManager.sync_transaction</a></div><div class="ttdeci">def sync_transaction(self, txhash, num_events)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00225">comptool.py:225</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a3751dddb9faf918403a3068ee0819213"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a3751dddb9faf918403a3068ee0819213">test_framework.comptool.TestManager.add_all_connections</a></div><div class="ttdeci">def add_all_connections(self, nodes)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00172">comptool.py:172</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a3b58a804295ecc3b0962e649b2087975"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a3b58a804295ecc3b0962e649b2087975">test_framework.comptool.TestManager.block_store</a></div><div class="ttdeci">block_store</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00168">comptool.py:168</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a33e1cd9b56327a92d1ff3a283a48f9ae"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a33e1cd9b56327a92d1ff3a283a48f9ae">test_framework.comptool.TestNode.tx_store</a></div><div class="ttdeci">tx_store</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00052">comptool.py:52</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestInstance_html_aae20ee58091e5d9e41557309ba829751"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestInstance.html#aae20ee58091e5d9e41557309ba829751">test_framework.comptool.TestInstance.blocks_and_transactions</a></div><div class="ttdeci">blocks_and_transactions</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00158">comptool.py:158</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a35ec77161bb338c7bf00a7d16e28a477"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a35ec77161bb338c7bf00a7d16e28a477">test_framework.comptool.TestManager.connections</a></div><div class="ttdeci">connections</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00166">comptool.py:166</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1mininode_1_1msg__inv_html"><div class="ttname"><a href="classtest__framework_1_1mininode_1_1msg__inv.html">test_framework.mininode.msg_inv</a></div><div class="ttdef"><b>Definition:</b> <a href="mininode_8py_source.html#l00748">mininode.py:748</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_adf82006f0f145589d881a446f49a7af7"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#adf82006f0f145589d881a446f49a7af7">test_framework.comptool.TestNode.on_reject</a></div><div class="ttdeci">def on_reject(self, conn, message)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00099">comptool.py:99</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1mininode_1_1NodeConn_html"><div class="ttname"><a href="classtest__framework_1_1mininode_1_1NodeConn.html">test_framework.mininode.NodeConn</a></div><div class="ttdef"><b>Definition:</b> <a href="mininode_8py_source.html#l01139">mininode.py:1139</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a7f0696c68ffdf5db71741ca1e0500744"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a7f0696c68ffdf5db71741ca1e0500744">test_framework.comptool.TestManager.wait_for_verack</a></div><div class="ttdeci">def wait_for_verack(self)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00191">comptool.py:191</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_acd31f41f37b4458d41f3efa97c744479"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#acd31f41f37b4458d41f3efa97c744479">test_framework.comptool.TestNode.on_headers</a></div><div class="ttdeci">def on_headers(self, conn, message)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00069">comptool.py:69</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_ad07b854e96fc40f569f006831be674b6"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#ad07b854e96fc40f569f006831be674b6">test_framework.comptool.TestManager.check_results</a></div><div class="ttdeci">def check_results(self, blockhash, outcome)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00252">comptool.py:252</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_ac443a326f56be90e9fdec6b80d966934"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#ac443a326f56be90e9fdec6b80d966934">test_framework.comptool.TestManager.wait_for_pings</a></div><div class="ttdeci">def wait_for_pings(self, counter)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00196">comptool.py:196</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_af4c6646b94834ca76f6b49e1d6000973"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#af4c6646b94834ca76f6b49e1d6000973">test_framework.comptool.TestNode.send_inv</a></div><div class="ttdeci">def send_inv(self, obj)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00105">comptool.py:105</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a5815b74f81f163d3d430a6166c1c5b8e"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a5815b74f81f163d3d430a6166c1c5b8e">test_framework.comptool.TestNode.send_getheaders</a></div><div class="ttdeci">def send_getheaders(self)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00109">comptool.py:109</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_ae7aabbff3a47105cd354c25fe6c2e92e"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#ae7aabbff3a47105cd354c25fe6c2e92e">test_framework.comptool.TestNode.on_inv</a></div><div class="ttdeci">def on_inv(self, conn, message)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00090">comptool.py:90</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1mininode_1_1NodeConnCB_html"><div class="ttname"><a href="classtest__framework_1_1mininode_1_1NodeConnCB.html">test_framework.mininode.NodeConnCB</a></div><div class="ttdef"><b>Definition:</b> <a href="mininode_8py_source.html#l01036">mininode.py:1036</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html">test_framework.comptool.TestManager</a></div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00162">comptool.py:162</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1RejectResult_html_a1d42c4f510937c54af6348d2b7f0522b"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1RejectResult.html#a1d42c4f510937c54af6348d2b7f0522b">test_framework.comptool.RejectResult.match</a></div><div class="ttdeci">def match(self, other)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00037">comptool.py:37</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1blockstore_1_1TxStore_html"><div class="ttname"><a href="classtest__framework_1_1blockstore_1_1TxStore.html">test_framework.blockstore.TxStore</a></div><div class="ttdef"><b>Definition:</b> <a href="blockstore_8py_source.html#l00106">blockstore.py:106</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a6205eb45bb709604bf35692a3aba91f5"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a6205eb45bb709604bf35692a3aba91f5">test_framework.comptool.TestNode.on_getheaders</a></div><div class="ttdeci">def on_getheaders(self, conn, message)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00075">comptool.py:75</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestInstance_html"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestInstance.html">test_framework.comptool.TestInstance</a></div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00156">comptool.py:156</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_ad6b043836a1b6b9ed982fcefbfd63657"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#ad6b043836a1b6b9ed982fcefbfd63657">test_framework.comptool.TestNode.add_connection</a></div><div class="ttdeci">def add_connection(self, conn)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00066">comptool.py:66</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_acb14d94e65391ada499cf2de515da785"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#acb14d94e65391ada499cf2de515da785">test_framework.comptool.TestNode.on_close</a></div><div class="ttdeci">def on_close(self, conn)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00063">comptool.py:63</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a5e350a39570565fe7a4d7a5024dd9997"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a5e350a39570565fe7a4d7a5024dd9997">test_framework.comptool.TestNode.send_mempool</a></div><div class="ttdeci">def send_mempool(self)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00123">comptool.py:123</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a3d70fd0795e8480ee6635b8132c2e9a9"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a3d70fd0795e8480ee6635b8132c2e9a9">test_framework.comptool.TestManager.sync_blocks</a></div><div class="ttdeci">def sync_blocks(self, blockhash, num_blocks)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00204">comptool.py:204</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html">test_framework.comptool.TestNode</a></div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00044">comptool.py:44</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a3f30cbec7c486e3553d8c94ab9761245"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a3f30cbec7c486e3553d8c94ab9761245">test_framework.comptool.TestManager.check_mempool</a></div><div class="ttdeci">def check_mempool(self, txhash, outcome)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00278">comptool.py:278</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1RejectResult_html"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1RejectResult.html">test_framework.comptool.RejectResult</a></div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00030">comptool.py:30</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a84630257ff564a0c187e6549e6f0b6ea"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a84630257ff564a0c187e6549e6f0b6ea">test_framework.comptool.TestNode.tx_request_map</a></div><div class="ttdeci">tx_request_map</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00053">comptool.py:53</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_a48d23cf0613862933b9c6207eef58a80"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#a48d23cf0613862933b9c6207eef58a80">test_framework.comptool.TestNode.on_getdata</a></div><div class="ttdeci">def on_getdata(self, conn, message)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00080">comptool.py:80</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestManager_html_a6e5ddb6310fbf53844ffa4a0a61e6cd9"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestManager.html#a6e5ddb6310fbf53844ffa4a0a61e6cd9">test_framework.comptool.TestManager.clear_all_connections</a></div><div class="ttdeci">def clear_all_connections(self)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00182">comptool.py:182</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestInstance_html_ab8c1cb163609b30ba48adde7c2dcc1bb"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestInstance.html#ab8c1cb163609b30ba48adde7c2dcc1bb">test_framework.comptool.TestInstance.sync_every_block</a></div><div class="ttdeci">sync_every_block</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00159">comptool.py:159</a></div></div>
|
|
<div class="ttc" id="namespacetest__framework_1_1util_html_a34ded7a772f1910f8137937a1fb81f86"><div class="ttname"><a href="namespacetest__framework_1_1util.html#a34ded7a772f1910f8137937a1fb81f86">test_framework.util.p2p_port</a></div><div class="ttdeci">def p2p_port(n)</div><div class="ttdef"><b>Definition:</b> <a href="util_8py_source.html#l00093">util.py:93</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_ac48ca37d31a530917d73bc6b478a1146"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#ac48ca37d31a530917d73bc6b478a1146">test_framework.comptool.TestNode.received_ping_response</a></div><div class="ttdeci">def received_ping_response(self, nonce)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00120">comptool.py:120</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_ade52954c0f1d513c3629e643df9e42b8"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#ade52954c0f1d513c3629e643df9e42b8">test_framework.comptool.TestNode.lastInv</a></div><div class="ttdeci">lastInv</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00060">comptool.py:60</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1mininode_1_1msg__getheaders_html"><div class="ttname"><a href="classtest__framework_1_1mininode_1_1msg__getheaders.html">test_framework.mininode.msg_getheaders</a></div><div class="ttdef"><b>Definition:</b> <a href="mininode_8py_source.html#l00943">mininode.py:943</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1mininode_1_1msg__block_html"><div class="ttname"><a href="classtest__framework_1_1mininode_1_1msg__block.html">test_framework.mininode.msg_block</a></div><div class="ttdef"><b>Definition:</b> <a href="mininode_8py_source.html#l00822">mininode.py:822</a></div></div>
|
|
<div class="ttc" id="classtest__framework_1_1comptool_1_1TestNode_html_ad2ebc867660c3d12f0537de4f9457d2e"><div class="ttname"><a href="classtest__framework_1_1comptool_1_1TestNode.html#ad2ebc867660c3d12f0537de4f9457d2e">test_framework.comptool.TestNode.__init__</a></div><div class="ttdeci">def __init__(self, block_store, tx_store)</div><div class="ttdef"><b>Definition:</b> <a href="comptool_8py_source.html#l00046">comptool.py:46</a></div></div>
|
|
</div><!-- fragment --></div><!-- contents -->
|
|
</div><!-- doc-content -->
|
|
<!-- start footer part -->
|
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
|
<ul>
|
|
<li class="navelem"><a class="el" href="dir_62ba24d7ce8eecc59962fe5b590c1065.html">qa</a></li><li class="navelem"><a class="el" href="dir_dbddb259b29a77ea11562b7a380aa303.html">rpc-tests</a></li><li class="navelem"><a class="el" href="dir_0f1fd91d0d18a547184c924770390b91.html">test_framework</a></li><li class="navelem"><a class="el" href="comptool_8py.html">comptool.py</a></li>
|
|
<li class="footer">Generated on Thu Dec 14 2017 13:15:02 for Dash Core by
|
|
<a href="http://www.doxygen.org/index.html">
|
|
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|