<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>darve.sh</title>
    <link>https://darve.sh/</link>
    <description>Darvesh takes products from idea to production: product, development and QA. Experience, side projects and notes from the workbench.</description>
    <language>en</language>
    <lastBuildDate>Tue, 24 May 2022 00:00:00 GMT</lastBuildDate>
    <atom:link href="https://darve.sh/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hide Native Tabs in Firefox</title>
      <link>https://darve.sh/posts/setup/firefox-hide-native-tabs/</link>
      <guid isPermaLink="true">https://darve.sh/posts/setup/firefox-hide-native-tabs/</guid>
      <pubDate>Tue, 24 May 2022 00:00:00 GMT</pubDate>
      <description>Hide native Firefox tabs using custom CSS</description>
      <category>Firefox</category>
      <content:encoded><![CDATA[<ol>
<li>Visit <code>about:config</code></li>
<li>Search and enable <code>toolkit.legacyUserProfileCustomizations.stylesheets</code></li>
<li>Visit <code>about:support</code></li>
<li>Click on <code>Open Directory</code> which is to the right of <code>Profile Directory</code></li>
<li>Create a new folder called <code>chrome</code></li>
<li>Open chrome and create a new file named <code>userChome.css</code></li>
<li>Paste the following</li>
</ol>
<figure class="code"><figcaption>css</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="css"><code><span class="line"><span style="color:var(--code-token-function)">#tabbrowser-tabs</span><span style="color:var(--code-foreground)"> {</span></span>
<span class="line"><span style="color:var(--code-token-constant)">  visibility</span><span style="color:var(--code-token-keyword)">:</span><span style="color:var(--code-token-constant)"> collapse</span><span style="color:var(--code-foreground)">;</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-token-function)">#titlebar</span><span style="color:var(--code-token-function)"> #TabsToolbar</span><span style="color:var(--code-foreground)"> {</span></span>
<span class="line"><span style="color:var(--code-token-constant)">  background-color</span><span style="color:var(--code-token-keyword)">:</span><span style="color:var(--code-token-function)"> var</span><span style="color:var(--code-token-constant)">(--toolbar-bgcolor)</span><span style="color:var(--code-foreground)">;</span></span>
<span class="line"><span style="color:var(--code-token-constant)">  background-image</span><span style="color:var(--code-token-keyword)">:</span><span style="color:var(--code-token-function)"> var</span><span style="color:var(--code-token-constant)">(--toolbar-bgimage)</span><span style="color:var(--code-foreground)">;</span></span>
<span class="line"><span style="color:var(--code-token-constant)">  padding-top</span><span style="color:var(--code-token-keyword)">:</span><span style="color:var(--code-token-constant)"> 5</span><span style="color:var(--code-token-keyword)">px</span><span style="color:var(--code-foreground)">;</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span></code></pre></figure>
<p>Tested on Firefox v100.0.2.</p>]]></content:encoded>
    </item>
    <item>
      <title>Setup SSH</title>
      <link>https://darve.sh/posts/setup/setup-ssh/</link>
      <guid isPermaLink="true">https://darve.sh/posts/setup/setup-ssh/</guid>
      <pubDate>Wed, 18 May 2022 00:00:00 GMT</pubDate>
      <description>Setup SSH</description>
      <category>ssh</category>
      <category>config</category>
      <content:encoded><![CDATA[<h2 id="generate-key">Generate key</h2>
<figure class="code"><figcaption>bash</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--code-token-function)">ssh-keygen</span><span style="color:var(--code-token-string)"> -t</span><span style="color:var(--code-token-string)"> ed25519</span></span></code></pre></figure>
<h2 id="write-config">Write config</h2>
<p>Create a file named <code>config</code> inside <code>~/.ssh</code> and add the following.</p>
<figure class="code"><figcaption>bash</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--code-token-function)">Host</span><span style="color:var(--code-token-keyword)"> &#x3C;</span><span style="color:var(--code-token-string)">server-nam</span><span style="color:var(--code-foreground)">e</span><span style="color:var(--code-token-keyword)">></span></span>
<span class="line"><span style="color:var(--code-token-function)"> Hostname</span><span style="color:var(--code-token-keyword)"> &#x3C;</span><span style="color:var(--code-token-string)">i</span><span style="color:var(--code-foreground)">p</span><span style="color:var(--code-token-keyword)">></span></span>
<span class="line"><span style="color:var(--code-token-function)"> User</span><span style="color:var(--code-token-keyword)"> &#x3C;</span><span style="color:var(--code-token-string)">usernam</span><span style="color:var(--code-foreground)">e</span><span style="color:var(--code-token-keyword)">></span></span>
<span class="line"><span style="color:var(--code-token-function)"> IdentityFile</span><span style="color:var(--code-token-keyword)"> &#x3C;</span><span style="color:var(--code-token-string)">path-to-private-ke</span><span style="color:var(--code-foreground)">y</span><span style="color:var(--code-token-keyword)">></span></span></code></pre></figure>
<p>Now you can log in to your server easily with
<code>ssh &#x3C;server-name></code> instead of having to type <code>ssh -i &#x3C;path-to-private-key> &#x3C;username>@&#x3C;Hostname></code></p>
<h2 id="fix-disconnection-on-idle">Fix disconnection on idle</h2>
<p>Client will keep sending null packets every 100 seconds to keep the connection alive. Add</p>
<figure class="code"><figcaption>bash</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--code-token-function)">ServerAliveInterval</span><span style="color:var(--code-token-constant)"> 100</span></span></code></pre></figure>
<p>to either</p>
<figure class="code"><figcaption>bash</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--code-token-function)">sudo</span><span style="color:var(--code-token-string)"> vi</span><span style="color:var(--code-token-string)"> /etc/ssh/ssh_config</span></span></code></pre></figure>
<p>or</p>
<figure class="code"><figcaption>bash</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--code-token-function)">vi</span><span style="color:var(--code-token-string)"> ~/.ssh/config</span></span></code></pre></figure>
<p>Alternatively, you can do <code>ssh -o ServerAliveInterval=100 me@remote</code></p>
<h2 id="reverse-port-forwading">Reverse Port Forwading</h2>
<p>Add these lines to <code>/etc/ssh/sshd_config</code> on your server</p>
<figure class="code"><figcaption>bash</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--code-token-function)">GatewayPorts</span><span style="color:var(--code-token-string)"> clientspecified</span></span>
<span class="line"><span style="color:var(--code-token-function)">AllowTcpForwarding</span><span style="color:var(--code-token-string)"> yes</span></span></code></pre></figure>
<p>Then open the terminal on your local computer, paste the following and change the values suitably</p>
<figure class="code"><figcaption>bash</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--code-token-function)">ssh</span><span style="color:var(--code-token-string)"> -o</span><span style="color:var(--code-token-string)"> ExitOnForwardFailure=yes</span><span style="color:var(--code-token-string)"> -v</span><span style="color:var(--code-token-string)"> -N</span><span style="color:var(--code-token-string)"> -R</span><span style="color:var(--code-token-string-expression)"> "*:$SERVER_PORT:*:$CLIENT_PORT"</span><span style="color:var(--code-token-string)"> server_name</span></span></code></pre></figure>
<p>Flags:<br>
<code>R</code> = Specifies that connections to the given TCP port or Unix socket on the remote (server) host are to be forwarded to the local side.<br>
<code>N</code>	= Do not execute a remote command, in simple words, do not log in to the server.<br>
<code>v</code> = Verbose mode.  Causes ssh to print debugging messages about its progress.</p>
<p><code>server_name</code> is either <code>username@ip</code> or server name that you configured on your <code>~/.ssh/config</code><br>
If you want to bind to only IPv4 addresses, use <code>0.0.0.0</code> instead of <code>*</code></p>
<p>If there is frequent disconnection, follow <a href="https://darve.sh/posts/setup/setup-ssh/#fix-disconnection-on-idle">this</a> to fix it.</p>]]></content:encoded>
    </item>
    <item>
      <title>Rust: Modules</title>
      <link>https://darve.sh/posts/rust/modules/</link>
      <guid isPermaLink="true">https://darve.sh/posts/rust/modules/</guid>
      <pubDate>Mon, 11 Oct 2021 00:00:00 GMT</pubDate>
      <description>Modules in Rust</description>
      <category>Rust</category>
      <category>Module</category>
      <content:encoded><![CDATA[<h3 id="rules">Rules</h3>
<ol>
<li>If a module named <code>human</code> has no submodules, you should put the declaration for the <code>human</code> in a file named human.rs</li>
<li>If a module named <code>human</code> does have a submodule, you should put the declarations for <code>human</code> in a file named <code>human/mod.rs</code></li>
</ol>
<p>Example</p>
<figure class="code"><figcaption>rust</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--code-token-comment)">/*</span></span>
<span class="line"><span style="color:var(--code-token-comment)">src/lib.rs</span></span>
<span class="line"><span style="color:var(--code-token-comment)">*/</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">pub</span><span style="color:var(--code-token-keyword)"> mod</span><span style="color:var(--code-token-function)"> Human</span><span style="color:var(--code-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-token-comment)">/*</span></span>
<span class="line"><span style="color:var(--code-token-comment)">src/human/mod.rs</span></span>
<span class="line"><span style="color:var(--code-token-comment)">*/</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">pub</span><span style="color:var(--code-token-keyword)"> mod</span><span style="color:var(--code-foreground)"> social;</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">pub</span><span style="color:var(--code-token-keyword)"> mod</span><span style="color:var(--code-foreground)"> action;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-token-comment)">/*</span></span>
<span class="line"><span style="color:var(--code-token-comment)">src/human/social.rs</span></span>
<span class="line"><span style="color:var(--code-token-comment)">*/</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">pub</span><span style="color:var(--code-token-keyword)"> fn</span><span style="color:var(--code-token-function)"> have_fun</span><span style="color:var(--code-foreground)">(){</span></span>
<span class="line"><span style="color:var(--code-token-function)">	println!</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-string-expression)">"Have fun"</span><span style="color:var(--code-foreground)">);</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-token-comment)">/*</span></span>
<span class="line"><span style="color:var(--code-token-comment)">src/human/action.rs</span></span>
<span class="line"><span style="color:var(--code-token-comment)">*/</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">pub</span><span style="color:var(--code-token-keyword)"> fn</span><span style="color:var(--code-token-function)"> walk</span><span style="color:var(--code-foreground)">(){</span></span>
<span class="line"><span style="color:var(--code-token-function)">	println!</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-string-expression)">"walking"</span><span style="color:var(--code-foreground)">);</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-token-comment)">/*</span></span>
<span class="line"><span style="color:var(--code-token-comment)">src/main.rs</span></span>
<span class="line"><span style="color:var(--code-token-comment)">*/</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">use</span><span style="color:var(--code-foreground)"> my_project_name</span><span style="color:var(--code-token-keyword)">::</span><span style="color:var(--code-foreground)">human;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-token-keyword)">fn</span><span style="color:var(--code-token-function)"> main</span><span style="color:var(--code-foreground)">(){</span></span>
<span class="line"><span style="color:var(--code-foreground)">	human</span><span style="color:var(--code-token-keyword)">::</span><span style="color:var(--code-foreground)">social</span><span style="color:var(--code-token-keyword)">::</span><span style="color:var(--code-token-function)">have_fun</span><span style="color:var(--code-foreground)">();</span></span>
<span class="line"><span style="color:var(--code-foreground)">	human</span><span style="color:var(--code-token-keyword)">::</span><span style="color:var(--code-foreground)">action</span><span style="color:var(--code-token-keyword)">::</span><span style="color:var(--code-token-function)">walk</span><span style="color:var(--code-foreground)">();</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span></code></pre></figure>]]></content:encoded>
    </item>
    <item>
      <title>Rust: String Literals and Slices</title>
      <link>https://darve.sh/posts/rust/string-literals-and-slices/</link>
      <guid isPermaLink="true">https://darve.sh/posts/rust/string-literals-and-slices/</guid>
      <pubDate>Mon, 11 Oct 2021 00:00:00 GMT</pubDate>
      <description>String literals and slices in Rust</description>
      <category>Rust</category>
      <category>String Literal</category>
      <category>Slice</category>
      <content:encoded><![CDATA[<figure class="code"><figcaption>rust</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--code-token-keyword)">let</span><span style="color:var(--code-foreground)"> greeting </span><span style="color:var(--code-token-keyword)">=</span><span style="color:var(--code-token-string-expression)"> "Good morning"</span><span style="color:var(--code-foreground)">;</span></span></code></pre></figure>
<p><code>greeting</code> is a string literal and they are immutable. The reason why it's immutable is explained below.</p>
<p>In Rust, you can store part of the String and they are called String slices. For example,</p>
<figure class="code"><figcaption>rust</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--code-token-keyword)">let</span><span style="color:var(--code-token-function)"> str</span><span style="color:var(--code-token-keyword)"> =</span><span style="color:var(--code-token-function)"> String</span><span style="color:var(--code-token-keyword)">::</span><span style="color:var(--code-token-function)">from</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-string-expression)">"Hello there"</span><span style="color:var(--code-foreground)">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-token-keyword)">let</span><span style="color:var(--code-foreground)"> hello </span><span style="color:var(--code-token-keyword)">=</span><span style="color:var(--code-token-keyword)"> &#x26;</span><span style="color:var(--code-token-function)">str</span><span style="color:var(--code-foreground)">[</span><span style="color:var(--code-token-constant)">0</span><span style="color:var(--code-token-keyword)">..</span><span style="color:var(--code-token-constant)">4</span><span style="color:var(--code-foreground)">];</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">let</span><span style="color:var(--code-foreground)"> there </span><span style="color:var(--code-token-keyword)">=</span><span style="color:var(--code-token-keyword)"> &#x26;</span><span style="color:var(--code-token-function)">str</span><span style="color:var(--code-foreground)">[</span><span style="color:var(--code-token-constant)">6</span><span style="color:var(--code-token-keyword)">..</span><span style="color:var(--code-token-constant)">10</span><span style="color:var(--code-foreground)">];</span></span></code></pre></figure>
<p><code>hello</code> and <code>there</code> are String slices. They store references to the portion of the String.</p>
<p>Now let's talk about why string literals are immutable. The string literals are literally slices of a string. Imagine that the value <code>Good morning</code> is stored on the heap(in a memory location called <code>temp</code>) then the <code>greeting</code> variable is basically <code>temp[0..temp.len()]</code> (can write as <code>temp[..]</code>)</p>
<p>As I mentioned in the ownership chapter, if you have an immutable reference to a variable, you cannot take a mutable reference for the same.</p>
<p>Here is an example.</p>
<figure class="code"><figcaption>rust</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--code-token-keyword)">fn</span><span style="color:var(--code-token-function)"> main</span><span style="color:var(--code-foreground)">(){</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">	let</span><span style="color:var(--code-token-function)"> str</span><span style="color:var(--code-token-keyword)"> =</span><span style="color:var(--code-token-function)"> String</span><span style="color:var(--code-token-keyword)">::</span><span style="color:var(--code-token-function)">from</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-string-expression)">"Hello there"</span><span style="color:var(--code-foreground)">);</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">	let</span><span style="color:var(--code-foreground)"> hello </span><span style="color:var(--code-token-keyword)">=</span><span style="color:var(--code-token-keyword)"> &#x26;</span><span style="color:var(--code-token-function)">str</span><span style="color:var(--code-foreground)">[</span><span style="color:var(--code-token-constant)">0</span><span style="color:var(--code-token-keyword)">..</span><span style="color:var(--code-token-constant)">4</span><span style="color:var(--code-foreground)">];</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">	let</span><span style="color:var(--code-foreground)"> there </span><span style="color:var(--code-token-keyword)">=</span><span style="color:var(--code-token-keyword)"> &#x26;</span><span style="color:var(--code-token-function)">str</span><span style="color:var(--code-foreground)">[</span><span style="color:var(--code-token-constant)">6</span><span style="color:var(--code-token-keyword)">..</span><span style="color:var(--code-token-constant)">10</span><span style="color:var(--code-foreground)">];</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-token-comment)">	/*this will result in an error because `hello`</span></span>
<span class="line"><span style="color:var(--code-token-comment)">	a `there` already have an immutable reference to `str`*/</span></span>
<span class="line"><span style="color:var(--code-token-function)">	str</span><span style="color:var(--code-token-keyword)">.</span><span style="color:var(--code-token-function)">clear</span><span style="color:var(--code-foreground)">();</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span></code></pre></figure>]]></content:encoded>
    </item>
    <item>
      <title>Rust: Writing tests</title>
      <link>https://darve.sh/posts/rust/tests/</link>
      <guid isPermaLink="true">https://darve.sh/posts/rust/tests/</guid>
      <pubDate>Mon, 11 Oct 2021 00:00:00 GMT</pubDate>
      <description>Writing tests in Rust</description>
      <category>Rust</category>
      <category>Test</category>
      <content:encoded><![CDATA[<p>The <code>#[cfg(test)]</code> annotation tells Rust to run the function only when <code>cargo test</code> is run and not when <code>cargo build</code> is run</p>
<h3 id="functions">Functions</h3>
<figure class="code"><figcaption>rust</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--code-token-function)">assert!</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-constant)">1</span><span style="color:var(--code-token-keyword)"> ==</span><span style="color:var(--code-token-constant)"> 2</span><span style="color:var(--code-foreground)">, </span><span style="color:var(--code-token-string-expression)">"wasn't true"</span><span style="color:var(--code-foreground)">); </span><span style="color:var(--code-token-comment)">//it will print wasn't true when test fails</span></span>
<span class="line"><span style="color:var(--code-token-function)">assert_eq!</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-constant)">6</span><span style="color:var(--code-foreground)">, </span><span style="color:var(--code-token-constant)">6</span><span style="color:var(--code-foreground)">);</span></span>
<span class="line"><span style="color:var(--code-token-function)">assert_ne!</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-constant)">6</span><span style="color:var(--code-foreground)">, </span><span style="color:var(--code-token-constant)">5</span><span style="color:var(--code-foreground)">);</span></span>
<span class="line"></span></code></pre></figure>
<h3 id="run-test">Run test</h3>
<figure class="code"><figcaption>sh</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="sh"><code><span class="line"><span style="color:var(--code-token-function)">cargo</span><span style="color:var(--code-token-string)"> test</span></span></code></pre></figure>
<h3 id="run-tests-in-parallel-or-consecutively">Run tests in parallel or consecutively</h3>
<figure class="code"><figcaption>sh</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="sh"><code><span class="line"><span style="color:var(--code-token-function)">cargo</span><span style="color:var(--code-token-string)"> test</span><span style="color:var(--code-token-string)"> --</span><span style="color:var(--code-token-string)"> --test-threads=</span><span style="color:var(--code-token-keyword)">&#x3C;</span><span style="color:var(--code-token-string)">numbers</span><span style="color:var(--code-token-keyword)">></span></span></code></pre></figure>
<h3 id="change-output-capture-behavior-show-logs">Change output capture behavior, show logs</h3>
<figure class="code"><figcaption>sh</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="sh"><code><span class="line"><span style="color:var(--code-token-function)">cargo</span><span style="color:var(--code-token-string)"> test</span><span style="color:var(--code-token-string)"> --</span><span style="color:var(--code-token-string)"> --nocapture</span></span></code></pre></figure>
<h3 id="run-single-or-multiple-tests">Run single or multiple tests</h3>
<figure class="code"><figcaption>sh</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="sh"><code><span class="line"><span style="color:var(--code-token-function)">cargo</span><span style="color:var(--code-token-string)"> test</span><span style="color:var(--code-token-keyword)"> &#x3C;</span><span style="color:var(--code-token-string)">function-name</span><span style="color:var(--code-token-keyword)">|</span><span style="color:var(--code-token-function)">pattern</span><span style="color:var(--code-foreground)">></span></span></code></pre></figure>
<figure class="code"><figcaption>rust</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--code-token-keyword)">pub</span><span style="color:var(--code-token-keyword)"> fn</span><span style="color:var(--code-token-function)"> add_one</span><span style="color:var(--code-foreground)">(num</span><span style="color:var(--code-token-keyword)">:</span><span style="color:var(--code-token-function)"> i64</span><span style="color:var(--code-foreground)">) </span><span style="color:var(--code-token-keyword)">-></span><span style="color:var(--code-token-function)"> i64</span><span style="color:var(--code-foreground)"> {</span></span>
<span class="line"><span style="color:var(--code-foreground)">    num </span><span style="color:var(--code-token-keyword)">+</span><span style="color:var(--code-token-constant)"> 1</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-token-keyword)">pub</span><span style="color:var(--code-token-keyword)"> fn</span><span style="color:var(--code-token-function)"> add_two</span><span style="color:var(--code-foreground)">(num</span><span style="color:var(--code-token-keyword)">:</span><span style="color:var(--code-token-function)"> i64</span><span style="color:var(--code-foreground)">) </span><span style="color:var(--code-token-keyword)">-></span><span style="color:var(--code-token-function)"> i64</span><span style="color:var(--code-foreground)"> {</span></span>
<span class="line"><span style="color:var(--code-foreground)">    num </span><span style="color:var(--code-token-keyword)">+</span><span style="color:var(--code-token-constant)"> 2</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-foreground)">#[cfg(test)]</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">mod</span><span style="color:var(--code-foreground)"> tests {</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">	use</span><span style="color:var(--code-foreground)"> super</span><span style="color:var(--code-token-keyword)">::*</span><span style="color:var(--code-foreground)">;</span></span>
<span class="line"><span style="color:var(--code-foreground)">	#[test]</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">	fn</span><span style="color:var(--code-token-function)"> add_one_test</span><span style="color:var(--code-foreground)">() {</span></span>
<span class="line"><span style="color:var(--code-token-function)">		assert_eq!</span><span style="color:var(--code-token-keyword)">!</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-constant)">4</span><span style="color:var(--code-foreground)">, </span><span style="color:var(--code-token-function)">add_one</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-constant)">3</span><span style="color:var(--code-foreground)">));</span></span>
<span class="line"><span style="color:var(--code-foreground)">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-foreground)">	#[test]</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">	fn</span><span style="color:var(--code-token-function)"> add_two_test</span><span style="color:var(--code-foreground)">() {</span></span>
<span class="line"><span style="color:var(--code-token-function)">		assert_eq!</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-constant)">6</span><span style="color:var(--code-foreground)">, </span><span style="color:var(--code-token-function)">add_two</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-constant)">4</span><span style="color:var(--code-foreground)">));</span></span>
<span class="line"><span style="color:var(--code-foreground)">	}</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span></code></pre></figure>
<p>Example</p>
<figure class="code"><figcaption>bash</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--code-token-function)">//will</span><span style="color:var(--code-token-string)"> run</span><span style="color:var(--code-token-string)"> only</span><span style="color:var(--code-token-string)"> one</span><span style="color:var(--code-token-string)"> test</span></span>
<span class="line"><span style="color:var(--code-token-function)">cargo</span><span style="color:var(--code-token-string)"> test</span><span style="color:var(--code-token-string)"> add_one_test</span></span>
<span class="line"><span style="color:var(--code-token-function)">//will</span><span style="color:var(--code-token-string)"> run</span><span style="color:var(--code-token-string)"> all</span><span style="color:var(--code-token-string)"> tests</span><span style="color:var(--code-token-string)"> starting</span><span style="color:var(--code-token-string)"> with</span><span style="color:var(--code-token-string)"> add_</span></span>
<span class="line"><span style="color:var(--code-token-function)">cargo</span><span style="color:var(--code-token-string)"> test</span><span style="color:var(--code-token-string)"> add_</span></span></code></pre></figure>
<h3 id="test-function-that-should-panic">Test function that should panic</h3>
<p>use <code>#[should_panic]</code> attribute</p>
<figure class="code"><figcaption>rust</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--code-token-keyword)">pub</span><span style="color:var(--code-token-keyword)"> fn</span><span style="color:var(--code-token-function)"> i_panic</span><span style="color:var(--code-foreground)">() {</span></span>
<span class="line"><span style="color:var(--code-token-function)">    panic!</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-string-expression)">"omg!"</span><span style="color:var(--code-foreground)">);</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-foreground)">#[cfg(test)]</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">mod</span><span style="color:var(--code-foreground)"> test {</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">    use</span><span style="color:var(--code-foreground)"> super</span><span style="color:var(--code-token-keyword)">::*</span><span style="color:var(--code-foreground)">;</span></span>
<span class="line"><span style="color:var(--code-foreground)">    #[test]</span></span>
<span class="line"><span style="color:var(--code-foreground)">    #[should_panic]</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">    fn</span><span style="color:var(--code-token-function)"> should_panic</span><span style="color:var(--code-foreground)">() {</span></span>
<span class="line"><span style="color:var(--code-token-function)">        i_panic</span><span style="color:var(--code-foreground)">();</span></span>
<span class="line"><span style="color:var(--code-foreground)">    }</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-token-comment)">//The above test will pass</span></span></code></pre></figure>
<h3 id="ignore-a-test">Ignore a test</h3>
<p>Use <code>#[ignore]</code> attribute</p>
<h3 id="integration-tests">Integration tests</h3>
<p>Make a directory called <code>tests</code> at the root level of the project. Assume you have this code in the <code>lib.rs</code> file in the project <code>adder</code></p>
<figure class="code"><figcaption>rust</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--code-token-comment)">/*</span></span>
<span class="line"><span style="color:var(--code-token-comment)">|-adder/src</span></span>
<span class="line"><span style="color:var(--code-token-comment)">  |--lib.rs</span></span>
<span class="line"><span style="color:var(--code-token-comment)">*/</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">pub</span><span style="color:var(--code-token-function)"> add_two</span><span style="color:var(--code-foreground)">(num</span><span style="color:var(--code-token-keyword)">:</span><span style="color:var(--code-token-function)"> i64</span><span style="color:var(--code-foreground)">) </span><span style="color:var(--code-token-keyword)">-></span><span style="color:var(--code-token-function)"> i64</span><span style="color:var(--code-foreground)">{</span></span>
<span class="line"><span style="color:var(--code-foreground)">	num </span><span style="color:var(--code-token-keyword)">+</span><span style="color:var(--code-token-constant)"> 2</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span></code></pre></figure>
<p><em>tests/integration_test.rs</em></p>
<figure class="code"><figcaption>rust</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--code-token-keyword)">extern</span><span style="color:var(--code-token-keyword)"> crate</span><span style="color:var(--code-foreground)"> adder;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--code-foreground)">#[test]</span></span>
<span class="line"><span style="color:var(--code-token-keyword)">fn</span><span style="color:var(--code-token-function)"> add_two_test</span><span style="color:var(--code-foreground)">(){</span></span>
<span class="line"><span style="color:var(--code-token-function)">	assert_eq!</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-constant)">6</span><span style="color:var(--code-foreground)">, adder</span><span style="color:var(--code-token-keyword)">::</span><span style="color:var(--code-token-function)">add_two</span><span style="color:var(--code-foreground)">(</span><span style="color:var(--code-token-constant)">4</span><span style="color:var(--code-foreground)">));</span></span>
<span class="line"><span style="color:var(--code-foreground)">}</span></span>
<span class="line"></span></code></pre></figure>
<p>We don't need to use <code>#[cfg(test)]</code> here.
When running <code>cargo test</code>, it will run both unit and integration tests. You can also run only tests from a particular integration test file. In the above example, if you want to run tests from integration_test.ts file</p>
<figure class="code"><figcaption>rust</figcaption><pre class="shiki desk" style="background-color:var(--code-background);color:var(--code-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--code-foreground)">cargo test </span><span style="color:var(--code-token-keyword)">--</span><span style="color:var(--code-foreground)">test integration_test</span><span style="color:var(--code-token-keyword)">.</span><span style="color:var(--code-foreground)">rs</span></span></code></pre></figure>]]></content:encoded>
    </item>
  </channel>
</rss>