Connecting the pieces on how I solve bugs

A Systematic Approach to Solving Bugs

Sean Prashad
Sep 27, 2018 · 7 min read

Explaining my thought process on approaching bugs

Background

Ever wonder if it was possible to replicate a file system within your browser? Filer, “a POSIX-like file system interface for node and browser-based JavaScript” is just what you’re looking for! Filer works on all modern browsers and can be configured to store contents on different storage providers (ie. data stores) such as IndexedDB, WebSQL, and even regular memory.

Interested in integrating Filer into your projects? Check out the docs here.

Improving Filer

Filer aims to mimic the Node.js fs API, but currently lacks support for the newly introduced fs.promises API in Node v10.0.0.

Recently, a student from Seneca College landed support for asynchronous, or promise-based functions, which in-turn, requires new tests to be written for this functionality. That’s where we (70+ open source students) come into play. Cue the horde of PR’s:

Gitting Setup

In this post, I’ll walk through in great detail about my proposal for Issue #499 — adding a test for fs.truncate(). This function changes the size of a specified file to be a certain amount of bytes long. In my issue, I’ll need to write a new test to verify if the truncate function properly handles a non-numeric value for it’s len parameter.

  1. First off, I needed to fork the original source code, found at filerjs/filer on GitHub, so that I have my own copy that I can work with:

2. Next, I’ll need to clone (or download) the source code to my local laptop in order to actually work with it. First I’ll grab the unique .git URL that GitHub provides:

3. With that URL handy, I’ll now clone the source code to my local machine:

4. This next step is very important! We’ll need to add a remote to point to the original repo. The original source code for Filer lives at filerjs/filer but we created our own copy by forking it — which for me is located at seanprashad/filer.

In order to get the latest code, we want to add a remote, aka a “connection”, to filerjs/filer, which allows us to “pull” any new changes at our own will. This step requires us to go back to the original Filer repo and copy that unique download URL once more:

With that URL copied, the next step is to actually create the connection to the original repo. I’ll make sure to cd into the newly cloned repo and then run the following command with upstream as the alias for filerjs/filer:

git remote add upstream https://github.com/filerjs/filer.git

The git remote -v command allows us to view all remotes!

5. Our setup so far is looking promising — let’s actually open up the source code now. I use VSCode, so I can simply open the currently directory with code .:

And that’s it for our setup — let’s dive into actually fixing this bug! 👊🏽

Solving Our Bug

Getting setup was the easy part — we now need to:

  • Install dependencies for Filer
  • Make sure the project is working on my machine by running npm run test
  • Locate where the unit tests for fs.truncate() live
  • Add a test that passes when given a string for the length to truncate by

6. Reviewing Filer’s documentation states that we have to run npm install to download dependencies:

7. Nice — now let’s make sure that our own version of Filer is working by executing the unit tests using npm test. All tests should succeed:

8. With a confirmed working codebase, let’s create a branch to perform our work on. This will ensure that we can work in parallel with others (who will be performing work on different branches). I’ll create a branch called issue-499 with git checkout -b issue-499:

Now we’ll need to find where the tests for fs.truncate() live. Luckily, VSCode has a feature where I can recursively search the current directory. I’ll make use of this by pressing Shift + Cmd + F on my Macbook:

UH OH! I see fs.truncate() being mentioned but those results aren’t what I’m looking for. Ideally, the file name should have truncate in it if it contains the tests for fs.truncate(), right? Let’s try again — this time removing the pair of parenthesis — ( and ):

Sweet! Adjusting our search results helped us to find fs.truncate.spec.js which has all of the tests we were looking for!

9. Let’s use an existing test as ours will closely resemble the ones that are currently there. We’ll need to pass a string, like 'notAnInteger' for the length parameter:

10. Let’s check that our test passes by running npm run test again. Uh oh — it looks like something is wrong:

11. We need to investigate where the definition for filer’s fs.truncate is. To save some time, searching for truncate provides us with a file called implementation.js. There seems to be a section of the truncate_file function that has the implementation for what we’re looking for. I noticed that there was no check to see if the length parameter was an actual integer, so I added it in using Number.IsInteger():

12. Running the tests after the fix shows that we’ve successfully passed all test cases!

13. We’ve updated the functionality and the respective test to not accept a non-numeric value! We’re ready to push our changed to our forked repo and then open a PR (Pull Request) to request that our code be merged into the original Filer repo (aka, the upstream repo).

Let’s begin by checking what files we’ve changed and only adding those that are relevant to a new commit:

  1. git add src/filesystem/implementation.js
  2. git add tests/spec/fs.truncate.spec.js

If you’re unfamiliar to what a “commit” is, think of it like a “snapshot” of your code at a certain point in time. This way, we can go back in time if we need to.

Let’s add the commit message with something relevant like…

Fixes #499: Add a test for truncate when length is not a number

After we’re done, a simple git push -u origin issue-499 will upload our code to our forked version of the repository. One last thing to do is open a pull request to have our changes reviewed and merged.

14. From our forked version of Filer, we can easily open a new PR:

And that’s it! We’ve hopefully squashed this bug but we’ll have to wait until someone else can review it. Pr’s are an iterative process that takes multiple rounds of review before they’re usually accepted and merged.

Check out the PR on GitHub here!

Final Thoughts

The great thing about open source is that there exists a process behind it all. From my own experience, the more exposure to different projects, the wider your problem solving skillset grows.

Cheers,

Sean 👨🏽‍💻

Open Source @ Seneca

The trials, tribulations and triumphs of a Software Development student

Sean Prashad

Written by

Programming, Powerlifting && Pizza

Open Source @ Seneca

The trials, tribulations and triumphs of a Software Development student

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade