Great work!

XP to next level

BugEater

Whitespace Validation

Beginner Manual QA 36 XP 52 min

Updated: 07/07/2026

Start Module

The Bug That Isn't a Bug — Until It Is

A user registers with the username admin. Note the two leading spaces. The system accepts it. Later, a security check asks: "Is this user admin?" The answer is no — string equality fails. The logs show a successful login under admin that bypasses a block on admin. The lead says "that can't happen" because visually the username looks identical.

This is the whitespace class of bugs: invisible, visually indistinguishable, and entirely reproducible once you know where to look.

The Whitespace Character Family

When developers say "whitespace," they usually mean the space bar. In reality, "whitespace" is a category of characters, and the membership varies by context:

Character Unicode Appearance Notes
Space U+0020 The one everyone tests
Tab U+0009 Often treated as whitespace
Non-breaking space U+00A0 Looks identical to space; often NOT trimmed
Zero-width space U+200B invisible Zero width — completely invisible
Zero-width joiner U+200D invisible Used in emoji sequences
Line feed U+000A newline Usually stripped from single-line inputs
Carriage return U+000D newline Often paired with LF
Form feed U+000C invisible Rare but exists
Ideographic space U+3000   Full-width space; often NOT trimmed

Most systems trim U+0020 and U+0009 from the start and end of strings. Very few trim U+00A0, U+200B, or U+3000. This is where the bugs live.

The Three Whitespace Bug Patterns

Pattern 1 — The Accidental Trim

The system trims input before storing it. A user submits admin — the system stores admin. If the user later logs in with admin again, it matches. But if a different validation checks the raw submitted value before trimming, the two checks disagree. Form validation says "8 characters" (including spaces). Database says "5 characters". Minimum-length checks fail on what the user sees as a valid username.

Pattern 2 — The Missing Trim

The system does not trim input. A user submits admin with a trailing space from copy-pasting. The display looks correct. But every equality check against admin fails. Forgotten password emails go to admin — no match found. Two-factor auth lookups fail. The bug is intermittent and user-specific, making it very hard to reproduce in testing unless you specifically test trailing whitespace.

Pattern 3 — The Invisible Character

The user's input tool (a mobile keyboard, a browser autocomplete, a clipboard from a PDF) inserts a U+200B (zero-width space) or U+00A0 (non-breaking space) alongside visible text. Standard trim() does not remove these. The system stores admin​ (with an invisible zero-width space). The user can never log in again by typing their username manually — the stored value contains a character they cannot type.

Why Trim Is Not Enough

The Java String.trim() method removes characters with code points ≤ U+0020. It removes regular spaces and tabs but not U+00A0, U+200B, or U+3000. JavaScript's String.prototype.trim() follows a broader definition (Unicode's "White_Space" property) but also misses many invisible characters.

If your application has international users — or if users can paste text from any source — trim() alone is insufficient. Comprehensive whitespace stripping requires an explicit list of code points to remove, or a regex based on the Unicode White_Space property.

Testing for Whitespace Bugs

The inputs you want are rarely generated naturally. You need to construct them:

  • Copy-paste from a source that adds invisible characters (PDFs, Word documents, messaging apps)
  • Use browser developer tools to set an input's value programmatically
  • Use a testing tool that sends raw HTTP requests with exact byte sequences
  • Insert non-breaking spaces: on macOS, Option+Space; on Linux, Compose+space+space

For each input field, test:

  1. One leading space
  2. One trailing space
  3. One leading + one trailing space
  4. Only spaces (should this be treated as empty?)
  5. Tab character
  6. Non-breaking space (U+00A0)
  7. Zero-width space (U+200B)

After submission, check not just the response but also: does the value display correctly? Can you retrieve the exact same value later? Can equality checks against a clean version succeed?

The Internal Space Case

A separate but related case: spaces within the string. ad min is different from admin. Whether internal spaces are valid depends on the field. A "full name" field should allow them. A "username" field usually should not.

Systems that silently strip internal spaces (treating ad min as admin) create a different class of bug: two users who submit different strings might end up with the same stored value, causing duplicate key errors or silent overwrites.

Systems that reject internal spaces with a clear error message are doing it right from a testing perspective — at least the behavior is deterministic and verifiable.

Challenge: Phantom Spaces

The practice challenge for this module presents a username field. Your goal is to discover all the cases — how the system behaves with each variant of whitespace input. Some inputs succeed, some trigger errors, and one or two reveal interesting trimming behavior.

The challenge has no bugs: every behavior is intentional. Your task is to map the complete behavior surface of a whitespace-aware validator.

Module content