Files
python/docs/meshtastic/tests/test_smoke1.html
2021-12-16 13:57:42 -05:00

1822 lines
90 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>meshtastic.tests.test_smoke1 API documentation</title>
<meta name="description" content="Meshtastic smoke tests with a single device via USB" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>meshtastic.tests.test_smoke1</code></h1>
</header>
<section id="section-intro">
<p>Meshtastic smoke tests with a single device via USB</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#34;&#34;&#34;Meshtastic smoke tests with a single device via USB&#34;&#34;&#34;
import re
import subprocess
import time
import os
# Do not like using hard coded sleeps, but it probably makes
# sense to pause for the radio at apprpriate times
import pytest
from ..util import findPorts
# seconds to pause after running a meshtastic command
PAUSE_AFTER_COMMAND = 2
PAUSE_AFTER_REBOOT = 7
@pytest.mark.smoke1
def test_smoke1_reboot():
&#34;&#34;&#34;Test reboot&#34;&#34;&#34;
return_value, _ = subprocess.getstatusoutput(&#39;meshtastic --reboot&#39;)
assert return_value == 0
# pause for the radio to reset (10 seconds for the pause, and a few more seconds to be back up)
time.sleep(18)
@pytest.mark.smoke1
def test_smoke1_info():
&#34;&#34;&#34;Test --info&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Owner&#39;, out, re.MULTILINE)
assert re.search(r&#39;^My info&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Nodes in mesh&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Preferences&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Channels&#39;, out, re.MULTILINE)
assert re.search(r&#39;^ PRIMARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Primary channel URL&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_sendping():
&#34;&#34;&#34;Test --sendping&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --sendping&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Sending ping message&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_get_with_invalid_setting():
&#34;&#34;&#34;Test &#39;--get a_bad_setting&#39;.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --get a_bad_setting&#39;)
assert re.search(r&#39;Choices in sorted order&#39;, out)
assert return_value == 0
@pytest.mark.smoke1
def test_set_with_invalid_setting():
&#34;&#34;&#34;Test &#39;--set a_bad_setting&#39;.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set a_bad_setting foo&#39;)
assert re.search(r&#39;Choices in sorted order&#39;, out)
assert return_value == 0
@pytest.mark.smoke1
def test_ch_set_with_invalid_settingpatch_find_ports():
&#34;&#34;&#34;Test &#39;--ch-set with a_bad_setting&#39;.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set invalid_setting foo --ch-index 0&#39;)
assert re.search(r&#39;Choices in sorted order&#39;, out)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_pos_fields():
&#34;&#34;&#34;Test --pos-fields (with some values POS_ALTITUDE POS_ALT_MSL POS_BATTERY)&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --pos-fields POS_ALTITUDE POS_ALT_MSL POS_BATTERY&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Setting position fields to 35&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --pos-fields&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;POS_ALTITUDE&#39;, out, re.MULTILINE)
assert re.search(r&#39;POS_ALT_MSL&#39;, out, re.MULTILINE)
assert re.search(r&#39;POS_BATTERY&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_test_with_arg_but_no_hardware():
&#34;&#34;&#34;Test --test
Note: Since only one device is connected, it will not do much.
&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --test&#39;)
assert re.search(r&#39;^Warning: Must have at least two devices&#39;, out, re.MULTILINE)
assert return_value == 1
@pytest.mark.smoke1
def test_smoke1_debug():
&#34;&#34;&#34;Test --debug&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info --debug&#39;)
assert re.search(r&#39;^Owner&#39;, out, re.MULTILINE)
assert re.search(r&#39;^DEBUG:root&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_seriallog_to_file():
&#34;&#34;&#34;Test --seriallog to a file creates a file&#34;&#34;&#34;
filename = &#39;tmpoutput.txt&#39;
if os.path.exists(f&#34;{filename}&#34;):
os.remove(f&#34;{filename}&#34;)
return_value, _ = subprocess.getstatusoutput(f&#39;meshtastic --info --seriallog {filename}&#39;)
assert os.path.exists(f&#34;{filename}&#34;)
assert return_value == 0
os.remove(f&#34;{filename}&#34;)
@pytest.mark.smoke1
def test_smoke1_qr():
&#34;&#34;&#34;Test --qr&#34;&#34;&#34;
filename = &#39;tmpqr&#39;
if os.path.exists(f&#34;{filename}&#34;):
os.remove(f&#34;{filename}&#34;)
return_value, _ = subprocess.getstatusoutput(f&#39;meshtastic --qr &gt; {filename}&#39;)
assert os.path.exists(f&#34;{filename}&#34;)
# not really testing that a valid qr code is created, just that the file size
# is reasonably big enough for a qr code
assert os.stat(f&#34;{filename}&#34;).st_size &gt; 20000
assert return_value == 0
os.remove(f&#34;{filename}&#34;)
@pytest.mark.smoke1
def test_smoke1_nodes():
&#34;&#34;&#34;Test --nodes&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --nodes&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^│ N │ User&#39;, out, re.MULTILINE)
assert re.search(r&#39;^│ 1 │&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_send_hello():
&#34;&#34;&#34;Test --sendtext hello&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --sendtext hello&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Sending text message hello to \^all&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_port():
&#34;&#34;&#34;Test --port&#34;&#34;&#34;
# first, get the ports
ports = findPorts()
# hopefully there is just one
assert len(ports) == 1
port = ports[0]
return_value, out = subprocess.getstatusoutput(f&#39;meshtastic --port {port} --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Owner&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_set_is_router_true():
&#34;&#34;&#34;Test --set is_router true&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set is_router true&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set is_router to true&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --get is_router&#39;)
assert re.search(r&#39;^is_router: True&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_set_location_info():
&#34;&#34;&#34;Test --setlat, --setlon and --setalt &#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --setlat 32.7767 --setlon -96.7970 --setalt 1337&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Fixing altitude&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Fixing latitude&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Fixing longitude&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out2 = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;1337&#39;, out2, re.MULTILINE)
assert re.search(r&#39;32.7767&#39;, out2, re.MULTILINE)
assert re.search(r&#39;-96.797&#39;, out2, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_set_is_router_false():
&#34;&#34;&#34;Test --set is_router false&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set is_router false&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set is_router to false&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --get is_router&#39;)
assert re.search(r&#39;^is_router: False&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_set_owner():
&#34;&#34;&#34;Test --set-owner name&#34;&#34;&#34;
# make sure the owner is not Joe
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set-owner Bob&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Setting device owner to Bob&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert not re.search(r&#39;Owner: Joe&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set-owner Joe&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Setting device owner to Joe&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;Owner: Joe&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_set_team():
&#34;&#34;&#34;Test --set-team &#34;&#34;&#34;
# unset the team
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set-team CLEAR&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Setting team to CLEAR&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_REBOOT)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set-team CYAN&#39;)
assert re.search(r&#39;Setting team to CYAN&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_REBOOT)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;CYAN&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_ch_values():
&#34;&#34;&#34;Test --ch-longslow, --ch-longfast, --ch-mediumslow, --ch-mediumsfast,
--ch-shortslow, and --ch-shortfast arguments
&#34;&#34;&#34;
exp = {
&#39;--ch-longslow&#39;: &#39;Bw125Cr48Sf4096&#39;,
# TODO: not sure why these fail thru tests, but ok manually
#&#39;--ch-longfast&#39;: &#39;Bw31_25Cr48Sf512&#39;,
#&#39;--ch-mediumslow&#39;: &#39;Bw250Cr46Sf2048&#39;,
#&#39;--ch-mediumfast&#39;: &#39;Bw250Cr47Sf1024&#39;,
# TODO &#39;--ch-shortslow&#39;: &#39;?&#39;,
&#39;--ch-shortfast&#39;: &#39;Bw500Cr45Sf128&#39;
}
for key, val in exp.items():
print(key, val)
return_value, out = subprocess.getstatusoutput(f&#39;meshtastic {key}&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;Writing modified channels to device&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio (might reboot)
time.sleep(PAUSE_AFTER_REBOOT)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(val, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
@pytest.mark.smoke1
def test_smoke1_ch_set_name():
&#34;&#34;&#34;Test --ch-set name&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert not re.search(r&#39;MyChannel&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set name MyChannel&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;Warning: Need to specify&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set name MyChannel --ch-index 0&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set name to MyChannel&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;MyChannel&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_ch_set_downlink_and_uplink():
&#34;&#34;&#34;Test -ch-set downlink_enabled X and --ch-set uplink_enabled X&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set downlink_enabled false --ch-set uplink_enabled false&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;Warning: Need to specify&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set downlink_enabled false --ch-set uplink_enabled false --ch-index 0&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert not re.search(r&#39;uplinkEnabled&#39;, out, re.MULTILINE)
assert not re.search(r&#39;downlinkEnabled&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set downlink_enabled true --ch-set uplink_enabled true --ch-index 0&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set downlink_enabled to true&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Set uplink_enabled to true&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;uplinkEnabled&#39;, out, re.MULTILINE)
assert re.search(r&#39;downlinkEnabled&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_ch_add_and_ch_del():
&#34;&#34;&#34;Test --ch-add&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing&#39;)
assert re.search(r&#39;Writing modified channels to device&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-index 1 --ch-del&#39;)
assert re.search(r&#39;Deleting channel 1&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_REBOOT)
# make sure the secondar channel is not there
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert not re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert not re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_ch_enable_and_disable():
&#34;&#34;&#34;Test --ch-enable and --ch-disable&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing&#39;)
assert re.search(r&#39;Writing modified channels to device&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
# ensure they need to specify a --ch-index
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-disable&#39;)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-disable --ch-index 1&#39;)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;DISABLED&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-enable --ch-index 1&#39;)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 1&#39;)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
@pytest.mark.smoke1
def test_smoke1_ch_del_a_disabled_non_primary_channel():
&#34;&#34;&#34;Test --ch-del will work on a disabled non-primary channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing&#39;)
assert re.search(r&#39;Writing modified channels to device&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
# ensure they need to specify a --ch-index
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-disable&#39;)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 1&#39;)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert not re.search(r&#39;DISABLED&#39;, out, re.MULTILINE)
assert not re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert not re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
@pytest.mark.smoke1
def test_smoke1_attempt_to_delete_primary_channel():
&#34;&#34;&#34;Test that we cannot delete the PRIMARY channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 0&#39;)
assert re.search(r&#39;Warning: Cannot delete primary channel&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
@pytest.mark.smoke1
def test_smoke1_attempt_to_disable_primary_channel():
&#34;&#34;&#34;Test that we cannot disable the PRIMARY channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-disable --ch-index 0&#39;)
assert re.search(r&#39;Warning: Cannot enable&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
@pytest.mark.smoke1
def test_smoke1_attempt_to_enable_primary_channel():
&#34;&#34;&#34;Test that we cannot enable the PRIMARY channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-enable --ch-index 0&#39;)
assert re.search(r&#39;Warning: Cannot enable&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
@pytest.mark.smoke1
def test_smoke1_ensure_ch_del_second_of_three_channels():
&#34;&#34;&#34;Test that when we delete the 2nd of 3 channels, that it deletes the correct channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing1&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing1&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing2&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;testing2&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 1&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;testing2&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 1&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
@pytest.mark.smoke1
def test_smoke1_ensure_ch_del_third_of_three_channels():
&#34;&#34;&#34;Test that when we delete the 3rd of 3 channels, that it deletes the correct channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing1&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing1&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing2&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;testing2&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 2&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;testing1&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 1&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
@pytest.mark.smoke1
def test_smoke1_ch_set_modem_config():
&#34;&#34;&#34;Test --ch-set modem_config&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set modem_config Bw31_25Cr48Sf512&#39;)
assert re.search(r&#39;Warning: Need to specify&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert not re.search(r&#39;Bw31_25Cr48Sf512&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set modem_config Bw31_25Cr48Sf512 --ch-index 0&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set modem_config to Bw31_25Cr48Sf512&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;Bw31_25Cr48Sf512&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_seturl_default():
&#34;&#34;&#34;Test --seturl with default value&#34;&#34;&#34;
# set some channel value so we no longer have a default channel
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set name foo --ch-index 0&#39;)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
# ensure we no longer have a default primary channel
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert not re.search(&#39;CgUYAyIBAQ&#39;, out, re.MULTILINE)
assert return_value == 0
url = &#34;https://www.meshtastic.org/d/#CgUYAyIBAQ&#34;
return_value, out = subprocess.getstatusoutput(f&#34;meshtastic --seturl {url}&#34;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(&#39;CgUYAyIBAQ&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_seturl_invalid_url():
&#34;&#34;&#34;Test --seturl with invalid url&#34;&#34;&#34;
# Note: This url is no longer a valid url.
url = &#34;https://www.meshtastic.org/c/#GAMiENTxuzogKQdZ8Lz_q89Oab8qB0RlZmF1bHQ=&#34;
return_value, out = subprocess.getstatusoutput(f&#34;meshtastic --seturl {url}&#34;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(&#39;Warning: There were no settings&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
@pytest.mark.smoke1
def test_smoke1_configure():
&#34;&#34;&#34;Test --configure&#34;&#34;&#34;
_ , out = subprocess.getstatusoutput(f&#34;meshtastic --configure example_config.yaml&#34;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(&#39;^Setting device owner to Bob TBeam&#39;, out, re.MULTILINE)
assert re.search(&#39;^Fixing altitude at 304 meters&#39;, out, re.MULTILINE)
assert re.search(&#39;^Fixing latitude at 35.8&#39;, out, re.MULTILINE)
assert re.search(&#39;^Fixing longitude at -93.8&#39;, out, re.MULTILINE)
assert re.search(&#39;^Setting device position&#39;, out, re.MULTILINE)
assert re.search(&#39;^Set region to 1&#39;, out, re.MULTILINE)
assert re.search(&#39;^Set is_always_powered to true&#39;, out, re.MULTILINE)
assert re.search(&#39;^Set send_owner_interval to 2&#39;, out, re.MULTILINE)
assert re.search(&#39;^Set screen_on_secs to 31536000&#39;, out, re.MULTILINE)
assert re.search(&#39;^Set wait_bluetooth_secs to 31536000&#39;, out, re.MULTILINE)
assert re.search(&#39;^Writing modified preferences to device&#39;, out, re.MULTILINE)
# pause for the radio
time.sleep(PAUSE_AFTER_REBOOT)
@pytest.mark.smoke1
def test_smoke1_set_ham():
&#34;&#34;&#34;Test --set-ham
Note: Do a factory reset after this setting so it is very short-lived.
&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set-ham KI1234&#39;)
assert re.search(r&#39;Setting HAM ID&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_REBOOT)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;Owner: KI1234&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_set_wifi_settings():
&#34;&#34;&#34;Test --set wifi_ssid and --set wifi_password&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set wifi_ssid &#34;some_ssid&#34; --set wifi_password &#34;temp1234&#34;&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set wifi_ssid to some_ssid&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Set wifi_password to temp1234&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --get wifi_ssid --get wifi_password&#39;)
assert re.search(r&#39;^wifi_ssid: some_ssid&#39;, out, re.MULTILINE)
assert re.search(r&#39;^wifi_password: sekrit&#39;, out, re.MULTILINE)
assert return_value == 0
@pytest.mark.smoke1
def test_smoke1_factory_reset():
&#34;&#34;&#34;Test factory reset&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set factory_reset true&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set factory_reset to true&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Writing modified preferences to device&#39;, out, re.MULTILINE)
assert return_value == 0
# NOTE: The radio may not be responsive after this, may need to do a manual reboot
# by pressing the button</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="meshtastic.tests.test_smoke1.test_ch_set_with_invalid_settingpatch_find_ports"><code class="name flex">
<span>def <span class="ident">test_ch_set_with_invalid_settingpatch_find_ports</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test '&ndash;ch-set with a_bad_setting'.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_ch_set_with_invalid_settingpatch_find_ports():
&#34;&#34;&#34;Test &#39;--ch-set with a_bad_setting&#39;.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set invalid_setting foo --ch-index 0&#39;)
assert re.search(r&#39;Choices in sorted order&#39;, out)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_get_with_invalid_setting"><code class="name flex">
<span>def <span class="ident">test_get_with_invalid_setting</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test '&ndash;get a_bad_setting'.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_get_with_invalid_setting():
&#34;&#34;&#34;Test &#39;--get a_bad_setting&#39;.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --get a_bad_setting&#39;)
assert re.search(r&#39;Choices in sorted order&#39;, out)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_set_with_invalid_setting"><code class="name flex">
<span>def <span class="ident">test_set_with_invalid_setting</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test '&ndash;set a_bad_setting'.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_set_with_invalid_setting():
&#34;&#34;&#34;Test &#39;--set a_bad_setting&#39;.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set a_bad_setting foo&#39;)
assert re.search(r&#39;Choices in sorted order&#39;, out)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_attempt_to_delete_primary_channel"><code class="name flex">
<span>def <span class="ident">test_smoke1_attempt_to_delete_primary_channel</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test that we cannot delete the PRIMARY channel.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_attempt_to_delete_primary_channel():
&#34;&#34;&#34;Test that we cannot delete the PRIMARY channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 0&#39;)
assert re.search(r&#39;Warning: Cannot delete primary channel&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_attempt_to_disable_primary_channel"><code class="name flex">
<span>def <span class="ident">test_smoke1_attempt_to_disable_primary_channel</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test that we cannot disable the PRIMARY channel.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_attempt_to_disable_primary_channel():
&#34;&#34;&#34;Test that we cannot disable the PRIMARY channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-disable --ch-index 0&#39;)
assert re.search(r&#39;Warning: Cannot enable&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_attempt_to_enable_primary_channel"><code class="name flex">
<span>def <span class="ident">test_smoke1_attempt_to_enable_primary_channel</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test that we cannot enable the PRIMARY channel.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_attempt_to_enable_primary_channel():
&#34;&#34;&#34;Test that we cannot enable the PRIMARY channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-enable --ch-index 0&#39;)
assert re.search(r&#39;Warning: Cannot enable&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_ch_add_and_ch_del"><code class="name flex">
<span>def <span class="ident">test_smoke1_ch_add_and_ch_del</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;ch-add</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_ch_add_and_ch_del():
&#34;&#34;&#34;Test --ch-add&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing&#39;)
assert re.search(r&#39;Writing modified channels to device&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-index 1 --ch-del&#39;)
assert re.search(r&#39;Deleting channel 1&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_REBOOT)
# make sure the secondar channel is not there
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert not re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert not re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_ch_del_a_disabled_non_primary_channel"><code class="name flex">
<span>def <span class="ident">test_smoke1_ch_del_a_disabled_non_primary_channel</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;ch-del will work on a disabled non-primary channel.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_ch_del_a_disabled_non_primary_channel():
&#34;&#34;&#34;Test --ch-del will work on a disabled non-primary channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing&#39;)
assert re.search(r&#39;Writing modified channels to device&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
# ensure they need to specify a --ch-index
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-disable&#39;)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 1&#39;)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert not re.search(r&#39;DISABLED&#39;, out, re.MULTILINE)
assert not re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert not re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_ch_enable_and_disable"><code class="name flex">
<span>def <span class="ident">test_smoke1_ch_enable_and_disable</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;ch-enable and &ndash;ch-disable</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_ch_enable_and_disable():
&#34;&#34;&#34;Test --ch-enable and --ch-disable&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing&#39;)
assert re.search(r&#39;Writing modified channels to device&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
# ensure they need to specify a --ch-index
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-disable&#39;)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-disable --ch-index 1&#39;)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;DISABLED&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-enable --ch-index 1&#39;)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 1&#39;)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_ch_set_downlink_and_uplink"><code class="name flex">
<span>def <span class="ident">test_smoke1_ch_set_downlink_and_uplink</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test -ch-set downlink_enabled X and &ndash;ch-set uplink_enabled X</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_ch_set_downlink_and_uplink():
&#34;&#34;&#34;Test -ch-set downlink_enabled X and --ch-set uplink_enabled X&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set downlink_enabled false --ch-set uplink_enabled false&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;Warning: Need to specify&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set downlink_enabled false --ch-set uplink_enabled false --ch-index 0&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert not re.search(r&#39;uplinkEnabled&#39;, out, re.MULTILINE)
assert not re.search(r&#39;downlinkEnabled&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set downlink_enabled true --ch-set uplink_enabled true --ch-index 0&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set downlink_enabled to true&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Set uplink_enabled to true&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;uplinkEnabled&#39;, out, re.MULTILINE)
assert re.search(r&#39;downlinkEnabled&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_ch_set_modem_config"><code class="name flex">
<span>def <span class="ident">test_smoke1_ch_set_modem_config</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;ch-set modem_config</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_ch_set_modem_config():
&#34;&#34;&#34;Test --ch-set modem_config&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set modem_config Bw31_25Cr48Sf512&#39;)
assert re.search(r&#39;Warning: Need to specify&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert not re.search(r&#39;Bw31_25Cr48Sf512&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set modem_config Bw31_25Cr48Sf512 --ch-index 0&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set modem_config to Bw31_25Cr48Sf512&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;Bw31_25Cr48Sf512&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_ch_set_name"><code class="name flex">
<span>def <span class="ident">test_smoke1_ch_set_name</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;ch-set name</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_ch_set_name():
&#34;&#34;&#34;Test --ch-set name&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert not re.search(r&#39;MyChannel&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set name MyChannel&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;Warning: Need to specify&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set name MyChannel --ch-index 0&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set name to MyChannel&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;MyChannel&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_ch_values"><code class="name flex">
<span>def <span class="ident">test_smoke1_ch_values</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;ch-longslow, &ndash;ch-longfast, &ndash;ch-mediumslow, &ndash;ch-mediumsfast,
&ndash;ch-shortslow, and &ndash;ch-shortfast arguments</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_ch_values():
&#34;&#34;&#34;Test --ch-longslow, --ch-longfast, --ch-mediumslow, --ch-mediumsfast,
--ch-shortslow, and --ch-shortfast arguments
&#34;&#34;&#34;
exp = {
&#39;--ch-longslow&#39;: &#39;Bw125Cr48Sf4096&#39;,
# TODO: not sure why these fail thru tests, but ok manually
#&#39;--ch-longfast&#39;: &#39;Bw31_25Cr48Sf512&#39;,
#&#39;--ch-mediumslow&#39;: &#39;Bw250Cr46Sf2048&#39;,
#&#39;--ch-mediumfast&#39;: &#39;Bw250Cr47Sf1024&#39;,
# TODO &#39;--ch-shortslow&#39;: &#39;?&#39;,
&#39;--ch-shortfast&#39;: &#39;Bw500Cr45Sf128&#39;
}
for key, val in exp.items():
print(key, val)
return_value, out = subprocess.getstatusoutput(f&#39;meshtastic {key}&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;Writing modified channels to device&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio (might reboot)
time.sleep(PAUSE_AFTER_REBOOT)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(val, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_configure"><code class="name flex">
<span>def <span class="ident">test_smoke1_configure</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;configure</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_configure():
&#34;&#34;&#34;Test --configure&#34;&#34;&#34;
_ , out = subprocess.getstatusoutput(f&#34;meshtastic --configure example_config.yaml&#34;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(&#39;^Setting device owner to Bob TBeam&#39;, out, re.MULTILINE)
assert re.search(&#39;^Fixing altitude at 304 meters&#39;, out, re.MULTILINE)
assert re.search(&#39;^Fixing latitude at 35.8&#39;, out, re.MULTILINE)
assert re.search(&#39;^Fixing longitude at -93.8&#39;, out, re.MULTILINE)
assert re.search(&#39;^Setting device position&#39;, out, re.MULTILINE)
assert re.search(&#39;^Set region to 1&#39;, out, re.MULTILINE)
assert re.search(&#39;^Set is_always_powered to true&#39;, out, re.MULTILINE)
assert re.search(&#39;^Set send_owner_interval to 2&#39;, out, re.MULTILINE)
assert re.search(&#39;^Set screen_on_secs to 31536000&#39;, out, re.MULTILINE)
assert re.search(&#39;^Set wait_bluetooth_secs to 31536000&#39;, out, re.MULTILINE)
assert re.search(&#39;^Writing modified preferences to device&#39;, out, re.MULTILINE)
# pause for the radio
time.sleep(PAUSE_AFTER_REBOOT)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_debug"><code class="name flex">
<span>def <span class="ident">test_smoke1_debug</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;debug</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_debug():
&#34;&#34;&#34;Test --debug&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info --debug&#39;)
assert re.search(r&#39;^Owner&#39;, out, re.MULTILINE)
assert re.search(r&#39;^DEBUG:root&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_ensure_ch_del_second_of_three_channels"><code class="name flex">
<span>def <span class="ident">test_smoke1_ensure_ch_del_second_of_three_channels</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test that when we delete the 2nd of 3 channels, that it deletes the correct channel.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_ensure_ch_del_second_of_three_channels():
&#34;&#34;&#34;Test that when we delete the 2nd of 3 channels, that it deletes the correct channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing1&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing1&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing2&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;testing2&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 1&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;testing2&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 1&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_ensure_ch_del_third_of_three_channels"><code class="name flex">
<span>def <span class="ident">test_smoke1_ensure_ch_del_third_of_three_channels</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test that when we delete the 3rd of 3 channels, that it deletes the correct channel.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_ensure_ch_del_third_of_three_channels():
&#34;&#34;&#34;Test that when we delete the 3rd of 3 channels, that it deletes the correct channel.&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing1&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;SECONDARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;testing1&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-add testing2&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;testing2&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 2&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;testing1&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-del --ch-index 1&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_factory_reset"><code class="name flex">
<span>def <span class="ident">test_smoke1_factory_reset</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test factory reset</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_factory_reset():
&#34;&#34;&#34;Test factory reset&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set factory_reset true&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set factory_reset to true&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Writing modified preferences to device&#39;, out, re.MULTILINE)
assert return_value == 0
# NOTE: The radio may not be responsive after this, may need to do a manual reboot
# by pressing the button</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_info"><code class="name flex">
<span>def <span class="ident">test_smoke1_info</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;info</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_info():
&#34;&#34;&#34;Test --info&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Owner&#39;, out, re.MULTILINE)
assert re.search(r&#39;^My info&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Nodes in mesh&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Preferences&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Channels&#39;, out, re.MULTILINE)
assert re.search(r&#39;^ PRIMARY&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Primary channel URL&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_nodes"><code class="name flex">
<span>def <span class="ident">test_smoke1_nodes</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;nodes</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_nodes():
&#34;&#34;&#34;Test --nodes&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --nodes&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^│ N │ User&#39;, out, re.MULTILINE)
assert re.search(r&#39;^│ 1 │&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_port"><code class="name flex">
<span>def <span class="ident">test_smoke1_port</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;port</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_port():
&#34;&#34;&#34;Test --port&#34;&#34;&#34;
# first, get the ports
ports = findPorts()
# hopefully there is just one
assert len(ports) == 1
port = ports[0]
return_value, out = subprocess.getstatusoutput(f&#39;meshtastic --port {port} --info&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Owner&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_pos_fields"><code class="name flex">
<span>def <span class="ident">test_smoke1_pos_fields</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;pos-fields (with some values POS_ALTITUDE POS_ALT_MSL POS_BATTERY)</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_pos_fields():
&#34;&#34;&#34;Test --pos-fields (with some values POS_ALTITUDE POS_ALT_MSL POS_BATTERY)&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --pos-fields POS_ALTITUDE POS_ALT_MSL POS_BATTERY&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Setting position fields to 35&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --pos-fields&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;POS_ALTITUDE&#39;, out, re.MULTILINE)
assert re.search(r&#39;POS_ALT_MSL&#39;, out, re.MULTILINE)
assert re.search(r&#39;POS_BATTERY&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_qr"><code class="name flex">
<span>def <span class="ident">test_smoke1_qr</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;qr</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_qr():
&#34;&#34;&#34;Test --qr&#34;&#34;&#34;
filename = &#39;tmpqr&#39;
if os.path.exists(f&#34;{filename}&#34;):
os.remove(f&#34;{filename}&#34;)
return_value, _ = subprocess.getstatusoutput(f&#39;meshtastic --qr &gt; {filename}&#39;)
assert os.path.exists(f&#34;{filename}&#34;)
# not really testing that a valid qr code is created, just that the file size
# is reasonably big enough for a qr code
assert os.stat(f&#34;{filename}&#34;).st_size &gt; 20000
assert return_value == 0
os.remove(f&#34;{filename}&#34;)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_reboot"><code class="name flex">
<span>def <span class="ident">test_smoke1_reboot</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test reboot</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_reboot():
&#34;&#34;&#34;Test reboot&#34;&#34;&#34;
return_value, _ = subprocess.getstatusoutput(&#39;meshtastic --reboot&#39;)
assert return_value == 0
# pause for the radio to reset (10 seconds for the pause, and a few more seconds to be back up)
time.sleep(18)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_send_hello"><code class="name flex">
<span>def <span class="ident">test_smoke1_send_hello</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;sendtext hello</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_send_hello():
&#34;&#34;&#34;Test --sendtext hello&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --sendtext hello&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Sending text message hello to \^all&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_sendping"><code class="name flex">
<span>def <span class="ident">test_smoke1_sendping</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;sendping</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_sendping():
&#34;&#34;&#34;Test --sendping&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --sendping&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Sending ping message&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_seriallog_to_file"><code class="name flex">
<span>def <span class="ident">test_smoke1_seriallog_to_file</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;seriallog to a file creates a file</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_seriallog_to_file():
&#34;&#34;&#34;Test --seriallog to a file creates a file&#34;&#34;&#34;
filename = &#39;tmpoutput.txt&#39;
if os.path.exists(f&#34;{filename}&#34;):
os.remove(f&#34;{filename}&#34;)
return_value, _ = subprocess.getstatusoutput(f&#39;meshtastic --info --seriallog {filename}&#39;)
assert os.path.exists(f&#34;{filename}&#34;)
assert return_value == 0
os.remove(f&#34;{filename}&#34;)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_set_ham"><code class="name flex">
<span>def <span class="ident">test_smoke1_set_ham</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;set-ham
Note: Do a factory reset after this setting so it is very short-lived.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_set_ham():
&#34;&#34;&#34;Test --set-ham
Note: Do a factory reset after this setting so it is very short-lived.
&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set-ham KI1234&#39;)
assert re.search(r&#39;Setting HAM ID&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_REBOOT)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;Owner: KI1234&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_set_is_router_false"><code class="name flex">
<span>def <span class="ident">test_smoke1_set_is_router_false</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;set is_router false</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_set_is_router_false():
&#34;&#34;&#34;Test --set is_router false&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set is_router false&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set is_router to false&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --get is_router&#39;)
assert re.search(r&#39;^is_router: False&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_set_is_router_true"><code class="name flex">
<span>def <span class="ident">test_smoke1_set_is_router_true</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;set is_router true</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_set_is_router_true():
&#34;&#34;&#34;Test --set is_router true&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set is_router true&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set is_router to true&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --get is_router&#39;)
assert re.search(r&#39;^is_router: True&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_set_location_info"><code class="name flex">
<span>def <span class="ident">test_smoke1_set_location_info</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;setlat, &ndash;setlon and &ndash;setalt</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_set_location_info():
&#34;&#34;&#34;Test --setlat, --setlon and --setalt &#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --setlat 32.7767 --setlon -96.7970 --setalt 1337&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Fixing altitude&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Fixing latitude&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Fixing longitude&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out2 = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;1337&#39;, out2, re.MULTILINE)
assert re.search(r&#39;32.7767&#39;, out2, re.MULTILINE)
assert re.search(r&#39;-96.797&#39;, out2, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_set_owner"><code class="name flex">
<span>def <span class="ident">test_smoke1_set_owner</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;set-owner name</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_set_owner():
&#34;&#34;&#34;Test --set-owner name&#34;&#34;&#34;
# make sure the owner is not Joe
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set-owner Bob&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Setting device owner to Bob&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert not re.search(r&#39;Owner: Joe&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set-owner Joe&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Setting device owner to Joe&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;Owner: Joe&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_set_team"><code class="name flex">
<span>def <span class="ident">test_smoke1_set_team</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;set-team</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_set_team():
&#34;&#34;&#34;Test --set-team &#34;&#34;&#34;
# unset the team
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set-team CLEAR&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Setting team to CLEAR&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_REBOOT)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set-team CYAN&#39;)
assert re.search(r&#39;Setting team to CYAN&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_REBOOT)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(r&#39;CYAN&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_set_wifi_settings"><code class="name flex">
<span>def <span class="ident">test_smoke1_set_wifi_settings</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;set wifi_ssid and &ndash;set wifi_password</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_set_wifi_settings():
&#34;&#34;&#34;Test --set wifi_ssid and --set wifi_password&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --set wifi_ssid &#34;some_ssid&#34; --set wifi_password &#34;temp1234&#34;&#39;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(r&#39;^Set wifi_ssid to some_ssid&#39;, out, re.MULTILINE)
assert re.search(r&#39;^Set wifi_password to temp1234&#39;, out, re.MULTILINE)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --get wifi_ssid --get wifi_password&#39;)
assert re.search(r&#39;^wifi_ssid: some_ssid&#39;, out, re.MULTILINE)
assert re.search(r&#39;^wifi_password: sekrit&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_seturl_default"><code class="name flex">
<span>def <span class="ident">test_smoke1_seturl_default</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;seturl with default value</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_seturl_default():
&#34;&#34;&#34;Test --seturl with default value&#34;&#34;&#34;
# set some channel value so we no longer have a default channel
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --ch-set name foo --ch-index 0&#39;)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
# ensure we no longer have a default primary channel
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert not re.search(&#39;CgUYAyIBAQ&#39;, out, re.MULTILINE)
assert return_value == 0
url = &#34;https://www.meshtastic.org/d/#CgUYAyIBAQ&#34;
return_value, out = subprocess.getstatusoutput(f&#34;meshtastic --seturl {url}&#34;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert return_value == 0
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --info&#39;)
assert re.search(&#39;CgUYAyIBAQ&#39;, out, re.MULTILINE)
assert return_value == 0</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_seturl_invalid_url"><code class="name flex">
<span>def <span class="ident">test_smoke1_seturl_invalid_url</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;seturl with invalid url</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_seturl_invalid_url():
&#34;&#34;&#34;Test --seturl with invalid url&#34;&#34;&#34;
# Note: This url is no longer a valid url.
url = &#34;https://www.meshtastic.org/c/#GAMiENTxuzogKQdZ8Lz_q89Oab8qB0RlZmF1bHQ=&#34;
return_value, out = subprocess.getstatusoutput(f&#34;meshtastic --seturl {url}&#34;)
assert re.match(r&#39;Connected to radio&#39;, out)
assert re.search(&#39;Warning: There were no settings&#39;, out, re.MULTILINE)
assert return_value == 1
# pause for the radio
time.sleep(PAUSE_AFTER_COMMAND)</code></pre>
</details>
</dd>
<dt id="meshtastic.tests.test_smoke1.test_smoke1_test_with_arg_but_no_hardware"><code class="name flex">
<span>def <span class="ident">test_smoke1_test_with_arg_but_no_hardware</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"><p>Test &ndash;test
Note: Since only one device is connected, it will not do much.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@pytest.mark.smoke1
def test_smoke1_test_with_arg_but_no_hardware():
&#34;&#34;&#34;Test --test
Note: Since only one device is connected, it will not do much.
&#34;&#34;&#34;
return_value, out = subprocess.getstatusoutput(&#39;meshtastic --test&#39;)
assert re.search(r&#39;^Warning: Must have at least two devices&#39;, out, re.MULTILINE)
assert return_value == 1</code></pre>
</details>
</dd>
</dl>
</section>
<section>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="meshtastic.tests" href="index.html">meshtastic.tests</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="meshtastic.tests.test_smoke1.test_ch_set_with_invalid_settingpatch_find_ports" href="#meshtastic.tests.test_smoke1.test_ch_set_with_invalid_settingpatch_find_ports">test_ch_set_with_invalid_settingpatch_find_ports</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_get_with_invalid_setting" href="#meshtastic.tests.test_smoke1.test_get_with_invalid_setting">test_get_with_invalid_setting</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_set_with_invalid_setting" href="#meshtastic.tests.test_smoke1.test_set_with_invalid_setting">test_set_with_invalid_setting</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_attempt_to_delete_primary_channel" href="#meshtastic.tests.test_smoke1.test_smoke1_attempt_to_delete_primary_channel">test_smoke1_attempt_to_delete_primary_channel</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_attempt_to_disable_primary_channel" href="#meshtastic.tests.test_smoke1.test_smoke1_attempt_to_disable_primary_channel">test_smoke1_attempt_to_disable_primary_channel</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_attempt_to_enable_primary_channel" href="#meshtastic.tests.test_smoke1.test_smoke1_attempt_to_enable_primary_channel">test_smoke1_attempt_to_enable_primary_channel</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_ch_add_and_ch_del" href="#meshtastic.tests.test_smoke1.test_smoke1_ch_add_and_ch_del">test_smoke1_ch_add_and_ch_del</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_ch_del_a_disabled_non_primary_channel" href="#meshtastic.tests.test_smoke1.test_smoke1_ch_del_a_disabled_non_primary_channel">test_smoke1_ch_del_a_disabled_non_primary_channel</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_ch_enable_and_disable" href="#meshtastic.tests.test_smoke1.test_smoke1_ch_enable_and_disable">test_smoke1_ch_enable_and_disable</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_ch_set_downlink_and_uplink" href="#meshtastic.tests.test_smoke1.test_smoke1_ch_set_downlink_and_uplink">test_smoke1_ch_set_downlink_and_uplink</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_ch_set_modem_config" href="#meshtastic.tests.test_smoke1.test_smoke1_ch_set_modem_config">test_smoke1_ch_set_modem_config</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_ch_set_name" href="#meshtastic.tests.test_smoke1.test_smoke1_ch_set_name">test_smoke1_ch_set_name</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_ch_values" href="#meshtastic.tests.test_smoke1.test_smoke1_ch_values">test_smoke1_ch_values</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_configure" href="#meshtastic.tests.test_smoke1.test_smoke1_configure">test_smoke1_configure</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_debug" href="#meshtastic.tests.test_smoke1.test_smoke1_debug">test_smoke1_debug</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_ensure_ch_del_second_of_three_channels" href="#meshtastic.tests.test_smoke1.test_smoke1_ensure_ch_del_second_of_three_channels">test_smoke1_ensure_ch_del_second_of_three_channels</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_ensure_ch_del_third_of_three_channels" href="#meshtastic.tests.test_smoke1.test_smoke1_ensure_ch_del_third_of_three_channels">test_smoke1_ensure_ch_del_third_of_three_channels</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_factory_reset" href="#meshtastic.tests.test_smoke1.test_smoke1_factory_reset">test_smoke1_factory_reset</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_info" href="#meshtastic.tests.test_smoke1.test_smoke1_info">test_smoke1_info</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_nodes" href="#meshtastic.tests.test_smoke1.test_smoke1_nodes">test_smoke1_nodes</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_port" href="#meshtastic.tests.test_smoke1.test_smoke1_port">test_smoke1_port</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_pos_fields" href="#meshtastic.tests.test_smoke1.test_smoke1_pos_fields">test_smoke1_pos_fields</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_qr" href="#meshtastic.tests.test_smoke1.test_smoke1_qr">test_smoke1_qr</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_reboot" href="#meshtastic.tests.test_smoke1.test_smoke1_reboot">test_smoke1_reboot</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_send_hello" href="#meshtastic.tests.test_smoke1.test_smoke1_send_hello">test_smoke1_send_hello</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_sendping" href="#meshtastic.tests.test_smoke1.test_smoke1_sendping">test_smoke1_sendping</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_seriallog_to_file" href="#meshtastic.tests.test_smoke1.test_smoke1_seriallog_to_file">test_smoke1_seriallog_to_file</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_set_ham" href="#meshtastic.tests.test_smoke1.test_smoke1_set_ham">test_smoke1_set_ham</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_set_is_router_false" href="#meshtastic.tests.test_smoke1.test_smoke1_set_is_router_false">test_smoke1_set_is_router_false</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_set_is_router_true" href="#meshtastic.tests.test_smoke1.test_smoke1_set_is_router_true">test_smoke1_set_is_router_true</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_set_location_info" href="#meshtastic.tests.test_smoke1.test_smoke1_set_location_info">test_smoke1_set_location_info</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_set_owner" href="#meshtastic.tests.test_smoke1.test_smoke1_set_owner">test_smoke1_set_owner</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_set_team" href="#meshtastic.tests.test_smoke1.test_smoke1_set_team">test_smoke1_set_team</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_set_wifi_settings" href="#meshtastic.tests.test_smoke1.test_smoke1_set_wifi_settings">test_smoke1_set_wifi_settings</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_seturl_default" href="#meshtastic.tests.test_smoke1.test_smoke1_seturl_default">test_smoke1_seturl_default</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_seturl_invalid_url" href="#meshtastic.tests.test_smoke1.test_smoke1_seturl_invalid_url">test_smoke1_seturl_invalid_url</a></code></li>
<li><code><a title="meshtastic.tests.test_smoke1.test_smoke1_test_with_arg_but_no_hardware" href="#meshtastic.tests.test_smoke1.test_smoke1_test_with_arg_but_no_hardware">test_smoke1_test_with_arg_but_no_hardware</a></code></li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>