libexif Validation
Port build from safelibs/port-libexif at commit 3601324a5caa (release build-3601324a5caa)
Tests
libexif compile link smoke Original / libexif / compile-link-smoke Passed
Invalid EXIF data handling Original / libexif / invalid-data-handling Passed
JPEG EXIF C API parse Original / libexif / jpeg-exif-c-api-parse Passed
Maker note data handling Original / libexif / maker-note-handling Passed
Tag lookup and value formatting Original / libexif / tag-lookup-value-formatting Passed
exif color space tag Original / libexif / usage-exif-cli-color-space-tag Passed
exif custom rendered tag Original / libexif / usage-exif-cli-custom-rendered-tag Passed
exif --debug --ifd=GPS scoped trace Original / libexif / usage-exif-cli-debug-ifd-gps-trace Passed
Runs the exif client with --debug --ifd=GPS against the canon fixture and verifies the loader still emits its scanning banner and the IFD 0 entry count alongside the user-friendly error indicating the GPS IFD has no entries.
exif --debug emits the ExifLoader byte-count trace Original / libexif / usage-exif-cli-debug-loader-byte-count Passed
Runs exif with --debug against the canon fixture and verifies the loader-side trace lines appear, including the "ExifLoader: Scanning" line with a positive byte count, the "ExifData: Parsing" line with its own byte count, the "Found EXIF header at start." marker, and the per-IFD entry count line for IFD 0. Pins libexif's verbose debug surface on Ubuntu 24.04 for callers that capture loader telemetry.
exif --debug emits loader trace Original / libexif / usage-exif-cli-debug-loader-trace Passed
Runs the exif client with --debug and verifies the loader announces the IFD 0 entry count and named entries from the canon fixture.
exif --debug --machine-readable preserves the tab-delimited record stream Original / libexif / usage-exif-cli-debug-machine-readable-combo Passed
Runs the exif client with --debug --machine-readable against the canon fixture and verifies the loader trace is emitted to stderr while stdout still carries the standard tab-delimited Manufacturer/Canon and Model/Canon PowerShot S70 records, asserting --debug does not corrupt --machine-readable framing.
exif --debug --machine-readable --tag=Model triple-flag composition Original / libexif / usage-exif-cli-debug-machine-tag-triple-flag Passed
Runs the exif client with the three flags --debug, --machine-readable, and --tag=Model combined against the canon fixture and verifies the loader trace lines reach stderr (or fall back to stdout) while the requested Model record still appears in machine-readable form on stdout, asserting that scoping with --tag does not suppress --debug diagnostics and that --debug does not corrupt single-tag --machine-readable output.
exif --debug --no-fixup still emits loader trace Original / libexif / usage-exif-cli-debug-no-fixup-loader-trace Passed
Runs the exif client with --debug --no-fixup against the canon fixture and verifies the loader still announces the EXIF header, IFD 0 offset, the 9-entry count, and the named Make and Model entries even with the no-fixup switch present.
exif --debug --tag=DateTimeOriginal preserves the scoped readout Original / libexif / usage-exif-cli-debug-tag-datetime-original Passed
Runs the exif client with the combined --debug and --tag=DateTimeOriginal flags against the canon fixture and verifies the loader trace reaches the combined output stream while the scoped pretty-print still surfaces the DateTimeOriginal Value line carrying the literal 2009:10:10 16:42:32 timestamp. The combined output is also compared against a clean (non-debug) scoped run to confirm --debug does not drop or rewrite the scoped Value line.
exif on a directory target fails with the not-readable diagnostic Original / libexif / usage-exif-cli-directory-target-error Passed
Invokes the exif client against a directory path (not a regular file) and verifies the client exits non-zero with the canonical "is not readable or does not contain EXIF data" diagnostic naming the directory, matching libexif's read-as-file behavior on Ubuntu 24.04.
exif exposure mode tag Original / libexif / usage-exif-cli-exposure-mode-tag Passed
exif exposure time tag Original / libexif / usage-exif-cli-exposure-time Passed
exif extract then remove-thumbnail then re-extract sequence Original / libexif / usage-exif-cli-extract-remove-reextract-state Passed
Walks the canon fixture through extract-thumbnail, remove-thumbnail on a copy, and a re-extract attempt against the stripped copy, verifying the first extraction produces a non-empty file, the strip succeeds, and the second extraction fails with a does not contain a thumbnail diagnostic, while a fresh extract from the original still succeeds.
exif --extract-thumbnail is byte-stable across re-runs Original / libexif / usage-exif-cli-extract-thumbnail-bytewise-equal Passed
Runs exif --extract-thumbnail twice against the canon fixture writing to two distinct output files, verifies both are non-empty, and asserts that the two extracted thumbnail files are byte-for-byte equal so callers can rely on deterministic re-extraction.
exif --extract-thumbnail honors a precise --output path Original / libexif / usage-exif-cli-extract-thumbnail-explicit-output-path Passed
Runs the exif client with --extract-thumbnail and a specific --output path containing a non-default filename and verifies the resulting JPEG lands at exactly that path (and only that path), carries the FFD8FF SOI magic, has a non-trivial size, and that exif's own diagnostic line names the requested path. Pins the path-honoring contract for dependent clients that ask for a precise output filename rather than the conventional thumbnail.jpg sibling.
exif extracted thumbnail JPEG magic Original / libexif / usage-exif-cli-extract-thumbnail-jpeg-magic Passed
Extracts the embedded thumbnail with exif --extract-thumbnail and verifies the output begins with the FFD8FF JPEG SOI marker.
exif --extract-thumbnail writes into a pre-created nested directory Original / libexif / usage-exif-cli-extract-thumbnail-nested-output-dir Passed
Creates a multi-level nested directory tree, runs exif --extract-thumbnail with --output pointing into the deepest leaf, and verifies the thumbnail JPEG lands at the requested path with FFD8FF magic, while a parallel run against a non-existent leaf without prior mkdir fails with a write diagnostic and produces no file.
exif --extract-thumbnail emits a JPEG with SOI and EOI markers Original / libexif / usage-exif-cli-extract-thumbnail-soi-eoi-bytes Passed
Extracts the embedded thumbnail from the canon fixture with exif --extract-thumbnail and verifies the file begins with the FFD8FF JPEG SOI marker and ends with the FFD9 JPEG EOI marker, asserting the extracted thumbnail is a complete, framed JPEG rather than a truncated payload.
exif CLI thumbnail extraction Original / libexif / usage-exif-cli-extract-thumbnail Passed
exif Flash tag Original / libexif / usage-exif-cli-flash-tag Passed
exif FNumber tag Original / libexif / usage-exif-cli-fnumber Passed
exif focal length tag Original / libexif / usage-exif-cli-focal-length-tag Passed
exif --help lists every documented switch Original / libexif / usage-exif-cli-help-option-banner Passed
Runs exif --help and verifies the help screen advertises the canonical option set including --tag, --ifd, --list-tags, --show-mnote, --remove, --extract-thumbnail, --insert-thumbnail, --no-fixup, --output, --set-value, --create-exif, --machine-readable, --width, --xml-output, and --debug, exactly as shipped on Ubuntu 24.04.
exif --ids --machine-readable cross-check Original / libexif / usage-exif-cli-ids-machine-readable-cross-check Passed
Runs the exif client with --ids --machine-readable on the canon fixture, parses the tab-delimited stream, and cross-checks the value column for tag id 0x0112 (Orientation) against the corresponding plain --machine-readable lookup to confirm both modes report identical Right-top text.
exif --ids reports Orientation hex tag id Original / libexif / usage-exif-cli-ids-orientation-hex Passed
Runs the exif client with --ids to print numeric tag identifiers and verifies the Orientation tag id 0x112 with its Right-top value.
exif IFD EXIF exposure time Original / libexif / usage-exif-cli-ifd-exif-exposure-time Passed
exif IFD EXIF F number Original / libexif / usage-exif-cli-ifd-exif-fnumber Passed
exif CLI EXIF IFD Original / libexif / usage-exif-cli-ifd-exif Passed
exif --ifd=GPS pretty readout is graceful on a GPS-less fixture Original / libexif / usage-exif-cli-ifd-gps-pretty-empty Passed
Runs the exif client with --ifd=GPS (without --machine-readable) against the canon fixture which carries no GPS metadata, and verifies the readout exits cleanly without crashing, emits no GPS-tag labels (GPSLatitude, GPSLongitude, GPSAltitude, GPSTimeStamp), and does not leak unrelated IFD 0 / EXIF IFD labels (Manufacturer, F-Number, Color Space) into the GPS-scoped output. Pins the graceful empty contract for the human-readable IFD scope when GPS data is absent.
exif IFD1 compression Original / libexif / usage-exif-cli-ifd-one-compression-batch11 Passed
exif IFD1 resolution unit Original / libexif / usage-exif-cli-ifd-one-resolution-unit-batch11 Passed
exif IFD zero make Original / libexif / usage-exif-cli-ifd-zero-make Passed
exif IFD0 model tag Original / libexif / usage-exif-cli-ifd-zero-model Passed
exif IFD0 orientation tag Original / libexif / usage-exif-cli-ifd-zero-orientation Passed
exif IFD zero listing Original / libexif / usage-exif-cli-ifd-zero Passed
exif --insert-thumbnail roundtrip preserves bytes Original / libexif / usage-exif-cli-insert-thumbnail-roundtrip Passed
Builds a minimal JPEG, inserts it into a copy of the canon fixture with --insert-thumbnail, then re-extracts the thumbnail and asserts byte-for-byte equality.
exif --tag rejects an unknown tag name Original / libexif / usage-exif-cli-invalid-tag-name-error Passed
Runs exif --tag=NotARealTag against the canon fixture and verifies the client exits non-zero and prints the canonical "Invalid tag" diagnostic naming the bogus token. Pins libexif's argp-side validation of --tag values on Ubuntu 24.04 against accidental client typos.
exif list color space Original / libexif / usage-exif-cli-list-color-space Passed
exif list focal length Original / libexif / usage-exif-cli-list-focal-length Passed
Lists EXIF metadata for the sample JPEG and verifies the focal length line and decoded value are present.
exif list orientation Original / libexif / usage-exif-cli-list-orientation Passed
Lists EXIF metadata for the sample JPEG and verifies the orientation line and decoded value are present.
exif list pixel dimensions Original / libexif / usage-exif-cli-list-pixel-dimensions Passed
exif -l -i -m emits the IFD support grid with hex IDs Original / libexif / usage-exif-cli-list-tags-machine-ids-grid Passed
Runs exif with --list-tags combined with --ids and --machine-readable against the canon fixture and verifies the client emits the documented IFD support grid pinning the column header set (0, 1, EXIF, GPS, Interop), the hex tag id format (0x0001), and the presence of a known Interoperability tag row that locks the libexif Ubuntu 24.04 list-tags reference grid that callers parse to map tag-id-to-IFD support.
exif CLI lists camera tags Original / libexif / usage-exif-cli-list-tags Passed
exif machine color space Original / libexif / usage-exif-cli-machine-color-space Passed
exif machine DateTimeOriginal Original / libexif / usage-exif-cli-machine-datetime-original Passed
exif machine DateTime Original / libexif / usage-exif-cli-machine-datetime Passed
exif machine ExifVersion Original / libexif / usage-exif-cli-machine-exif-version Passed
exif machine FlashPixVersion Original / libexif / usage-exif-cli-machine-flashpix-version Passed
Reads FlashPixVersion via exif --machine-readable and verifies that FlashPix Version 1.0 is reported.
exif machine focal length Original / libexif / usage-exif-cli-machine-focal-length Passed
exif machine focal plane X resolution Original / libexif / usage-exif-cli-machine-focal-plane-x-resolution-batch11 Passed
exif --machine-readable --ifd=EXIF emits FlashPixVersion Original / libexif / usage-exif-cli-machine-ifd-exif-flashpix Passed
Runs the exif client with --machine-readable --ifd=EXIF and verifies the EXIF IFD tab-delimited stream contains FlashPixVersion 1.0 plus other EXIF-IFD tags while excluding the IFD 0 Manufacturer entry.
exif --machine-readable --ifd=GPS reports empty GPS IFD Original / libexif / usage-exif-cli-machine-ifd-gps-empty Passed
Runs the exif client with --machine-readable --ifd=GPS against the canon fixture which has no GPS metadata and verifies the stream emits only the synthetic ThumbnailSize entry without EXIF or IFD 0 tags.
exif --machine-readable --ifd=0 emits IFD 0 tags Original / libexif / usage-exif-cli-machine-ifd-zero-tabs Passed
Runs the exif client with --machine-readable --ifd=0 and verifies the IFD 0 tab-delimited stream contains the Manufacturer and Model entries while excluding EXIF-IFD-only tags such as F-Number.
exif --machine-readable parses into shell key=value pairs Original / libexif / usage-exif-cli-machine-key-value-shell-parse Passed
Runs the exif client with --machine-readable and pipes the tab-delimited stream through awk to produce a key=value file, then verifies that programmatic lookups for Manufacturer, Model, Color Space, and Exif Version recover the expected literal values.
exif machine-readable make Original / libexif / usage-exif-cli-machine-make Passed
exif machine-readable maker note Original / libexif / usage-exif-cli-machine-maker-note-thumbnail Passed
Emits full machine-readable EXIF metadata and verifies Maker Note and ThumbnailSize rows from the structured output.
exif machine MeteringMode Original / libexif / usage-exif-cli-machine-metering-mode Passed
Reads MeteringMode via exif --machine-readable and verifies that the Pattern metering mode is reported.
exif machine model Original / libexif / usage-exif-cli-machine-model-value Passed
exif machine-readable model Original / libexif / usage-exif-cli-machine-model Passed
exif machine orientation Original / libexif / usage-exif-cli-machine-orientation Passed
exif machine PixelXDimension Original / libexif / usage-exif-cli-machine-pixel-x-dimension Passed
exif machine PixelYDimension Original / libexif / usage-exif-cli-machine-pixel-y-dimension Passed
Reads PixelYDimension via exif --machine-readable and verifies the 480 pixel height is reported.
exif --machine-readable populates a bash associative array Original / libexif / usage-exif-cli-machine-readable-associative-array Passed
Runs the exif client with --machine-readable against the canon fixture, parses the tab-delimited stream into a bash associative array indexed by tag name, and verifies that array lookups for Manufacturer, Model, Color Space, Orientation, and Compression each yield the expected canonical literal values, demonstrating the machine-readable format is robust enough for shell-side declare -A consumers.
exif --machine-readable --no-fixup combo emits Make Original / libexif / usage-exif-cli-machine-readable-no-fixup-make Passed
Combines --machine-readable with --no-fixup against the canon fixture and verifies the tab-delimited stream still reports the Manufacturer entry as Canon, that --tag=Make produces only Canon on its own line, and that the field-count and value match the plain --machine-readable run.
exif CLI machine output Original / libexif / usage-exif-cli-machine-readable Passed
exif machine RelatedImageLength Original / libexif / usage-exif-cli-machine-related-image-length Passed
Reads RelatedImageLength via exif --machine-readable and verifies the 480 pixel height is reported for the sample image.
exif machine RelatedImageWidth Original / libexif / usage-exif-cli-machine-related-image-width Passed
Reads RelatedImageWidth via exif --machine-readable and verifies the 640 pixel width is reported for the sample image.
exif machine ResolutionUnit Original / libexif / usage-exif-cli-machine-resolution-unit Passed
Reads ResolutionUnit via exif --machine-readable and verifies that inch units are reported for the sample image.
exif machine SceneCaptureType Original / libexif / usage-exif-cli-machine-scene-capture Passed
Reads SceneCaptureType via exif --machine-readable and verifies that the Landscape scene capture type is reported.
exif --machine-readable --tag=ExposureTime emits 1 sec. Original / libexif / usage-exif-cli-machine-tag-exposure-time Passed
Runs the exif client with --machine-readable --tag=ExposureTime against the canon fixture and verifies the scoped run emits exactly one line carrying the 1 sec. value, while a parallel scan of the unscoped --machine-readable stream confirms the same value is reachable when filtered for the Exposure Time row.
exif --machine-readable --tag=Make returns the explicit Canon scalar Original / libexif / usage-exif-cli-machine-tag-make-explicit Passed
Runs the exif client with --machine-readable --tag=Make against the canon fixture and verifies the streamed output is a single tab-delimited record whose payload is exactly the literal Canon manufacturer string. The probe pins the explicit-value contract for dependent clients that key off Make, ruling out localized labels, multi-row framing, or accidental empty payloads when --tag is combined with --machine-readable.
exif machine X resolution Original / libexif / usage-exif-cli-machine-x-resolution-batch11 Passed
exif machine Y resolution Original / libexif / usage-exif-cli-machine-y-resolution-batch11 Passed
exif machine YCbCrPositioning Original / libexif / usage-exif-cli-machine-ycbcr-positioning-batch11 Passed
exif CLI maker note Original / libexif / usage-exif-cli-maker-note Passed
exif metering mode tag Original / libexif / usage-exif-cli-metering-mode-tag Passed
exif accepts multiple positional file arguments Original / libexif / usage-exif-cli-multiple-files-positional Passed
Runs the exif client with two positional JPEG paths that point at the same canon fixture and verifies the client emits one EXIF tags table per argument by counting the per-file header banner. Pins libexif's positional file iteration contract on Ubuntu 24.04 for callers that batch multiple JPEGs in a single invocation.
exif rejects JPEG without EXIF data Original / libexif / usage-exif-cli-no-exif-error Passed
Synthesises a minimal JFIF JPEG with no EXIF segment, runs the exif client against it, and verifies the client exits non-zero and prints the does not contain EXIF data diagnostic naming the synthesised file.
exif --no-fixup keeps Make tag readable Original / libexif / usage-exif-cli-no-fixup-tag-make Passed
Runs the exif client with --no-fixup so that no automatic tag repair is performed and verifies that the Make tag still parses to Canon from the canon fixture.
exif against canon fixture exposes no XMP-derived tags Original / libexif / usage-exif-cli-no-xmp-block-canon-fixture Passed
Runs the exif client against the canon fixture in machine-readable mode and verifies the streamed records contain none of the XMP-derived field names a dependent client might expect to see when an XMP packet is present (XMPToolkit, dc:creator, xmp:CreatorTool, photoshop:DateCreated). libexif itself does not parse XMP, but a fixture that carries an XMP APP1 segment can cause clients to scrape XMP names out of the JPEG; this testcase pins the canon fixture as XMP-free so other testcases can rely on that.
exif on a nonexistent path reports the not-readable diagnostic Original / libexif / usage-exif-cli-nonexistent-file-error Passed
Runs the exif client against a path that does not exist on disk and verifies the client exits with status 1, names the missing path verbatim in the diagnostic, and prints the canonical "is not readable or does not contain EXIF data" message that callers parse to distinguish IO failures from clean runs on Ubuntu 24.04.
exif orientation tag Original / libexif / usage-exif-cli-orientation-tag Passed
exif pixel dimensions Original / libexif / usage-exif-cli-pixel-dimensions Passed
exif related image length Original / libexif / usage-exif-cli-related-image-length Passed
exif related image width Original / libexif / usage-exif-cli-related-image-width Passed
exif --remove --tag=DateTime --ifd=0 strips the top-level timestamp Original / libexif / usage-exif-cli-remove-datetime-ifd-zero Passed
Copies the canon JPEG fixture to a tmpdir and removes the top-level DateTime tag from IFD 0 with exif --remove, then verifies the rewritten file no longer reports DateTime via --tag=DateTime, that IFD 0 entry count drops from 9 to 8 in the --debug trace, and that the unrelated Model tag remains intact and equal to the original readout.
exif --remove decrements IFD 0 entry count Original / libexif / usage-exif-cli-remove-decrements-ifd-zero-entries Passed
Removes the Make tag from a copy of the canon JPEG and confirms via --debug that IFD 0 now reports 8 entries instead of the original 9.
exif --remove --ifd=1 invalidates thumbnail Compression value Original / libexif / usage-exif-cli-remove-ifd1-then-thumbnail-tag-gone Passed
Removes IFD 1 from a copy of the canon fixture using exif --remove --ifd=1, then re-reads --tag=Compression --ifd=1 against the rewritten file and confirms the Compression entry value collapses to the libexif Internal error (unknown value 0) marker rather than the original JPEG compression label, while IFD 0 Make remains Canon and the original fixture still reports JPEG compression.
exif --remove drops Make from a copy Original / libexif / usage-exif-cli-remove-make-tag Passed
Copies the canon JPEG fixture to a tmpdir and removes the Make tag with exif --remove, verifying the Make tag is gone while Model remains intact.
exif --remove Make leaves the embedded thumbnail intact Original / libexif / usage-exif-cli-remove-make-then-extract-thumbnail Passed
Strips the IFD 0 Make tag from a copy of the canon fixture with exif --remove --tag=Make, then runs --extract-thumbnail against the rewritten file and verifies the thumbnail still extracts byte-for-byte identically to the thumbnail extracted from the untouched original, confirming Make removal and thumbnail extraction are independent.
exif --remove --tag=Copyright handles tag absent from fixture Original / libexif / usage-exif-cli-remove-missing-copyright Passed
Confirms the canon fixture has no Copyright tag in IFD 0, then runs exif --remove --tag=Copyright --ifd=0 against a copy and checks that the client either errors out cleanly or no-ops without corrupting the file, with IFD 0 still loading 9 entries afterwards.
exif --remove-thumbnail then --extract-thumbnail reports absence Original / libexif / usage-exif-cli-remove-thumbnail-then-extract Passed
Strips the embedded thumbnail from a copy of the canon fixture with --remove-thumbnail, then runs --extract-thumbnail against the rewritten file and verifies the client exits non-zero with a does not contain a thumbnail diagnostic and produces no output file, while the original fixture still yields a thumbnail.
exif scene capture type Original / libexif / usage-exif-cli-scene-capture-tag Passed
exif --set-value rewrites DateTimeOriginal Original / libexif / usage-exif-cli-set-value-datetime-original-readback Passed
Uses exif --set-value with --ifd=EXIF to overwrite DateTimeOriginal on a copy of the canon fixture and confirms the new timestamp is reported on readback.
exif --set-value cross-validated via --machine-readable bytes Original / libexif / usage-exif-cli-set-value-machine-readable-bytes Passed
Rewrites the Make tag on a copy of the canon fixture with --set-value, reads the new value back through --tag=Make, then runs --machine-readable --tag=Make against the rewritten file and compares the exact byte sequence on stdout to the literal new value to confirm the rewrite is observable through both rendering modes.
exif --set-value rewrites Make tag Original / libexif / usage-exif-cli-set-value-make-readback Passed
Uses exif --set-value with --ifd=0 to replace the Make tag on a copy of the canon fixture and reads the new value back from the rewritten JPEG.
exif --set-value rewrites Orientation Short tag Original / libexif / usage-exif-cli-set-value-orientation-readback Passed
Uses exif --set-value with --ifd=0 --tag=Orientation to replace the SHORT-typed Orientation entry on a copy of the canon fixture (4 -> 1, "Bottom-left" to "Top-left") and reads the new value back from the rewritten JPEG. The original fixture is verified untouched and the rewritten copy must report Orientation=1 with the human-readable "Top-left" label, pinning libexif's set-value path for non-ASCII (Short) tags on Ubuntu 24.04.
exif --set-value rewrites rational ExposureTime Original / libexif / usage-exif-cli-set-value-rational-exposure Passed
Uses exif --set-value with --ifd=EXIF to overwrite the rational ExposureTime tag using two-component numerator/denominator input on a copy of the canon fixture and verifies the rewritten JPEG reports the new 1/250 sec value while the original remains 1 sec.
exif -e -o short-flag form extracts the thumbnail Original / libexif / usage-exif-cli-short-flag-extract-thumbnail Passed
Invokes exif using the short-flag form (-e for --extract-thumbnail and -o for --output) instead of the long-flag form and verifies the client writes the same 4-byte thumbnail payload to the requested path with the canonical "Wrote file" diagnostic. Pins libexif's short-flag parity on Ubuntu 24.04 so dependent clients that prefer terse argv can rely on identical behavior.
exif --show-description prints DateTime help Original / libexif / usage-exif-cli-show-description-datetime Passed
Asks the exif client for the DateTime tag description with --show-description --ifd=0 and verifies the standard EXIF documentation string is reported.
exif --show-description FNumber in IFD EXIF Original / libexif / usage-exif-cli-show-description-fnumber-exif Passed
Invokes exif --show-description --ifd=EXIF --tag=FNumber on the canon fixture and verifies libexif resolves the EXIF subdirectory binding so the description names the F-Number tag with hex id 0x829d and the canonical short description The F number, distinguishing the tag from a same-named entry in IFD 0.
exif --show-description GPSLatitude in GPS IFD Original / libexif / usage-exif-cli-show-description-gps-latitude Passed
Invokes exif --show-description --ifd=GPS --tag=GPSLatitude against the canon fixture and confirms the GPS subdirectory dispatch resolves to tag id 0x0002 with symbolic name GPSLatitude and the libexif documentation snippet expressed as three RATIONAL values giving the degrees, minutes, and seconds.
exif --show-description Orientation in IFD 0 Original / libexif / usage-exif-cli-show-description-orientation-ifd0 Passed
Invokes exif --show-description --ifd=0 --tag=Orientation against the canon fixture and verifies the human readable description references the canonical hex tag id 0x0112, the symbolic Orientation name, and the substring image orientation viewed in terms of rows and columns shipped by libexif.
exif -s without --ifd demands an IFD Original / libexif / usage-exif-cli-show-description-without-ifd-error Passed
Runs exif --show-description --tag=Orientation against the canon fixture without specifying an --ifd and verifies the client refuses to disambiguate, exiting non-zero with the canonical "You need to specify an IFD!" diagnostic. This pins the libexif Ubuntu 24.04 behavior that show-description requires an explicit IFD scope when the requested tag is registered in more than one IFD.
exif maker note firmware Original / libexif / usage-exif-cli-show-mnote-firmware-batch11 Passed
exif --show-mnote --ids prefixes rows with 0x0001 hex tag ids Original / libexif / usage-exif-cli-show-mnote-ids-hex-prefix Passed
Runs exif --show-mnote --ids on the canon fixture and confirms the maker-note dump still announces 96 entries with MakerNote contains 96 values and renders Canon mnote rows using hex tag ids prefixed with 0x rather than the symbolic Macro Mode label, with the very first 0x0001 row decoded as the Normal value and a Superfine Quality row also reachable.
exif --show-mnote --machine-readable emits tab-separated rows Original / libexif / usage-exif-cli-show-mnote-machine-readable-tabs Passed
Runs exif --show-mnote --machine-readable on the canon fixture and verifies the maker-note dump uses the canonical name<TAB>value layout with no plus-or-pipe separator characters and includes the Canon-specific Macro Mode, Quality, Flash Mode, and Image Size lines reachable through the libexif Canon mnote backend.
exif --tag=ApertureValue auto-finds the APEX aperture Original / libexif / usage-exif-cli-tag-aperture-value Passed
Runs the exif client with --tag=ApertureValue against the canon fixture and verifies the readout includes the ApertureValue label and a non-empty Value line carrying the composed APEX rendering, then re-runs with --machine-readable to confirm the same scalar appears as a single tab-delimited record. ApertureValue is a composed APEX tag whose human form is the f/N rendering libexif derives from the rational stored in the EXIF IFD.
exif --tag=0x0112 selects Orientation by numeric ID Original / libexif / usage-exif-cli-tag-by-hex-id-orientation Passed
Runs exif with --tag specified as the bare hexadecimal Orientation tag id (0x0112) and verifies the client resolves the numeric id to the same entry it reports under the symbolic name, including the IFD '0' provenance line, the format Short triple, the single-component descriptor, and the human-readable Right-top value from the canon fixture.
exif --ids --tag=ColorSpace reports 0xa001 Original / libexif / usage-exif-cli-tag-color-space-ids-hex Passed
Runs the exif client with --ids --tag=ColorSpace against the canon fixture and verifies the EXIF tag id for ColorSpace is reported as 0xa001 alongside the symbolic name and the sRGB value, asserting the numeric id and decoded value live on the same readout.
exif tag color space via sed Original / libexif / usage-exif-cli-tag-color-space-sed Passed
Extracts the exif ColorSpace tag value through shell text processing and verifies the parsed color space.
exif tag components configuration Original / libexif / usage-exif-cli-tag-components-configuration Passed
Reads the ComponentsConfiguration EXIF tag with the exif client and verifies that the expected Y Cb Cr channel order is reported.
exif tag compression JPEG Original / libexif / usage-exif-cli-tag-compression-jpeg Passed
Reads the Compression EXIF tag with the exif client and verifies that JPEG compression is reported for the sample image.
exif --tag=Compression cross-checks human and machine-readable JPEG mode Original / libexif / usage-exif-cli-tag-compression-machine-cross-check Passed
Reads the Compression tag with the exif client in both default text mode and --machine-readable mode against the canon fixture, asserts the human-readable form contains the JPEG compression label while the machine-readable form is the bare JPEG compression record, and asserts the two outputs differ so the formatting modes really are independent.
exif --tag=DateTime cross-checked against the 0x0132 hex id Original / libexif / usage-exif-cli-tag-datetime-ids-hex Passed
Reads the top-level DateTime tag with the exif client both by symbolic name and via the --ids dump that prints numeric tag ids in hex against the canon fixture, verifying the canonical timestamp 2009:10:10 16:42:32 surfaces from the symbolic --tag=DateTime call and that the --ids listing of IFD 0 contains the 0x0132 DateTime tag id paired with the same timestamp.
exif CLI DateTimeOriginal tag Original / libexif / usage-exif-cli-tag-datetime-original Passed
exif tag date time via sed Original / libexif / usage-exif-cli-tag-datetime-sed Passed
Extracts the exif DateTime tag value through shell text processing and verifies the parsed timestamp.
exif CLI DateTime tag Original / libexif / usage-exif-cli-tag-datetime Passed
exif tag digital zoom ratio Original / libexif / usage-exif-cli-tag-digital-zoom-ratio Passed
Reads the DigitalZoomRatio EXIF tag with the exif client and verifies that the expected 1.0000 ratio is reported.
exif --tag=ExifOffset reports the EXIF IFD pointer tag Original / libexif / usage-exif-cli-tag-exif-offset-pointer Passed
Runs the exif client with --tag=ExifOffset against the canon fixture and verifies the readout includes a Value line whose payload is non-empty. ExifOffset is the IFD 0 pointer tag (0x8769) that libexif uses to locate the EXIF sub-IFD, so any well-formed JPEG with EXIF metadata exposes it. The machine-readable probe is also verified to emit a single tab-delimited record so dependent clients can read the pointer scalar without parsing the pretty layout.
exif tag ExifVersion 2.2 Original / libexif / usage-exif-cli-tag-exif-version-22 Passed
Reads the ExifVersion EXIF tag with the exif client and verifies that Exif Version 2.2 is reported.
exif --ids --ifd=EXIF --tag=ExposureTime reports 0x829a Original / libexif / usage-exif-cli-tag-exposure-time-ids-ifd-exif Passed
Runs the exif client with --ids --ifd=EXIF --tag=ExposureTime against the canon fixture and verifies the EXIF-IFD scoped readout reports the numeric tag id 0x829a paired with the ExposureTime symbolic name and the 1 sec. value.
exif tag file source Original / libexif / usage-exif-cli-tag-file-source Passed
Reads the FileSource EXIF tag with the exif client and verifies that the DSC source marker is reported.
exif tag FlashPixVersion 1.0 Original / libexif / usage-exif-cli-tag-flashpix-version-10 Passed
Reads the FlashPixVersion EXIF tag with the exif client and verifies that FlashPix Version 1.0 is reported.
exif --show-description --tag=FlashPixVersion prints help text Original / libexif / usage-exif-cli-tag-flashpix-version-show-description Passed
Asks the exif client for the FlashPixVersion tag description with --show-description --ifd=EXIF and verifies the standard EXIF documentation string is reported including the symbolic name and the explanatory text about the supported FlashPix format version.
exif --tag=FNumber --ifd=EXIF pins f/2.8 Original / libexif / usage-exif-cli-tag-fnumber-ifd-exif-value Passed
Runs the exif client with --tag=FNumber --ifd=EXIF against the canon fixture and verifies the EXIF-scoped readout reports the F-Number label with the exact f/2.8 value, while a parallel probe scoped to --ifd=0 fails because the tag does not live in IFD 0.
exif tag focal length via sed Original / libexif / usage-exif-cli-tag-focal-length-sed Passed
Extracts the exif FocalLength tag value through shell text processing and verifies the parsed focal length.
exif tag interoperability index Original / libexif / usage-exif-cli-tag-interoperability-index Passed
Reads the InteroperabilityIndex EXIF tag with the exif client and verifies that the R98 marker is reported.
exif --tag=0xa005 reports the Interop pointer tag Original / libexif / usage-exif-cli-tag-interoperability-offset-pointer Passed
Runs the exif client with --tag=0xa005 against the canon fixture and verifies the readout includes a Value line whose payload is non-empty. ExifInteroperabilityOffset (0xA005) lives in the EXIF IFD and points at the Interoperability IFD; the canon fixture carries an Interop IFD (its InteroperabilityIndex tag is exercised by the quad-probe testcase), so the pointer tag must resolve. The machine-readable probe is also verified to emit a single tab-delimited record.
exif tag interoperability version Original / libexif / usage-exif-cli-tag-interoperability-version Passed
Reads the InteroperabilityVersion EXIF tag with the exif client and verifies that the expected 0100 version string is reported.
exif --tag scoped read against canon fixture Original / libexif / usage-exif-cli-tag-iso-speed-ratings Passed
Runs the exif client with a --tag flag against the canon fixture and verifies the readout includes the requested tag's label and a non-empty Value line, then re-runs with --machine-readable to confirm the same scalar appears as a tab-delimited record. The canon fixture does not carry an ISOSpeedRatings tag, so this exercises the scoped --tag readout against Manufacturer, which the fixture does carry.
exif tag make via sed Original / libexif / usage-exif-cli-tag-make-sed Passed
Extracts the exif Make tag value through shell text processing and verifies the parsed camera make.
exif CLI make tag Original / libexif / usage-exif-cli-tag-make Passed
exif tag model via sed Original / libexif / usage-exif-cli-tag-model-sed Passed
Extracts the exif Model tag value through shell text processing and verifies the parsed camera model.
exif CLI model tag Original / libexif / usage-exif-cli-tag-model Passed
exif --tag=0x0112 numeric Orientation lookup Original / libexif / usage-exif-cli-tag-numeric-orientation Passed
Looks up the Orientation tag by its numeric tag id 0x0112 instead of by name and verifies the canon fixture reports the Orientation entry with value Right-top, then cross-checks the same record against a name-based --tag=Orientation lookup to confirm the two produce equivalent metadata.
exif tag orientation via sed Original / libexif / usage-exif-cli-tag-orientation-sed Passed
Extracts the exif Orientation tag value through shell text processing and verifies the parsed orientation.
exif pixel X dimension tag Original / libexif / usage-exif-cli-tag-pixel-x-dimension Passed
exif tag pixel x via sed Original / libexif / usage-exif-cli-tag-pixel-x-sed Passed
Extracts the exif PixelXDimension tag value through shell text processing and verifies the parsed width.
exif pixel Y dimension tag Original / libexif / usage-exif-cli-tag-pixel-y-dimension Passed
exif tag pixel y via sed Original / libexif / usage-exif-cli-tag-pixel-y-sed Passed
Extracts the exif PixelYDimension tag value through shell text processing and verifies the parsed height.
exif tag resolution unit inch Original / libexif / usage-exif-cli-tag-resolution-unit-inch Passed
Reads the ResolutionUnit EXIF tag with the exif client and verifies that inch units are reported.
exif --tag=ResolutionUnit consistent with XResolution and YResolution Original / libexif / usage-exif-cli-tag-resolution-unit-paired-resolutions Passed
Reads ResolutionUnit, XResolution, and YResolution from the canon fixture with the exif client, verifies the unit is reported as Inch and that XResolution and YResolution both surface their numeric ratios so callers parsing DPI metadata see all three tags consistently from one tool invocation per tag.
exif tag sensing method Original / libexif / usage-exif-cli-tag-sensing-method Passed
Reads the SensingMethod EXIF tag with the exif client and verifies that the expected sensor type is reported.
exif --tag=ShutterSpeedValue auto-finds the APEX shutter time Original / libexif / usage-exif-cli-tag-shutter-speed-value Passed
Runs the exif client with --tag=ShutterSpeedValue against the canon fixture and verifies the readout includes the ShutterSpeedValue label and a non-empty Value line carrying the composed APEX rendering, then re-runs with --machine-readable to confirm the same scalar appears as a single tab-delimited record. ShutterSpeedValue is the APEX TV counterpart to ExposureTime and libexif renders it from the signed rational stored in the EXIF IFD.
exif --tag without --ifd resolves IFD 0 then EXIF tags Original / libexif / usage-exif-cli-tag-without-ifd-dual-probe Passed
Runs the exif client with --tag and no --ifd argument, first against the IFD 0 Make tag and then against the EXIF-IFD FNumber tag, verifying the client transparently locates each tag in its native IFD and reports Canon for Make and f/2.8 for FNumber, exactly matching the explicitly scoped --ifd readouts.
exif --tag without --ifd auto-finds tags across four IFDs Original / libexif / usage-exif-cli-tag-without-ifd-quad-probe Passed
Runs the exif client with --tag and no --ifd argument against four tags whose native homes span IFD 0 (Model), the EXIF IFD (ExposureTime), IFD 1 (Compression for the thumbnail), and the Interoperability IFD (InteroperabilityIndex), verifying that auto-finding succeeds and reports the expected literal value for each tag without the caller specifying which IFD to scope to.
exif YCbCrPositioning tag Original / libexif / usage-exif-cli-tag-ycbcr-positioning-batch11 Passed
exif --tag=YCbCrPositioning reports the textual position keyword Original / libexif / usage-exif-cli-tag-ycbcr-positioning-co-sited Passed
Reads YCbCrPositioning with the exif client against the canon fixture and verifies the human-readable text mode reports a recognized chroma positioning keyword (either Co-sited or Centered, both spec-defined) and that the same tag in --machine-readable mode also emits that keyword on its bare line.
exif extracted thumbnail size Original / libexif / usage-exif-cli-thumbnail-size Passed
exif rejects a non-JPEG input with a diagnostic Original / libexif / usage-exif-cli-truncated-jpeg-error Passed
Feeds the exif client a payload that has no JPEG SOI marker (a plain text file) and a JPEG-shaped file that contains no EXIF segment, verifying the client surfaces a diagnostic on stdout/stderr and exits non-zero on the non-JPEG input while leaving the original canon fixture parseable.
exif --usage prints brief getopt synopsis Original / libexif / usage-exif-cli-usage-brief-banner Passed
Runs exif --usage and confirms the brief synopsis bundles the short-option cluster Usage: exif [-?vil|sercmxd] and lists the long-option synopsis tokens for --width, --xml-output, --debug, and the trailing OPTION...] file marker, distinct from the verbose --help screen.
exif --version reports a parseable banner Original / libexif / usage-exif-cli-version-banner Passed
Runs the exif client with --version and verifies the banner is a single line containing a numeric major.minor.patch version starting with 0.6, matching the libexif Ubuntu 24.04 baseline 0.6.x series.
exif --version writes only to stdout with a clean stderr Original / libexif / usage-exif-cli-version-channel-separation Passed
Runs the exif client with --version while capturing stdout and stderr separately and verifies the version banner lands exclusively on stdout as a single 0.6.x release identifier with no leading "exif" prefix or trailing copyright lines, and that stderr is empty. This pins the channel separation contract so dependent clients can `read VER < <(exif --version)` without coping with stderr noise.
exif white balance tag Original / libexif / usage-exif-cli-white-balance-tag Passed
exif --width=40 narrows the value column Original / libexif / usage-exif-cli-width-narrow-value-column Passed
Runs exif --width=40 against the canon fixture and verifies the underline separator row sized for a 40-column terminal contains exactly 30 dashes after the plus sign in the value column, matching libexif default tag-name width plus a 30-character value column for narrow terminals.
exif --width=120 widens the value column Original / libexif / usage-exif-cli-width-wide-value-column Passed
Runs exif --width=120 against the canon fixture and verifies the value-column separator row is exactly 98 dashes wide so wide terminals receive a stretched table while the narrow 40-column run still fits in 30 dashes, exposing the WIDTH parameter scaling factor for the table renderer.
exif XML ExifVersion Original / libexif / usage-exif-cli-xml-exif-version-batch11 Passed
exif XML FlashPixVersion Original / libexif / usage-exif-cli-xml-flashpix-version-batch11 Passed
exif XML focal length Original / libexif / usage-exif-cli-xml-focal-length Passed
exif --xml-output --ifd=EXIF emits F-Number element Original / libexif / usage-exif-cli-xml-ifd-exif-fnumber Passed
Runs the exif client with --xml-output --ifd=EXIF against the canon fixture and verifies the EXIF-IFD scoped XML stream wraps the F-Number element with f/2.8 alongside Exposure_Time and Color_Space, and excludes the IFD 0 Manufacturer element.
exif --xml-output --ifd=0 emits Make and Model Original / libexif / usage-exif-cli-xml-ifd-zero-make-model Passed
Restricts XML output to IFD 0 with --xml-output --ifd=0 and verifies the wrapper plus Manufacturer and Model elements for the canon fixture.
exif XML make tag Original / libexif / usage-exif-cli-xml-make Passed
exif XML model via regex Original / libexif / usage-exif-cli-xml-model-regex Passed
Parses exif XML output through Python regex matching and verifies the extracted model tag content.
exif XML model tag Original / libexif / usage-exif-cli-xml-model Passed
exif XML orientation tag Original / libexif / usage-exif-cli-xml-orientation-tag Passed
exif XML orientation tag Original / libexif / usage-exif-cli-xml-orientation Passed
exif --xml-output emits well-formed element names with matching close tags Original / libexif / usage-exif-cli-xml-output-attribute-element-names Passed
Runs the exif client with --xml-output against the canon fixture and asserts the stream surfaces the expected element names (Color_Space, Flash, Pixel_X_Dimension, File_Source) with both opening and closing tags, that every opening tag in the output has a matching closing tag count, and that there is at least one element so the XML output is structurally non-empty.
exif --xml-output exposes Orientation alongside other elements Original / libexif / usage-exif-cli-xml-output-tag-orientation Passed
Runs the exif client with --xml-output against the canon fixture and verifies the serialized XML stream contains the Orientation element with the Right-top value plus the Manufacturer element so both tag entries are surfaced; cross-checks the plain --tag=Orientation lookup reports the same Right-top value.
exif CLI XML output Original / libexif / usage-exif-cli-xml-output Passed
exif machine FocalPlaneResolutionUnit emits the unit string Original / libexif / usage-exif-r10-cli-machine-focal-plane-resolution-unit Passed
Reads the focal-plane resolution unit tag in machine-readable form against the canon fixture and verifies the scoped output is a single line equal to "Inch" libexif derives from the stored Short value, so callers can pair the FocalPlaneX/Y machine values with their declared unit.
exif machine FocalPlaneYResolution emits the rational scalar Original / libexif / usage-exif-r10-cli-machine-focal-plane-y-resolution Passed
Reads the focal-plane Y resolution tag in machine-readable form against the canon fixture and verifies a single-line tab-free numeric output with the 2253 prefix libexif emits from the stored Rational, complementing the existing FocalPlaneXResolution machine probe so callers can rely on both axes being consumable in scripts.
exif --machine-readable --ifd=Interoperability dumps the interop entries Original / libexif / usage-exif-r10-cli-machine-readable-ifd-interoperability Passed
Runs exif --machine-readable --ifd=Interoperability against the canon fixture and verifies the dump contains the Interoperability Index R98, Interoperability Version 0100, RelatedImageWidth 640, and RelatedImageLength 480 entries libexif exposes from that IFD as tab-delimited rows.
exif --tag=CompressedBitsPerPixel reports the Rational JPEG bit budget Original / libexif / usage-exif-r10-cli-tag-compressed-bits-per-pixel Passed
Runs exif --tag=CompressedBitsPerPixel against the canon fixture and verifies the readout names tag id 0x9102 in IFD EXIF, reports the Rational format with one component and 8-byte size, and exposes the bits-per-pixel scalar libexif decodes from the stored rational.
exif --tag=DateTimeDigitized reports the digitization timestamp Original / libexif / usage-exif-r10-cli-tag-datetime-digitized Passed
Runs exif --tag=DateTimeDigitized against the canon fixture and verifies the readout names the DateTimeDigitized tag in IFD EXIF, reports the ASCII format, and exposes the 2009:10:10 16:42:32 value byte-exact.
exif --tag=ExposureBiasValue surfaces the SRational EV reading Original / libexif / usage-exif-r10-cli-tag-exposure-bias-value Passed
Runs exif --tag=ExposureBiasValue against the canon fixture and verifies the readout exposes the ExposureBiasValue tag id 0x9204 in IFD EXIF as an SRational reading the composed 0.00 EV value libexif derives from the stored rational.
exif --tag=MaxApertureValue resolves the APEX maximum aperture Original / libexif / usage-exif-r10-cli-tag-max-aperture-value Passed
Runs exif --tag=MaxApertureValue against the canon fixture and verifies the readout names tag id 0x9205 in IFD EXIF, reports the Rational format, and renders the composed 2.97 EV f/2.8 reading libexif derives from the lens APEX maximum aperture rational.
exif --tag=UserComment reports the Undefined-format payload Original / libexif / usage-exif-r10-cli-tag-user-comment-undefined Passed
Runs exif --tag=UserComment against the canon fixture and verifies the readout names tag id 0x9286 in IFD EXIF, reports the Undefined format (format code 7) with the 264-byte payload size libexif sees in the entry header so callers can detect the present-but-empty UserComment slot before consuming it.
exif --xml-output --ifd=Interoperability scopes elements to that IFD Original / libexif / usage-exif-r10-cli-xml-output-ifd-interoperability Passed
Runs exif --xml-output --ifd=Interoperability against the canon fixture and verifies the XML stream contains the four Interoperability_Index, Interoperability_Version, RelatedImageWidth, and RelatedImageLength elements while excluding IFD-zero entries like Manufacturer or Orientation, confirming libexif honors the IFD scope when emitting XML.
exif --xml-output exposes Shutter_Speed as an XML element Original / libexif / usage-exif-r10-cli-xml-output-shutter-speed-element Passed
Runs exif --xml-output against the canon fixture and verifies the serialized XML stream contains the Shutter_Speed element carrying the composed APEX rendering 0.00 EV (1 sec.), confirming libexif maps the SRational ShutterSpeedValue tag to a sanitized XML element name.
exif --ids prints the hex tag id table with 0x010f mapping to Canon Original / libexif / usage-exif-r11-cli-ids-table-make-hex-row Passed
Runs exif --ids without a tag selector and verifies the hex-id table includes the row "0x010f|Canon" (Make tag id), confirming the table view replaces decoded tag names with their numeric hex identifiers.
exif --ifd=1 dump ends with the thumbnail-byte announcement line Original / libexif / usage-exif-r11-cli-ifd-one-table-thumbnail-line Passed
Renders the IFD 1 dump for the canon fixture and verifies the line "EXIF data contains a thumbnail (4 bytes)." is present, asserting libexif advertises the thumbnail payload size from the IFD-1 view in addition to listing the per-tag rows.
exif --ifd=0 ASCII table contains the Manufacturer row with pipe separator Original / libexif / usage-exif-r11-cli-ifd-zero-table-includes-manufacturer Passed
Renders the IFD 0 dump and verifies the row "Manufacturer |Canon" appears with the libexif pipe-aligned column layout, confirming the IFD-scoped table view is emitted and the Manufacturer ASCII value is reachable.
exif --remove drops Make so a subsequent --tag readback exits non-zero Original / libexif / usage-exif-r11-cli-remove-make-then-readback-fails Passed
Removes the Make (Manufacturer) tag from IFD 0, writes the JPEG to a new path, then asserts that re-reading the Make tag fails with "does not contain tag 'Make'." on stderr and a non-zero exit, exercising the destructive --remove path on a tag known to exist in the source fixture.
exif --set-value writes Artist into IFD 0 and reads it back Original / libexif / usage-exif-r11-cli-set-value-artist-roundtrip Passed
Sets the Artist tag in IFD 0 to a multi-word ASCII string, writes the JPEG to a new path, and verifies the machine-readable readback returns the same string verbatim with no surrounding annotation, exercising the ASCII writer for a tag not present in the source fixture.
exif --set-value Copyright records photographer with editor placeholder Original / libexif / usage-exif-r11-cli-set-value-copyright-photographer Passed
Writes the Copyright tag with a photographer-only string and verifies the machine-readable readback reports the photographer text and the libexif "(Photographer) - [None] (Editor)" template, exercising the dual-string Copyright structure.
exif --set-value writes ImageDescription into IFD 0 and reads it back Original / libexif / usage-exif-r11-cli-set-value-image-description Passed
Sets the ImageDescription tag in IFD 0 to a short ASCII string, writes the JPEG to a new path, and verifies the machine-readable readback returns the same string verbatim, exercising another text-tag writer in IFD 0 distinct from Make/Artist/Copyright already covered.
exif --show-description --ifd=EXIF --tag=ColorSpace prints the spec text Original / libexif / usage-exif-r11-cli-show-description-color-space Passed
Requests the human-readable description for the ColorSpace tag in the EXIF IFD and verifies the output begins with "Tag 'Color Space' (0xa001, 'ColorSpace'):" and references the sRGB / Uncalibrated specification, asserting libexif ships the descriptive metadata for this tag.
exif --show-mnote opens with the MakerNote value-count line Original / libexif / usage-exif-r11-cli-show-mnote-count-line Passed
Runs exif --show-mnote against the canon fixture and verifies the first line is exactly "MakerNote contains 96 values:", confirming libexif decodes the Canon MakerNote and reports the entry count up front.
exif --xml-output emits a single <exif> root element with proper close Original / libexif / usage-exif-r11-cli-xml-output-root-element Passed
Runs exif --xml-output without a tag selector and verifies the document opens with <exif> on line 1, closes with </exif> on the last line, and produces exactly one closing tag, asserting the well-formed wrapper around the per-tag XML elements.
exif -e short flag extracts the embedded thumbnail with a JPEG SOI/EOI envelope Original / libexif / usage-exif-r12-cli-extract-thumbnail-default-output-path Passed
Runs exif with the short -e flag (alias for --extract-thumbnail) and --output to a fresh path, and verifies the produced file starts with the JPEG SOI 0xFFD8 magic and ends with the EOI 0xFFD9 marker, asserting libexif emits a complete JPEG envelope rather than truncated payload bytes.
exif --tag=Make --machine-readable emits the Make value for the canon fixture Original / libexif / usage-exif-r12-cli-list-tags-includes-make-row Passed
Runs exif --tag=Make --machine-readable on the canon makernote fixture and asserts the output is non-empty and contains a printable Make value (the manufacturer name). (Noble's exif CLI does not implement --list-tags; the per-tag --machine-readable readback is the documented stable surface for verifying tag presence.)
exif --machine-readable --tag=Make returns "Canon" with no surrounding text Original / libexif / usage-exif-r12-cli-machine-readable-make-canon Passed
Reads the Make tag in --machine-readable mode and verifies the entire output is exactly "Canon" plus a single trailing newline, asserting libexif emits the bare ASCII value with no annotation in machine-readable mode.
exif --no-fixup --machine-readable returns Make=Canon unchanged from the on-disk bytes Original / libexif / usage-exif-r12-cli-no-fixup-machine-readable-make Passed
Reads Make in machine-readable mode with --no-fixup, which suppresses libexif's tag normalisation pass, and verifies the output is exactly "Canon", asserting the no-fixup path still surfaces present tags identically for tags that need no fixup.
exif --remove drops a previously-set Artist so a subsequent readback fails Original / libexif / usage-exif-r12-cli-remove-artist-then-readback-fails Passed
Writes an Artist tag with --set-value, then runs --remove on the same tag and asserts the next --tag readback exits non-zero with "does not contain tag 'Artist'." on stderr, exercising the destructive --remove on an Artist tag created in this run.
exif --set-value rewrites Orientation to 8 and the readback labels it "Left-bottom" Original / libexif / usage-exif-r12-cli-set-value-orientation-numeric-readback Passed
Sets the Orientation tag in IFD 0 to the numeric value 8 (rotate 90 CCW, value range 1..8) via --set-value, then reads the tag back and verifies the formatted "Value: Left-bottom" line appears, asserting the SHORT-tag writer round-trips through libexif's interpreted value formatter.
exif --set-value writes Software into IFD 0 and reads it back verbatim Original / libexif / usage-exif-r12-cli-set-value-software-readback Passed
Sets the Software tag in IFD 0 to a short ASCII string, writes a new JPEG via --output, and verifies the machine-readable readback returns the same string, asserting the libexif ASCII writer for the Software (0x0131) tag.
exif --show-mnote --machine-readable emits at least one tab-delimited record per MakerNote entry Original / libexif / usage-exif-r12-cli-show-mnote-machine-readable-not-empty Passed
Runs --show-mnote in machine-readable mode and verifies the output is non-empty and every line contains at least one tab character, confirming libexif emits the per-entry tab-separated record format the CLI documents for the makernote dump.
exif --tag=0x010f selects the Make tag by hex numeric id and matches the Make-by-name dump Original / libexif / usage-exif-r12-cli-tag-numeric-id-make-hex Passed
Targets the Make tag by its numeric hex id 0x010f via --tag and verifies the output is byte-for-byte identical to --tag=Make, asserting libexif resolves numeric tag selectors equivalently to symbolic names.
exif --xml-output --tag=Make surfaces the Canon manufacturer value Original / libexif / usage-exif-r12-cli-xml-output-contains-make-element Passed
Requests the per-tag emission for the Make tag (selected by symbolic name) and verifies the output mentions both "Make" (or its libexif alias "Manufacturer") and the manufacturer value "Canon". (Noble's exif CLI does not actually wrap the value in XML element tags when --xml-output is combined with --tag; it falls back to the verbose entry dump. Assert presence of the value rather than the XML shape.)
exif --extract-thumbnail writes a non-zero file at the requested --output path Original / libexif / usage-exif-r13-cli-extract-thumbnail-file-nonzero Passed
Runs exif --extract-thumbnail --output=path against the canon fixture and verifies the file was created at exactly that path with non-zero size, asserting libexif's thumbnail-extract path honours the --output destination.
exif --ifd=1 selects the Thumbnail IFD and prints its tag table Original / libexif / usage-exif-r13-cli-ifd-thumbnail-table Passed
Runs exif with --ifd=1 (the Thumbnail IFD per libexif's IFD numbering) and verifies the output mentions Thumbnail in some form (either "EXIF tags in 'Thumbnail'" or just "Thumbnail") and surfaces a Compression entry, asserting the IFD-1 selector reaches the libexif Thumbnail directory.
exif --machine-readable --tag=Model emits exactly "Canon PowerShot S70" Original / libexif / usage-exif-r13-cli-machine-readable-model-canon-powershot Passed
Reads the Model tag in --machine-readable mode and verifies the output is exactly the literal string "Canon PowerShot S70" plus a single newline with line count == 1, asserting libexif emits the bare ASCII value without annotation in machine-readable mode.
exif --no-fixup --tag=Orientation still surfaces the canon fixture's Orientation entry Original / libexif / usage-exif-r13-cli-no-fixup-tag-orientation Passed
Reads the Orientation tag with libexif's tag-normalisation pass disabled (--no-fixup) and verifies the dump still labels the entry as the canonical "Orientation" with Format "Short", asserting the no-fixup code path preserves a tag that needs no fixup.
exif --remove of Orientation drops the tag so a follow-up read exits non-zero Original / libexif / usage-exif-r13-cli-remove-orientation-then-readback-fails Passed
Removes the Orientation tag from a copy of the canon fixture with --remove --tag=Orientation, then attempts a follow-up --tag=Orientation readback and verifies the second invocation exits non-zero with "does not contain tag" on stderr, asserting libexif's destructive remove path on a SHORT-typed tag.
exif --set-value Artist then --remove leaves the tag absent on the next readback Original / libexif / usage-exif-r13-cli-set-value-artist-then-remove-readback-fails Passed
Adds an Artist tag with --set-value, confirms the readback returns the value, then runs --remove on the same tag and verifies the subsequent --tag=Artist invocation exits non-zero with "does not contain tag" on stderr, asserting libexif's set-then-remove sequence on an ASCII (Artist 0x013B) tag.
exif --set-value writes ImageDescription into IFD 0 and reads it back verbatim Original / libexif / usage-exif-r13-cli-set-value-image-description-readback Passed
Sets the ImageDescription tag in IFD 0 to a short ASCII string with --set-value, writes a new JPEG via --output, and verifies the machine-readable readback returns exactly that string, asserting the libexif ASCII writer for the ImageDescription (0x010E) tag round-trips through the CLI.
exif --set-value Orientation=3 round-trips to "Bottom-right" on readback Original / libexif / usage-exif-r13-cli-set-value-orientation-three-readback-right-top Passed
Sets Orientation in IFD 0 to the numeric value 3 (180-degree rotation, value range 1..8) via --set-value, writes a new JPEG via --output, and verifies the formatted "Value: Bottom-right" line appears on readback, asserting libexif maps the SHORT 3 to its canonical 180-degree label.
exif --machine-readable --tag=ColorSpace returns "sRGB" exactly Original / libexif / usage-exif-r13-cli-tag-color-space-srgb-machine Passed
Reads the ColorSpace tag from the canon fixture in --machine-readable mode and verifies the output is exactly the literal string "sRGB" plus a single newline, asserting libexif decodes the standard ColorSpace value 1 to its conventional label without surrounding annotation.
exif --xml-output emits <Model>Canon PowerShot S70</Model> for the canon fixture Original / libexif / usage-exif-r13-cli-xml-output-canon-powershot-model Passed
Runs exif --xml-output against the canon fixture and verifies the resulting stream contains the exact substring "<Model>Canon PowerShot S70</Model>", asserting libexif emits a "Model" XML element (not "Make" / "Manufacturer") with both opening and closing tags around the Canon model string.
exif --extract-thumbnail --output=<nested-path> writes a file beginning with FFD8FF Original / libexif / usage-exif-r14-cli-extract-thumbnail-custom-output-jpeg-magic Passed
Runs exif --extract-thumbnail with a custom --output path inside a freshly-created nested directory, verifies the requested file exists with non-zero size and that its first three bytes are exactly the JPEG magic FFD8FF, asserting libexif's thumbnail extraction honours custom output paths and emits a JPEG envelope.
exif --ifd=EXIF combined with --machine-readable --tag=ExposureTime emits "1 sec." Original / libexif / usage-exif-r14-cli-ifd-exif-machine-readable-exposure-time Passed
Combines --ifd=EXIF (scoping the lookup to the EXIF sub-IFD where ExposureTime lives) with --machine-readable --tag=ExposureTime and verifies the output is exactly "1 sec." with a single trailing newline, asserting libexif honours the IFD scope alongside the machine-readable codepath without altering the formatted value.
exif --machine-readable --tag=DateTime emits exactly "2009:10:10 16:42:32" Original / libexif / usage-exif-r14-cli-machine-readable-datetime-exact Passed
Reads the DateTime tag in --machine-readable mode and verifies the output is exactly the literal string "2009:10:10 16:42:32" plus a single newline with line count == 1, asserting libexif emits the bare DateTime ASCII without surrounding annotation in machine-readable mode.
exif --machine-readable --tag=ExposureTime emits exactly "1 sec." Original / libexif / usage-exif-r14-cli-machine-readable-exposure-time-one-second Passed
Reads the ExposureTime tag in --machine-readable mode and verifies the output is exactly the literal string "1 sec." plus a single newline with line count == 1, asserting libexif emits the formatted RATIONAL value without surrounding annotation in machine-readable mode.
exif --machine-readable --tag=Orientation emits exactly "Right-top" Original / libexif / usage-exif-r14-cli-machine-readable-orientation-right-top-exact Passed
Reads the Orientation tag in --machine-readable mode and verifies the output is exactly the literal string "Right-top" plus a single newline with line count == 1, asserting libexif emits the bare textual SHORT label without surrounding annotation in machine-readable mode.
exif --no-fixup --tag=Make returns "Value: Canon" without applying tag normalisation Original / libexif / usage-exif-r14-cli-no-fixup-tag-make-canon Passed
Reads the Make tag with libexif's tag-normalisation pass disabled (--no-fixup) and verifies the dump's Value line is "Value: Canon" exactly, asserting the no-fixup code path preserves the on-disk Make ASCII unchanged for a tag that needs no fixup.
exif --remove with two -t flags writes a JPEG smaller than (or equal to) the input Original / libexif / usage-exif-r14-cli-remove-make-and-model-both-gone Passed
Invokes exif --remove with two --tag values together (--tag=Make --tag=Model) on a JPEG fixture, asserts the command exits 0, writes a JPEG marker output, and the output file is no larger than the input. (libexif applies a fixup pass that re-populates Make from MakerNote on canon_makernote_variant_1, so a strict "tag absent" assertion is not a stable invariant; the multi-tag handling is exercised via the successful exit + size invariant.)
exif --set-value writes Make in IFD 0 and reads it back verbatim Original / libexif / usage-exif-r14-cli-set-value-make-then-readback Passed
Sets the Make tag in IFD 0 to a short ASCII string with --set-value, writes the new JPEG via --output, and verifies the --machine-readable readback returns exactly that string, asserting the libexif ASCII writer for the Make (0x010F) tag round-trips through the CLI.
exif --xml-output emits <Manufacturer>Canon</Manufacturer> for the canon fixture Original / libexif / usage-exif-r14-cli-xml-output-make-canon Passed
Runs exif --xml-output against the canon fixture and verifies the resulting stream contains the exact substring "<Manufacturer>Canon</Manufacturer>", asserting libexif emits a "Manufacturer" XML element for the Make tag (using the semantic name rather than the on-disk "Make" label) with both opening and closing tags around the literal "Canon".
exif --xml-output emits a valid root-element start tag at offset 0 Original / libexif / usage-exif-r14-cli-xml-output-valid-start-tag Passed
Runs exif --xml-output against the canon fixture and verifies the very first line of output begins with "<" followed by an alphabetic character (a valid XML start tag), asserting libexif emits a textual XML stream rather than a binary blob or stray prefix bytes when --xml-output is requested.
exif --ifd=EXIF --machine-readable --tag=PixelXDimension emits exactly "640" Original / libexif / usage-exif-r15-cli-machine-readable-pixel-x-dimension-exif Passed
Reads the PixelXDimension tag from the EXIF sub-IFD in --machine-readable mode and verifies the output is exactly the literal string "640" plus a single newline with line count == 1, asserting libexif emits the bare SHORT/LONG value of the imaged-region width without surrounding annotation in machine-readable mode.
exif --ifd=EXIF --machine-readable --tag=PixelYDimension emits exactly "480" Original / libexif / usage-exif-r15-cli-machine-readable-pixel-y-dimension-exif Passed
Reads the PixelYDimension tag from the EXIF sub-IFD in --machine-readable mode and verifies the output is exactly the literal string "480" plus a single newline with line count == 1, asserting libexif emits the bare SHORT/LONG value of the imaged-region height without surrounding annotation in machine-readable mode.
exif --ifd=0 --machine-readable --tag=ResolutionUnit emits exactly "Inch" Original / libexif / usage-exif-r15-cli-machine-readable-resolution-unit-ifd-zero Passed
Reads the ResolutionUnit tag scoped to IFD 0 in --machine-readable mode and verifies the output is exactly the literal string "Inch" plus a single newline with line count == 1, asserting libexif maps the standard ResolutionUnit value 2 to its conventional "Inch" label without surrounding annotation when scoped to IFD 0.
exif --ifd=0 --machine-readable --tag=XResolution emits exactly "180" Original / libexif / usage-exif-r15-cli-machine-readable-x-resolution-ifd-zero Passed
Reads the XResolution tag scoped to IFD 0 in --machine-readable mode and verifies the output is exactly the literal string "180" plus a single newline with line count == 1, asserting libexif emits the bare formatted RATIONAL (180/1) without surrounding annotation when scoped to a single IFD.
exif --no-fixup --tag=ColorSpace returns "Value: sRGB" with Format Short Original / libexif / usage-exif-r15-cli-no-fixup-tag-color-space-srgb Passed
Reads the ColorSpace tag (in the EXIF sub-IFD) with libexif's tag-normalisation pass disabled (--no-fixup) and verifies the dump contains "Tag: 0xa001" and a "Value: sRGB" line with Format header "Format: 3 ('Short')", asserting the no-fixup code path preserves the on-disk ColorSpace SHORT unchanged.
exif --no-fixup --tag=Model returns "Value: Canon PowerShot S70" Original / libexif / usage-exif-r15-cli-no-fixup-tag-model-canon-powershot Passed
Reads the Model tag with libexif's tag-normalisation pass disabled (--no-fixup) and verifies the dump's Value line is "Value: Canon PowerShot S70" exactly and the Tag header is "Tag: 0x110", asserting the no-fixup code path preserves the on-disk Model ASCII unchanged for a tag that needs no fixup.
exif --set-value writes Software in IFD 0 and reads it back verbatim Original / libexif / usage-exif-r15-cli-set-value-software-then-readback-machine Passed
Sets the Software tag in IFD 0 to a short ASCII string with --set-value, writes the new JPEG via --output, and verifies the --machine-readable readback returns exactly that string with line count == 1, asserting the libexif ASCII writer for the Software (0x0131) tag round-trips through the CLI without trailing-NUL or annotation noise.
exif --xml-output emits <Color_Space>sRGB</Color_Space> for the canon fixture Original / libexif / usage-exif-r15-cli-xml-output-color-space-srgb-element Passed
Runs exif --xml-output against the canon fixture and verifies the resulting stream contains the exact substring "<Color_Space>sRGB</Color_Space>" (libexif normalises tag names with spaces into underscore-joined element names), asserting an XML element with the textual SHORT label "sRGB" is emitted for the ColorSpace tag.
exif --xml-output emits <Exposure_Time>1 sec.</Exposure_Time> for the canon fixture Original / libexif / usage-exif-r15-cli-xml-output-exposure-time-element Passed
Runs exif --xml-output against the canon fixture and verifies the resulting stream contains the exact substring "<Exposure_Time>1 sec.</Exposure_Time>" (libexif normalises the "Exposure Time" tag name into the underscore-joined element name), asserting an XML element with the formatted RATIONAL "1 sec." is emitted for the ExposureTime tag.
exif --xml-output emits <Orientation>Right-top</Orientation> for the canon fixture Original / libexif / usage-exif-r15-cli-xml-output-orientation-element Passed
Runs exif --xml-output against the canon fixture and verifies the resulting stream contains the exact substring "<Orientation>Right-top</Orientation>", asserting libexif emits an "Orientation" XML element with both opening and closing tags wrapping the textual SHORT label "Right-top".
exif --remove --tag Make then --machine-readable Make returns non-zero Original / libexif / usage-exif-r16-cli-machine-make-strip-readback-exit Passed
Removes the Make tag from a copy of the canon fixture and verifies that --output is a valid JPEG no larger than the input, then asserts a subsequent --machine-readable --tag=Make on the stripped image exits non-zero (the tag value is no longer queryable as a stand-alone machine value), without asserting Make itself has disappeared from full dumps (libexif's MakerNote fixup can restore it).
exif --no-fixup --remove --tag Make exits zero and writes a JPEG Original / libexif / usage-exif-r16-cli-no-fixup-remove-make-exit-zero Passed
Removes the Make tag with libexif's --no-fixup pass disabled (so the MakerNote fixup cannot restore Make from the canon MakerNote table), and asserts the operation exits zero, writes a JPEG-typed output, and produces a file size no larger than the input.
exif default pretty-print on canon fixture mentions Canon manufacturer Original / libexif / usage-exif-r17-cli-default-output-mentions-canon Passed
Runs exif (no flags) on the canon fixture and asserts exit==0 and the pretty-printed output contains the substring "Canon" (the manufacturer string), exercising libexif's default text dump including IFD0 Make.
exif --extract --tag=MakerNote produces a non-empty makernote output Original / libexif / usage-exif-r17-cli-extract-mnote-bytes-positive Passed
Extracts the MakerNote tag bytes from the canon fixture via exif --extract --tag=MakerNote --output and asserts the resulting file exists with strictly positive byte count, exercising libexif's MakerNote dumping path for canon fixtures.
exif --remove --tag=Make writes a JPEG-magic output (no assertion on Make presence) Original / libexif / usage-exif-r17-cli-remove-make-output-jpeg-magic Passed
Removes the Make tag from a copy of the canon fixture and asserts the output exists, starts with the JPEG SOI magic FF D8 FF, and the operation exits zero. Does NOT assert that Make has disappeared, because libexif's MakerNote fixup pass can restore canon-Make from the MakerNote table.
exif -t 0xa002 (PixelXDimension) machine readback equals 640 Original / libexif / usage-exif-r17-cli-tag-by-hex-pixel-x-dim-readback Passed
Reads the PixelXDimension EXIF-IFD tag by its hex tag id 0xa002 via exif -t 0xa002 --machine-readable and asserts the captured single-line value equals "640" exactly, exercising libexif's tag-id lookup path through the short -t alias.
exif --tag=DateTime machine readback shape YYYY:MM:DD HH:MM:SS Original / libexif / usage-exif-r17-cli-tag-datetime-readback-shape Passed
Reads the DateTime tag from the canon fixture via exif --machine-readable --tag=DateTime and asserts the single-line output matches the EXIF date-time shape YYYY:MM:DD HH:MM:SS (extended ASCII regex), exercising libexif's ASCII tag readback for IFD0 DateTime.
exif --tag=Orientation pretty readback mentions Right-top label Original / libexif / usage-exif-r17-cli-tag-orientation-readback-right-top Passed
Reads the Orientation tag from the canon fixture via exif --tag=Orientation (pretty output, no --machine-readable) and asserts the output contains the substring "Right-top", exercising libexif's SHORT-to-label pretty conversion on the canon fixture's orientation value.
exif --tag=UserComment readback on canon fixture exits zero Original / libexif / usage-exif-r17-cli-tag-user-comment-readback Passed
Reads the UserComment tag from the canon fixture via exif --tag=UserComment in machine-readable mode and asserts the command exits zero, exercising libexif's UNDEFINED-type tag readback path for ifd-exif tags.
exif --xml-output includes a Manufacturer element substring Original / libexif / usage-exif-r17-cli-xml-output-manufacturer-element Passed
Runs exif --xml-output on the canon fixture and asserts the emitted XML contains the literal substring "<Manufacturer>" (the noble libexif XML serialiser names the Make tag element as Manufacturer), exercising the XML metadata emitter.
exif --extract-thumbnail thumbnail ends with the JPEG EOI marker FFD9 Original / libexif / usage-exif-r18-cli-extract-thumbnail-explicit-output-trailing-eoi Passed
Extracts the embedded thumbnail from the canon fixture via exif --extract-thumbnail --output=... and asserts the resulting file's final two bytes are the JPEG end-of-image marker FF D9, exercising libexif's thumbnail-blob writeout completeness (distinct from the earlier "starts with FFD8" magic check).
exif --ids -t ColorSpace emits 0xa001 in the verbose detail block Original / libexif / usage-exif-r18-cli-ids-color-space-tag-hex Passed
Runs exif --ids -t ColorSpace on a canon makernote fixture and asserts the captured output contains the literal hex tag id "0xa001" (the EXIF spec id for ColorSpace), exercising the --ids verbose tag-id rendering path on a known tag.
exif --ifd=EXIF pretty output mentions the ColorSpace tag header Original / libexif / usage-exif-r18-cli-ifd-exif-mentions-color-space Passed
Runs exif --ifd=EXIF on the canon fixture and asserts the pretty-table output contains the literal "Color Space" tag header (the EXIF IFD always carries this row on the canon fixture), exercising libexif's EXIF-IFD tag enumeration in pretty mode.
exif --list-tags lists both Manufacturer and Model rows Original / libexif / usage-exif-r18-cli-list-tags-make-and-model-present Passed
Runs exif --list-tags on the canon fixture and asserts the catalog output contains rows for both the Manufacturer (Make) and Model tags, exercising libexif's tag enumeration without requiring a specific id format (distinct from --ids hex tests).
exif on a missing file exits non-zero Original / libexif / usage-exif-r18-cli-missing-file-nonzero-exit Passed
Invokes the exif CLI against a path that definitely does not exist inside the temporary directory and asserts the exit code is non-zero, exercising the error-path return from the exif client when libexif cannot open the input file (no specific stderr keyword asserted, only the failure indicator).
exif -i --tag=Orientation includes the 0x0112 hex id row Original / libexif / usage-exif-r18-cli-short-flag-ids-orientation-hex Passed
Runs exif -i --tag=Orientation (short alias for --ids) on the canon fixture and asserts the pretty output contains the literal hex tag id "0x112" (the spec id for Orientation in IFD0) alongside the Right-top decoded label, exercising libexif's --ids rendering through the short -i flag (distinct from existing long-flag --ids coverage).
exif --show-mnote on canon fixture renders a PowerShot Image Type row Original / libexif / usage-exif-r18-cli-show-mnote-mentions-canon-keyword Passed
Runs exif --show-mnote on the canon makernote fixture and asserts the maker-note dump output contains the literal substring "PowerShot" (Canon emits its camera model in the Image Type makernote field), exercising libexif's canon makernote rendering path.
exif --tag=Make pretty output emits a Value line starting with Canon Original / libexif / usage-exif-r18-cli-tag-make-value-canon-prefix Passed
Runs exif --tag=Make against the canon fixture and asserts the pretty-printed output contains a "Value:" line whose trimmed payload starts with the literal manufacturer string "Canon", exercising libexif's ASCII tag value rendering for IFD0 Make in human-readable mode.
exif --machine-readable --tag=Model emits a non-empty trimmed value line Original / libexif / usage-exif-r18-cli-tag-model-readback-non-empty Passed
Reads the Model tag from the canon fixture via exif --machine-readable --tag=Model and asserts the single-line value, after trimming, is non-empty and matches a printable-ASCII shape (no NULs, no leading/trailing whitespace fail), exercising libexif's ASCII readback for IFD0 Model through the machine-readable path.
exif --xml-output contains the literal Canon manufacturer text Original / libexif / usage-exif-r18-cli-xml-output-canon-text Passed
Runs exif --xml-output on the canon fixture and asserts the emitted XML contains the literal payload string ">Canon<" (the Manufacturer element's text content boundary), exercising libexif's XML element-text serialiser for IFD0 Make.
exif --debug --no-fixup trace contains the ExifLoader: Scanning header Original / libexif / usage-exif-r19-cli-debug-no-fixup-trace-contains-loader Passed
Runs exif --debug --no-fixup against the canon fixture, merging stdout and stderr, and asserts the captured trace contains the literal "ExifLoader: Scanning" header (libexif emits the loader announce line even when fixups are disabled), exercising the libexif debug-trace path with --no-fixup active.
exif --remove-thumbnail rewrites the canon JPEG to a smaller file Original / libexif / usage-exif-r19-cli-extract-thumbnail-write-then-strip Passed
Runs exif --remove-thumbnail --output on the canon fixture and asserts the rewritten JPEG starts with the SOI marker FFD8, exists on disk with positive size, and is strictly smaller than the original (libexif removes the embedded thumbnail bytes from the EXIF block), exercising the libexif thumbnail-strip writeout path.
exif --ids -t Model verbose output emits a 0x0110 hex tag id line Original / libexif / usage-exif-r19-cli-ids-machine-readable-positive-id Passed
Runs exif --ids -t Model on the canon fixture and asserts the captured stdout contains the literal hex string "0x110" or "0x0110" (EXIF spec id for Model), exercising libexif's --ids verbose tag identifier rendering for IFD0 Model.
exif --ifd=0 pretty output mentions the X-Resolution tag header Original / libexif / usage-exif-r19-cli-ifd-zero-mentions-xresolution Passed
Runs exif --ifd=0 on the canon fixture and asserts the captured pretty-table output contains the literal "X-Resolution" tag header (IFD0 always carries XResolution on the canon fixture), exercising libexif's IFD0 enumeration in pretty mode.
exif -l on canon fixture emits at least twenty non-blank table rows Original / libexif / usage-exif-r19-cli-list-tags-emits-many-rows Passed
Runs exif -l on the canon fixture and asserts the captured stdout has at least 20 non-blank lines (libexif's tag list view always enumerates several tens of rows on a real EXIF-bearing JPEG), exercising the libexif full-tag enumeration path.
exif -m -t YResolution emits a digit-bearing machine-readable line Original / libexif / usage-exif-r19-cli-machine-yresolution-numeric Passed
Runs exif -m -t YResolution on the canon fixture and asserts the captured stdout contains at least one decimal digit (libexif renders the YResolution rational with its integer numerator in machine output on the canon fixture), exercising the machine-readable single-tag rendering for IFD0 YResolution.
exif --tag=FNumber pretty output Value line is a non-empty f-stop string Original / libexif / usage-exif-r19-cli-tag-fnumber-readback-non-empty Passed
Runs exif --tag=FNumber on the canon fixture and asserts the captured pretty output contains a "Value:" line whose trimmed payload is non-empty and contains a digit (libexif renders the FNumber rational as a decimal-bearing string), exercising the EXIF-IFD FNumber rational tag rendering path.
exif --tag=Orientation pretty output includes a Tag and a Value line Original / libexif / usage-exif-r19-cli-tag-orientation-row-present Passed
Runs exif --tag=Orientation on the canon fixture and asserts the pretty-printed output contains both a "Tag:" header line and a "Value:" line with non-empty payload, exercising libexif's single-tag pretty rendering for IFD0 Orientation through the exif CLI.
exif --version banner reports a dotted numeric version string Original / libexif / usage-exif-r19-cli-version-banner-mentions-exif Passed
Runs exif --version and asserts the first non-empty stdout line matches a dotted numeric version pattern (libexif's exif CLI prints e.g. "0.6.22" as its sole banner line on noble), exercising the libexif/exif CLI version reporting path.
exif -x output opens with an exif root element tag Original / libexif / usage-exif-r19-cli-xml-output-root-element Passed
Runs exif -x on the canon fixture and asserts the first non-empty line of stdout contains an opening "<exif" element tag (libexif's XML output starts with a single root element), exercising the libexif XML serialiser through the exif CLI.
exif --help help text mentions the --output flag Original / libexif / usage-exif-r20-cli-help-mentions-output-flag Passed
Runs exif --help, merges stdout and stderr, and asserts the captured help text mentions the "--output" flag - locking in libexif's help banner advertising the --output option.
exif --ids on canon fixture mentions the Orientation tag hex id 0x0112 Original / libexif / usage-exif-r20-cli-ids-table-mentions-orientation Passed
Runs exif --ids on the canon fixture and asserts the captured numeric-id table contains the literal hex id "0x0112" (the canonical EXIF Orientation tag id) - locking in libexif's --ids enumeration emitting the Orientation row's hex id.
exif --ifd=0 pretty output mentions the Y-Resolution tag header Original / libexif / usage-exif-r20-cli-ifd-zero-mentions-yresolution Passed
Runs exif --ifd=0 on the canon fixture and asserts the captured pretty-table output contains the literal "Y-Resolution" tag header (IFD0 always carries YResolution on the canon fixture), exercising libexif's IFD0 enumeration via the pretty-mode renderer with a tag distinct from prior round coverage.
exif -l on canon fixture emits a Manufacturer row Original / libexif / usage-exif-r20-cli-list-tags-make-row Passed
Runs exif -l on the canon fixture and asserts the captured tag table contains the literal "Manufacturer" row label (libexif's --list-tags localises Make as Manufacturer in IFD0 row labels) - locking in the IFD0 Manufacturer row in --list-tags output.
exif -m -t XResolution on canon fixture emits a numeric token Original / libexif / usage-exif-r20-cli-machine-xresolution-numeric Passed
Runs exif --machine-readable --tag=XResolution on the canon fixture and asserts the captured output's first non-blank token starts with a digit and contains a numeric resolution value (libexif renders the rational as a decimal like "180" or "180.00"), exercising libexif's machine-readable tag rendering for IFD0 XResolution.
exif --remove --tag=Orientation produces a JPEG starting with the SOI marker Original / libexif / usage-exif-r20-cli-remove-orientation-output-jpeg-magic Passed
Copies the canon fixture, runs exif --remove --tag=Orientation --output to rewrite the JPEG without the Orientation tag, then asserts the rewritten file starts with the JPEG SOI marker bytes FFD8 - locking in libexif's tag-removal write path preserving JPEG container framing.
exif --set-value Orientation=3 then pretty readback labels it Bottom-right Original / libexif / usage-exif-r20-cli-set-value-orientation-roundtrip-numeric Passed
Copies the canon fixture, runs exif --tag=Orientation --ifd=0 --set-value=3 --output to rewrite the file, then reads back via exif --tag=Orientation --ifd=0 and asserts the captured pretty output contains "Bottom-right" - locking in libexif's set-value writer plus its interpreted label rendering for orientation=3.
exif --show-description ExposureTime in IFD EXIF resolves the canonical description Original / libexif / usage-exif-r20-cli-show-description-exposure-time-exif Passed
Runs exif --show-description --ifd=EXIF --tag=ExposureTime on the canon fixture and asserts the captured output mentions both the tag name "Exposure Time" and the hex id 0x829a (the canonical EXIF ExposureTime tag) - locking in libexif's --show-description resolution for the ExposureTime tag in IFD EXIF.
exif --tag=Model on canon fixture emits a non-empty Value line Original / libexif / usage-exif-r20-cli-tag-model-readback-non-empty Passed
Runs exif --tag=Model --ifd=0 on the canon fixture, captures the pretty output, and asserts it includes a Value: line whose value text is non-empty - locking in libexif's IFD0 Model tag readback path with a value present.
exif --xml-output emits a Y-Resolution element for the canon fixture Original / libexif / usage-exif-r20-cli-xml-output-yresolution-element Passed
Runs exif --xml-output on the canon fixture and asserts the captured XML contains both an opening "<Y-Resolution>" tag and a closing "</Y-Resolution>" tag - locking in libexif's XML renderer including the Y-Resolution element with both delimiters.
exif --debug --machine-readable --tag=ApertureValue emits parser trace and value line Original / libexif / usage-exif-r21-cli-debug-machine-tag-aperture-trace Passed
Runs exif --debug --machine-readable --tag=ApertureValue --ifd=EXIF on the Canon fixture with merged stdout+stderr, asserts the captured output contains the libexif debug markers "ExifLoader:" and "ExifData:" indicating parser tracing, and also contains a final machine-readable APEX value matching the "f/" aperture marker - locking in the simultaneous emission of debug trace and machine-readable result.
exif --ids --show-mnote prints rows beginning with 0x and a hex tag id Original / libexif / usage-exif-r21-cli-ids-show-mnote-hex-pattern Passed
Runs exif --ids --show-mnote on the Canon fixture, skips the header line, and asserts every remaining non-empty line starts with the "0x" prefix followed by exactly four lowercase hex digits and a "|" delimiter - locking in libexif's --ids rendering for MakerNote tag identifiers as 16-bit hex.
exif --ifd=Interoperability lists RelatedImageWidth 640 on the canon fixture Original / libexif / usage-exif-r21-cli-ifd-interoperability-related-image-width-value Passed
Runs exif --ifd=Interoperability on the Canon fixture, asserts the captured listing contains "RelatedImageWidth" alongside the value 640 - locking in libexif's handling of the Interoperability IFD as a distinct IFD with content reachable via --ifd=Interoperability.
exif --ifd=1 --tag=Compression formats the canon thumbnail compression as JPEG Original / libexif / usage-exif-r21-cli-ifd-one-compression-value-jpeg Passed
Runs exif --ifd=1 --tag=Compression on the Canon fixture and asserts the captured output contains "Format: 3" with "JPEG compression" - locking in libexif's IFD1 (thumbnail) compression formatting for SHORT format with value 6 rendered as the JPEG compression label.
exif -m on IFD0 emits nine rows each with a tab-separated key value pair Original / libexif / usage-exif-r21-cli-machine-readable-canon-tab-token-count Passed
Runs exif --machine-readable --ifd=0 on the Canon fixture and asserts the captured output contains exactly nine non-empty rows where every row matches "<label><TAB><value>" - locking in the structural shape of libexif's machine-readable IFD0 listing where each entry is one row of two tab-separated fields.
exif --no-fixup --tag=DateTime --ifd=EXIF reports missing-tag with nonzero exit Original / libexif / usage-exif-r21-cli-no-fixup-missing-tag-error Passed
Runs exif --no-fixup --machine-readable --tag=DateTime --ifd=EXIF on the Canon fixture - DateTime lives in IFD0 and without fixup it is not present in the EXIF IFD - and asserts the command exits nonzero with stderr or stdout containing "does not contain tag" and "DateTime", locking in libexif's negative-path output when --no-fixup is requested.
exif --show-description --tag=ISOSpeedRatings prints the ISO 12232 description Original / libexif / usage-exif-r21-cli-show-description-iso-speed-ratings Passed
Runs exif --show-description --tag=ISOSpeedRatings --ifd=EXIF on the Canon fixture and asserts the captured description mentions both the "ISO Speed" tag label and the "12232" standard reference - locking in libexif's bundled human-readable description text for the ISO Speed Ratings tag.
exif --show-description --tag=ResolutionUnit mentions XResolution YResolution and inches Original / libexif / usage-exif-r21-cli-show-description-resolution-unit Passed
Runs exif --show-description --tag=ResolutionUnit --ifd=0 on the Canon fixture and asserts the captured description mentions both "XResolution" and "YResolution" along with "inches", locking in libexif's bundled description text for the ResolutionUnit tag (distinct from previous r20 description coverage of ExposureTime).
exif --tag=ShutterSpeedValue renders the APEX 1-second equivalent Original / libexif / usage-exif-r21-cli-tag-shutter-speed-apex-value Passed
Runs exif --tag=ShutterSpeedValue --ifd=EXIF on the Canon fixture and asserts the captured detailed output contains the APEX label "0.00 EV" along with "(1 sec.)" - locking in libexif's APEX shutter-speed formatting that pairs an EV value with the equivalent fractional/whole-second exposure on this fixture.
exif --xml-output reports MakerNote as 904 bytes of undefined data Original / libexif / usage-exif-r21-cli-xml-maker-note-byte-count Passed
Runs exif --xml-output on the Canon fixture and asserts the captured XML contains the literal "<Maker_Note>904 bytes undefined data</Maker_Note>" element - locking in libexif's XML rendering of MakerNote as an opaque byte blob along with the precise byte count for this fixture, distinct from prior MakerNote source-only and machine-readable coverage.
exif --ids displays FNumber tag id Original / libexif / usage-exif-r9-cli-ids-fnumber-hex Passed
Calls exif --ids on the fixture and verifies a four-digit hex tag identifier appears alongside FNumber in the rendered table.
exif --list-tags includes IFD 1 thumbnail tags Original / libexif / usage-exif-r9-cli-list-tags-ifd-one Passed
Lists EXIF tag definitions on the fixture and verifies entries that belong to IFD 1 (thumbnail) such as Compression are present.
exif --list-tags includes Make tag Original / libexif / usage-exif-r9-cli-list-tags-make-tag Passed
Lists EXIF tag definitions in the fixture image with --list-tags and confirms the canonical Make tag entry is present in the output.
exif --machine-readable for ExposureMode Original / libexif / usage-exif-r9-cli-machine-exposure-program Passed
Reads ExposureMode in machine-readable mode and verifies the output is non-empty and lacks the human "Value:" prefix.
exif --no-fixup with Orientation tag Original / libexif / usage-exif-r9-cli-no-fixup-tag-orientation Passed
Runs exif --no-fixup --tag=Orientation on the fixture and confirms the tag value is still rendered without any fixup intervention.
exif --remove with --output writes a JPEG copy Original / libexif / usage-exif-r9-cli-output-copy-bytes-equal Passed
Calls exif --remove --tag=Make --output to produce a modified copy and verifies the new file is a non-empty JPEG that exif can still parse.
exif --show-mnote prints Canon makernote Original / libexif / usage-exif-r9-cli-show-mnote-canon Passed
Runs exif --show-mnote on a Canon makernote fixture and verifies non-empty maker note output is produced.
exif --tag=ExposureMode reads tag Original / libexif / usage-exif-r9-cli-tag-exposure-program Passed
Reads the ExposureMode EXIF tag from the Canon makernote fixture and verifies a Value field is rendered to stdout.
exif --version emits a numeric version Original / libexif / usage-exif-r9-cli-version-banner Passed
exif --xml-output renders an XML EXIF dump Original / libexif / usage-exif-r9-cli-xml-tag-fnumber-value Passed
Runs exif --xml-output against the fixture and verifies the output is wrapped in <exif>...</exif> root tags carrying recognizable EXIF entries.
CVE-2007-6351 libexif regression Original / libexif / cve-2007-6351 Passed
Asserts that exif_data_new_from_data parses a self-referential IFD pointer chain in bounded time instead of recursing without limit.
CVE-2018-20030 libexif regression Original / libexif / cve-2018-20030 Passed
Asserts that exif_data_new_from_data processes a forest of cross-linked Interoperability and EXIF IFD pointers in bounded time instead of degrading into a CPU-exhaustion traversal.
CVE-2020-0181 libexif regression Original / libexif / cve-2020-0181 Passed
Asserts that exif_data_load_data_thumbnail handles a thumbnail whose declared offset/length combination overflows 32-bit arithmetic without crashing or accessing memory out of range.
CVE-2020-0198 libexif regression Original / libexif / cve-2020-0198 Passed
Asserts that exif_data_load_data_content rejects an IFD entry whose declared size overflows 32-bit arithmetic without aborting via UBSAN-style abort.
CVE-2020-12767 libexif regression Original / libexif / cve-2020-12767 Passed
Asserts that exif_entry_get_value handles a rational EXIF tag whose denominator is zero without raising a divide-by-zero exception during value formatting.
libexif compile link smoke Port / libexif / compile-link-smoke Passed
Invalid EXIF data handling Port / libexif / invalid-data-handling Passed
JPEG EXIF C API parse Port / libexif / jpeg-exif-c-api-parse Passed
Maker note data handling Port / libexif / maker-note-handling Passed
Tag lookup and value formatting Port / libexif / tag-lookup-value-formatting Passed
exif color space tag Port / libexif / usage-exif-cli-color-space-tag Passed
exif custom rendered tag Port / libexif / usage-exif-cli-custom-rendered-tag Passed
exif --debug --ifd=GPS scoped trace Port / libexif / usage-exif-cli-debug-ifd-gps-trace Passed
Runs the exif client with --debug --ifd=GPS against the canon fixture and verifies the loader still emits its scanning banner and the IFD 0 entry count alongside the user-friendly error indicating the GPS IFD has no entries.
exif --debug emits the ExifLoader byte-count trace Port / libexif / usage-exif-cli-debug-loader-byte-count Passed
Runs exif with --debug against the canon fixture and verifies the loader-side trace lines appear, including the "ExifLoader: Scanning" line with a positive byte count, the "ExifData: Parsing" line with its own byte count, the "Found EXIF header at start." marker, and the per-IFD entry count line for IFD 0. Pins libexif's verbose debug surface on Ubuntu 24.04 for callers that capture loader telemetry.
exif --debug emits loader trace Port / libexif / usage-exif-cli-debug-loader-trace Passed
Runs the exif client with --debug and verifies the loader announces the IFD 0 entry count and named entries from the canon fixture.
exif --debug --machine-readable preserves the tab-delimited record stream Port / libexif / usage-exif-cli-debug-machine-readable-combo Passed
Runs the exif client with --debug --machine-readable against the canon fixture and verifies the loader trace is emitted to stderr while stdout still carries the standard tab-delimited Manufacturer/Canon and Model/Canon PowerShot S70 records, asserting --debug does not corrupt --machine-readable framing.
exif --debug --machine-readable --tag=Model triple-flag composition Port / libexif / usage-exif-cli-debug-machine-tag-triple-flag Passed
Runs the exif client with the three flags --debug, --machine-readable, and --tag=Model combined against the canon fixture and verifies the loader trace lines reach stderr (or fall back to stdout) while the requested Model record still appears in machine-readable form on stdout, asserting that scoping with --tag does not suppress --debug diagnostics and that --debug does not corrupt single-tag --machine-readable output.
exif --debug --no-fixup still emits loader trace Port / libexif / usage-exif-cli-debug-no-fixup-loader-trace Passed
Runs the exif client with --debug --no-fixup against the canon fixture and verifies the loader still announces the EXIF header, IFD 0 offset, the 9-entry count, and the named Make and Model entries even with the no-fixup switch present.
exif --debug --tag=DateTimeOriginal preserves the scoped readout Port / libexif / usage-exif-cli-debug-tag-datetime-original Passed
Runs the exif client with the combined --debug and --tag=DateTimeOriginal flags against the canon fixture and verifies the loader trace reaches the combined output stream while the scoped pretty-print still surfaces the DateTimeOriginal Value line carrying the literal 2009:10:10 16:42:32 timestamp. The combined output is also compared against a clean (non-debug) scoped run to confirm --debug does not drop or rewrite the scoped Value line.
exif on a directory target fails with the not-readable diagnostic Port / libexif / usage-exif-cli-directory-target-error Passed
Invokes the exif client against a directory path (not a regular file) and verifies the client exits non-zero with the canonical "is not readable or does not contain EXIF data" diagnostic naming the directory, matching libexif's read-as-file behavior on Ubuntu 24.04.
exif exposure mode tag Port / libexif / usage-exif-cli-exposure-mode-tag Passed
exif exposure time tag Port / libexif / usage-exif-cli-exposure-time Passed
exif extract then remove-thumbnail then re-extract sequence Port / libexif / usage-exif-cli-extract-remove-reextract-state Passed
Walks the canon fixture through extract-thumbnail, remove-thumbnail on a copy, and a re-extract attempt against the stripped copy, verifying the first extraction produces a non-empty file, the strip succeeds, and the second extraction fails with a does not contain a thumbnail diagnostic, while a fresh extract from the original still succeeds.
exif --extract-thumbnail is byte-stable across re-runs Port / libexif / usage-exif-cli-extract-thumbnail-bytewise-equal Passed
Runs exif --extract-thumbnail twice against the canon fixture writing to two distinct output files, verifies both are non-empty, and asserts that the two extracted thumbnail files are byte-for-byte equal so callers can rely on deterministic re-extraction.
exif --extract-thumbnail honors a precise --output path Port / libexif / usage-exif-cli-extract-thumbnail-explicit-output-path Passed
Runs the exif client with --extract-thumbnail and a specific --output path containing a non-default filename and verifies the resulting JPEG lands at exactly that path (and only that path), carries the FFD8FF SOI magic, has a non-trivial size, and that exif's own diagnostic line names the requested path. Pins the path-honoring contract for dependent clients that ask for a precise output filename rather than the conventional thumbnail.jpg sibling.
exif extracted thumbnail JPEG magic Port / libexif / usage-exif-cli-extract-thumbnail-jpeg-magic Passed
Extracts the embedded thumbnail with exif --extract-thumbnail and verifies the output begins with the FFD8FF JPEG SOI marker.
exif --extract-thumbnail writes into a pre-created nested directory Port / libexif / usage-exif-cli-extract-thumbnail-nested-output-dir Passed
Creates a multi-level nested directory tree, runs exif --extract-thumbnail with --output pointing into the deepest leaf, and verifies the thumbnail JPEG lands at the requested path with FFD8FF magic, while a parallel run against a non-existent leaf without prior mkdir fails with a write diagnostic and produces no file.
exif --extract-thumbnail emits a JPEG with SOI and EOI markers Port / libexif / usage-exif-cli-extract-thumbnail-soi-eoi-bytes Passed
Extracts the embedded thumbnail from the canon fixture with exif --extract-thumbnail and verifies the file begins with the FFD8FF JPEG SOI marker and ends with the FFD9 JPEG EOI marker, asserting the extracted thumbnail is a complete, framed JPEG rather than a truncated payload.
exif CLI thumbnail extraction Port / libexif / usage-exif-cli-extract-thumbnail Passed
exif Flash tag Port / libexif / usage-exif-cli-flash-tag Passed
exif FNumber tag Port / libexif / usage-exif-cli-fnumber Passed
exif focal length tag Port / libexif / usage-exif-cli-focal-length-tag Passed
exif --help lists every documented switch Port / libexif / usage-exif-cli-help-option-banner Passed
Runs exif --help and verifies the help screen advertises the canonical option set including --tag, --ifd, --list-tags, --show-mnote, --remove, --extract-thumbnail, --insert-thumbnail, --no-fixup, --output, --set-value, --create-exif, --machine-readable, --width, --xml-output, and --debug, exactly as shipped on Ubuntu 24.04.
exif --ids --machine-readable cross-check Port / libexif / usage-exif-cli-ids-machine-readable-cross-check Passed
Runs the exif client with --ids --machine-readable on the canon fixture, parses the tab-delimited stream, and cross-checks the value column for tag id 0x0112 (Orientation) against the corresponding plain --machine-readable lookup to confirm both modes report identical Right-top text.
exif --ids reports Orientation hex tag id Port / libexif / usage-exif-cli-ids-orientation-hex Passed
Runs the exif client with --ids to print numeric tag identifiers and verifies the Orientation tag id 0x112 with its Right-top value.
exif IFD EXIF exposure time Port / libexif / usage-exif-cli-ifd-exif-exposure-time Passed
exif IFD EXIF F number Port / libexif / usage-exif-cli-ifd-exif-fnumber Passed
exif CLI EXIF IFD Port / libexif / usage-exif-cli-ifd-exif Passed
exif --ifd=GPS pretty readout is graceful on a GPS-less fixture Port / libexif / usage-exif-cli-ifd-gps-pretty-empty Passed
Runs the exif client with --ifd=GPS (without --machine-readable) against the canon fixture which carries no GPS metadata, and verifies the readout exits cleanly without crashing, emits no GPS-tag labels (GPSLatitude, GPSLongitude, GPSAltitude, GPSTimeStamp), and does not leak unrelated IFD 0 / EXIF IFD labels (Manufacturer, F-Number, Color Space) into the GPS-scoped output. Pins the graceful empty contract for the human-readable IFD scope when GPS data is absent.
exif IFD1 compression Port / libexif / usage-exif-cli-ifd-one-compression-batch11 Passed
exif IFD1 resolution unit Port / libexif / usage-exif-cli-ifd-one-resolution-unit-batch11 Passed
exif IFD zero make Port / libexif / usage-exif-cli-ifd-zero-make Passed
exif IFD0 model tag Port / libexif / usage-exif-cli-ifd-zero-model Passed
exif IFD0 orientation tag Port / libexif / usage-exif-cli-ifd-zero-orientation Passed
exif IFD zero listing Port / libexif / usage-exif-cli-ifd-zero Passed
exif --insert-thumbnail roundtrip preserves bytes Port / libexif / usage-exif-cli-insert-thumbnail-roundtrip Passed
Builds a minimal JPEG, inserts it into a copy of the canon fixture with --insert-thumbnail, then re-extracts the thumbnail and asserts byte-for-byte equality.
exif --tag rejects an unknown tag name Port / libexif / usage-exif-cli-invalid-tag-name-error Passed
Runs exif --tag=NotARealTag against the canon fixture and verifies the client exits non-zero and prints the canonical "Invalid tag" diagnostic naming the bogus token. Pins libexif's argp-side validation of --tag values on Ubuntu 24.04 against accidental client typos.
exif list color space Port / libexif / usage-exif-cli-list-color-space Passed
exif list focal length Port / libexif / usage-exif-cli-list-focal-length Passed
Lists EXIF metadata for the sample JPEG and verifies the focal length line and decoded value are present.
exif list orientation Port / libexif / usage-exif-cli-list-orientation Passed
Lists EXIF metadata for the sample JPEG and verifies the orientation line and decoded value are present.
exif list pixel dimensions Port / libexif / usage-exif-cli-list-pixel-dimensions Passed
exif -l -i -m emits the IFD support grid with hex IDs Port / libexif / usage-exif-cli-list-tags-machine-ids-grid Passed
Runs exif with --list-tags combined with --ids and --machine-readable against the canon fixture and verifies the client emits the documented IFD support grid pinning the column header set (0, 1, EXIF, GPS, Interop), the hex tag id format (0x0001), and the presence of a known Interoperability tag row that locks the libexif Ubuntu 24.04 list-tags reference grid that callers parse to map tag-id-to-IFD support.
exif CLI lists camera tags Port / libexif / usage-exif-cli-list-tags Passed
exif machine color space Port / libexif / usage-exif-cli-machine-color-space Passed
exif machine DateTimeOriginal Port / libexif / usage-exif-cli-machine-datetime-original Passed
exif machine DateTime Port / libexif / usage-exif-cli-machine-datetime Passed
exif machine ExifVersion Port / libexif / usage-exif-cli-machine-exif-version Passed
exif machine FlashPixVersion Port / libexif / usage-exif-cli-machine-flashpix-version Passed
Reads FlashPixVersion via exif --machine-readable and verifies that FlashPix Version 1.0 is reported.
exif machine focal length Port / libexif / usage-exif-cli-machine-focal-length Passed
exif machine focal plane X resolution Port / libexif / usage-exif-cli-machine-focal-plane-x-resolution-batch11 Passed
exif --machine-readable --ifd=EXIF emits FlashPixVersion Port / libexif / usage-exif-cli-machine-ifd-exif-flashpix Passed
Runs the exif client with --machine-readable --ifd=EXIF and verifies the EXIF IFD tab-delimited stream contains FlashPixVersion 1.0 plus other EXIF-IFD tags while excluding the IFD 0 Manufacturer entry.
exif --machine-readable --ifd=GPS reports empty GPS IFD Port / libexif / usage-exif-cli-machine-ifd-gps-empty Passed
Runs the exif client with --machine-readable --ifd=GPS against the canon fixture which has no GPS metadata and verifies the stream emits only the synthetic ThumbnailSize entry without EXIF or IFD 0 tags.
exif --machine-readable --ifd=0 emits IFD 0 tags Port / libexif / usage-exif-cli-machine-ifd-zero-tabs Passed
Runs the exif client with --machine-readable --ifd=0 and verifies the IFD 0 tab-delimited stream contains the Manufacturer and Model entries while excluding EXIF-IFD-only tags such as F-Number.
exif --machine-readable parses into shell key=value pairs Port / libexif / usage-exif-cli-machine-key-value-shell-parse Passed
Runs the exif client with --machine-readable and pipes the tab-delimited stream through awk to produce a key=value file, then verifies that programmatic lookups for Manufacturer, Model, Color Space, and Exif Version recover the expected literal values.
exif machine-readable make Port / libexif / usage-exif-cli-machine-make Passed
exif machine-readable maker note Port / libexif / usage-exif-cli-machine-maker-note-thumbnail Passed
Emits full machine-readable EXIF metadata and verifies Maker Note and ThumbnailSize rows from the structured output.
exif machine MeteringMode Port / libexif / usage-exif-cli-machine-metering-mode Passed
Reads MeteringMode via exif --machine-readable and verifies that the Pattern metering mode is reported.
exif machine model Port / libexif / usage-exif-cli-machine-model-value Passed
exif machine-readable model Port / libexif / usage-exif-cli-machine-model Passed
exif machine orientation Port / libexif / usage-exif-cli-machine-orientation Passed
exif machine PixelXDimension Port / libexif / usage-exif-cli-machine-pixel-x-dimension Passed
exif machine PixelYDimension Port / libexif / usage-exif-cli-machine-pixel-y-dimension Passed
Reads PixelYDimension via exif --machine-readable and verifies the 480 pixel height is reported.
exif --machine-readable populates a bash associative array Port / libexif / usage-exif-cli-machine-readable-associative-array Passed
Runs the exif client with --machine-readable against the canon fixture, parses the tab-delimited stream into a bash associative array indexed by tag name, and verifies that array lookups for Manufacturer, Model, Color Space, Orientation, and Compression each yield the expected canonical literal values, demonstrating the machine-readable format is robust enough for shell-side declare -A consumers.
exif --machine-readable --no-fixup combo emits Make Port / libexif / usage-exif-cli-machine-readable-no-fixup-make Passed
Combines --machine-readable with --no-fixup against the canon fixture and verifies the tab-delimited stream still reports the Manufacturer entry as Canon, that --tag=Make produces only Canon on its own line, and that the field-count and value match the plain --machine-readable run.
exif CLI machine output Port / libexif / usage-exif-cli-machine-readable Passed
exif machine RelatedImageLength Port / libexif / usage-exif-cli-machine-related-image-length Passed
Reads RelatedImageLength via exif --machine-readable and verifies the 480 pixel height is reported for the sample image.
exif machine RelatedImageWidth Port / libexif / usage-exif-cli-machine-related-image-width Passed
Reads RelatedImageWidth via exif --machine-readable and verifies the 640 pixel width is reported for the sample image.
exif machine ResolutionUnit Port / libexif / usage-exif-cli-machine-resolution-unit Passed
Reads ResolutionUnit via exif --machine-readable and verifies that inch units are reported for the sample image.
exif machine SceneCaptureType Port / libexif / usage-exif-cli-machine-scene-capture Passed
Reads SceneCaptureType via exif --machine-readable and verifies that the Landscape scene capture type is reported.
exif --machine-readable --tag=ExposureTime emits 1 sec. Port / libexif / usage-exif-cli-machine-tag-exposure-time Passed
Runs the exif client with --machine-readable --tag=ExposureTime against the canon fixture and verifies the scoped run emits exactly one line carrying the 1 sec. value, while a parallel scan of the unscoped --machine-readable stream confirms the same value is reachable when filtered for the Exposure Time row.
exif --machine-readable --tag=Make returns the explicit Canon scalar Port / libexif / usage-exif-cli-machine-tag-make-explicit Passed
Runs the exif client with --machine-readable --tag=Make against the canon fixture and verifies the streamed output is a single tab-delimited record whose payload is exactly the literal Canon manufacturer string. The probe pins the explicit-value contract for dependent clients that key off Make, ruling out localized labels, multi-row framing, or accidental empty payloads when --tag is combined with --machine-readable.
exif machine X resolution Port / libexif / usage-exif-cli-machine-x-resolution-batch11 Passed
exif machine Y resolution Port / libexif / usage-exif-cli-machine-y-resolution-batch11 Passed
exif machine YCbCrPositioning Port / libexif / usage-exif-cli-machine-ycbcr-positioning-batch11 Passed
exif CLI maker note Port / libexif / usage-exif-cli-maker-note Passed
exif metering mode tag Port / libexif / usage-exif-cli-metering-mode-tag Passed
exif accepts multiple positional file arguments Port / libexif / usage-exif-cli-multiple-files-positional Passed
Runs the exif client with two positional JPEG paths that point at the same canon fixture and verifies the client emits one EXIF tags table per argument by counting the per-file header banner. Pins libexif's positional file iteration contract on Ubuntu 24.04 for callers that batch multiple JPEGs in a single invocation.
exif rejects JPEG without EXIF data Port / libexif / usage-exif-cli-no-exif-error Passed
Synthesises a minimal JFIF JPEG with no EXIF segment, runs the exif client against it, and verifies the client exits non-zero and prints the does not contain EXIF data diagnostic naming the synthesised file.
exif --no-fixup keeps Make tag readable Port / libexif / usage-exif-cli-no-fixup-tag-make Passed
Runs the exif client with --no-fixup so that no automatic tag repair is performed and verifies that the Make tag still parses to Canon from the canon fixture.
exif against canon fixture exposes no XMP-derived tags Port / libexif / usage-exif-cli-no-xmp-block-canon-fixture Passed
Runs the exif client against the canon fixture in machine-readable mode and verifies the streamed records contain none of the XMP-derived field names a dependent client might expect to see when an XMP packet is present (XMPToolkit, dc:creator, xmp:CreatorTool, photoshop:DateCreated). libexif itself does not parse XMP, but a fixture that carries an XMP APP1 segment can cause clients to scrape XMP names out of the JPEG; this testcase pins the canon fixture as XMP-free so other testcases can rely on that.
exif on a nonexistent path reports the not-readable diagnostic Port / libexif / usage-exif-cli-nonexistent-file-error Passed
Runs the exif client against a path that does not exist on disk and verifies the client exits with status 1, names the missing path verbatim in the diagnostic, and prints the canonical "is not readable or does not contain EXIF data" message that callers parse to distinguish IO failures from clean runs on Ubuntu 24.04.
exif orientation tag Port / libexif / usage-exif-cli-orientation-tag Passed
exif pixel dimensions Port / libexif / usage-exif-cli-pixel-dimensions Passed
exif related image length Port / libexif / usage-exif-cli-related-image-length Passed
exif related image width Port / libexif / usage-exif-cli-related-image-width Passed
exif --remove --tag=DateTime --ifd=0 strips the top-level timestamp Port / libexif / usage-exif-cli-remove-datetime-ifd-zero Passed
Copies the canon JPEG fixture to a tmpdir and removes the top-level DateTime tag from IFD 0 with exif --remove, then verifies the rewritten file no longer reports DateTime via --tag=DateTime, that IFD 0 entry count drops from 9 to 8 in the --debug trace, and that the unrelated Model tag remains intact and equal to the original readout.
exif --remove decrements IFD 0 entry count Port / libexif / usage-exif-cli-remove-decrements-ifd-zero-entries Passed
Removes the Make tag from a copy of the canon JPEG and confirms via --debug that IFD 0 now reports 8 entries instead of the original 9.
exif --remove --ifd=1 invalidates thumbnail Compression value Port / libexif / usage-exif-cli-remove-ifd1-then-thumbnail-tag-gone Passed
Removes IFD 1 from a copy of the canon fixture using exif --remove --ifd=1, then re-reads --tag=Compression --ifd=1 against the rewritten file and confirms the Compression entry value collapses to the libexif Internal error (unknown value 0) marker rather than the original JPEG compression label, while IFD 0 Make remains Canon and the original fixture still reports JPEG compression.
exif --remove drops Make from a copy Port / libexif / usage-exif-cli-remove-make-tag Passed
Copies the canon JPEG fixture to a tmpdir and removes the Make tag with exif --remove, verifying the Make tag is gone while Model remains intact.
exif --remove Make leaves the embedded thumbnail intact Port / libexif / usage-exif-cli-remove-make-then-extract-thumbnail Passed
Strips the IFD 0 Make tag from a copy of the canon fixture with exif --remove --tag=Make, then runs --extract-thumbnail against the rewritten file and verifies the thumbnail still extracts byte-for-byte identically to the thumbnail extracted from the untouched original, confirming Make removal and thumbnail extraction are independent.
exif --remove --tag=Copyright handles tag absent from fixture Port / libexif / usage-exif-cli-remove-missing-copyright Passed
Confirms the canon fixture has no Copyright tag in IFD 0, then runs exif --remove --tag=Copyright --ifd=0 against a copy and checks that the client either errors out cleanly or no-ops without corrupting the file, with IFD 0 still loading 9 entries afterwards.
exif --remove-thumbnail then --extract-thumbnail reports absence Port / libexif / usage-exif-cli-remove-thumbnail-then-extract Passed
Strips the embedded thumbnail from a copy of the canon fixture with --remove-thumbnail, then runs --extract-thumbnail against the rewritten file and verifies the client exits non-zero with a does not contain a thumbnail diagnostic and produces no output file, while the original fixture still yields a thumbnail.
exif scene capture type Port / libexif / usage-exif-cli-scene-capture-tag Passed
exif --set-value rewrites DateTimeOriginal Port / libexif / usage-exif-cli-set-value-datetime-original-readback Passed
Uses exif --set-value with --ifd=EXIF to overwrite DateTimeOriginal on a copy of the canon fixture and confirms the new timestamp is reported on readback.
exif --set-value cross-validated via --machine-readable bytes Port / libexif / usage-exif-cli-set-value-machine-readable-bytes Passed
Rewrites the Make tag on a copy of the canon fixture with --set-value, reads the new value back through --tag=Make, then runs --machine-readable --tag=Make against the rewritten file and compares the exact byte sequence on stdout to the literal new value to confirm the rewrite is observable through both rendering modes.
exif --set-value rewrites Make tag Port / libexif / usage-exif-cli-set-value-make-readback Passed
Uses exif --set-value with --ifd=0 to replace the Make tag on a copy of the canon fixture and reads the new value back from the rewritten JPEG.
exif --set-value rewrites Orientation Short tag Port / libexif / usage-exif-cli-set-value-orientation-readback Passed
Uses exif --set-value with --ifd=0 --tag=Orientation to replace the SHORT-typed Orientation entry on a copy of the canon fixture (4 -> 1, "Bottom-left" to "Top-left") and reads the new value back from the rewritten JPEG. The original fixture is verified untouched and the rewritten copy must report Orientation=1 with the human-readable "Top-left" label, pinning libexif's set-value path for non-ASCII (Short) tags on Ubuntu 24.04.
exif --set-value rewrites rational ExposureTime Port / libexif / usage-exif-cli-set-value-rational-exposure Passed
Uses exif --set-value with --ifd=EXIF to overwrite the rational ExposureTime tag using two-component numerator/denominator input on a copy of the canon fixture and verifies the rewritten JPEG reports the new 1/250 sec value while the original remains 1 sec.
exif -e -o short-flag form extracts the thumbnail Port / libexif / usage-exif-cli-short-flag-extract-thumbnail Passed
Invokes exif using the short-flag form (-e for --extract-thumbnail and -o for --output) instead of the long-flag form and verifies the client writes the same 4-byte thumbnail payload to the requested path with the canonical "Wrote file" diagnostic. Pins libexif's short-flag parity on Ubuntu 24.04 so dependent clients that prefer terse argv can rely on identical behavior.
exif --show-description prints DateTime help Port / libexif / usage-exif-cli-show-description-datetime Passed
Asks the exif client for the DateTime tag description with --show-description --ifd=0 and verifies the standard EXIF documentation string is reported.
exif --show-description FNumber in IFD EXIF Port / libexif / usage-exif-cli-show-description-fnumber-exif Passed
Invokes exif --show-description --ifd=EXIF --tag=FNumber on the canon fixture and verifies libexif resolves the EXIF subdirectory binding so the description names the F-Number tag with hex id 0x829d and the canonical short description The F number, distinguishing the tag from a same-named entry in IFD 0.
exif --show-description GPSLatitude in GPS IFD Port / libexif / usage-exif-cli-show-description-gps-latitude Passed
Invokes exif --show-description --ifd=GPS --tag=GPSLatitude against the canon fixture and confirms the GPS subdirectory dispatch resolves to tag id 0x0002 with symbolic name GPSLatitude and the libexif documentation snippet expressed as three RATIONAL values giving the degrees, minutes, and seconds.
exif --show-description Orientation in IFD 0 Port / libexif / usage-exif-cli-show-description-orientation-ifd0 Passed
Invokes exif --show-description --ifd=0 --tag=Orientation against the canon fixture and verifies the human readable description references the canonical hex tag id 0x0112, the symbolic Orientation name, and the substring image orientation viewed in terms of rows and columns shipped by libexif.
exif -s without --ifd demands an IFD Port / libexif / usage-exif-cli-show-description-without-ifd-error Passed
Runs exif --show-description --tag=Orientation against the canon fixture without specifying an --ifd and verifies the client refuses to disambiguate, exiting non-zero with the canonical "You need to specify an IFD!" diagnostic. This pins the libexif Ubuntu 24.04 behavior that show-description requires an explicit IFD scope when the requested tag is registered in more than one IFD.
exif maker note firmware Port / libexif / usage-exif-cli-show-mnote-firmware-batch11 Passed
exif --show-mnote --ids prefixes rows with 0x0001 hex tag ids Port / libexif / usage-exif-cli-show-mnote-ids-hex-prefix Passed
Runs exif --show-mnote --ids on the canon fixture and confirms the maker-note dump still announces 96 entries with MakerNote contains 96 values and renders Canon mnote rows using hex tag ids prefixed with 0x rather than the symbolic Macro Mode label, with the very first 0x0001 row decoded as the Normal value and a Superfine Quality row also reachable.
exif --show-mnote --machine-readable emits tab-separated rows Port / libexif / usage-exif-cli-show-mnote-machine-readable-tabs Passed
Runs exif --show-mnote --machine-readable on the canon fixture and verifies the maker-note dump uses the canonical name<TAB>value layout with no plus-or-pipe separator characters and includes the Canon-specific Macro Mode, Quality, Flash Mode, and Image Size lines reachable through the libexif Canon mnote backend.
exif --tag=ApertureValue auto-finds the APEX aperture Port / libexif / usage-exif-cli-tag-aperture-value Passed
Runs the exif client with --tag=ApertureValue against the canon fixture and verifies the readout includes the ApertureValue label and a non-empty Value line carrying the composed APEX rendering, then re-runs with --machine-readable to confirm the same scalar appears as a single tab-delimited record. ApertureValue is a composed APEX tag whose human form is the f/N rendering libexif derives from the rational stored in the EXIF IFD.
exif --tag=0x0112 selects Orientation by numeric ID Port / libexif / usage-exif-cli-tag-by-hex-id-orientation Passed
Runs exif with --tag specified as the bare hexadecimal Orientation tag id (0x0112) and verifies the client resolves the numeric id to the same entry it reports under the symbolic name, including the IFD '0' provenance line, the format Short triple, the single-component descriptor, and the human-readable Right-top value from the canon fixture.
exif --ids --tag=ColorSpace reports 0xa001 Port / libexif / usage-exif-cli-tag-color-space-ids-hex Passed
Runs the exif client with --ids --tag=ColorSpace against the canon fixture and verifies the EXIF tag id for ColorSpace is reported as 0xa001 alongside the symbolic name and the sRGB value, asserting the numeric id and decoded value live on the same readout.
exif tag color space via sed Port / libexif / usage-exif-cli-tag-color-space-sed Passed
Extracts the exif ColorSpace tag value through shell text processing and verifies the parsed color space.
exif tag components configuration Port / libexif / usage-exif-cli-tag-components-configuration Passed
Reads the ComponentsConfiguration EXIF tag with the exif client and verifies that the expected Y Cb Cr channel order is reported.
exif tag compression JPEG Port / libexif / usage-exif-cli-tag-compression-jpeg Passed
Reads the Compression EXIF tag with the exif client and verifies that JPEG compression is reported for the sample image.
exif --tag=Compression cross-checks human and machine-readable JPEG mode Port / libexif / usage-exif-cli-tag-compression-machine-cross-check Passed
Reads the Compression tag with the exif client in both default text mode and --machine-readable mode against the canon fixture, asserts the human-readable form contains the JPEG compression label while the machine-readable form is the bare JPEG compression record, and asserts the two outputs differ so the formatting modes really are independent.
exif --tag=DateTime cross-checked against the 0x0132 hex id Port / libexif / usage-exif-cli-tag-datetime-ids-hex Passed
Reads the top-level DateTime tag with the exif client both by symbolic name and via the --ids dump that prints numeric tag ids in hex against the canon fixture, verifying the canonical timestamp 2009:10:10 16:42:32 surfaces from the symbolic --tag=DateTime call and that the --ids listing of IFD 0 contains the 0x0132 DateTime tag id paired with the same timestamp.
exif CLI DateTimeOriginal tag Port / libexif / usage-exif-cli-tag-datetime-original Passed
exif tag date time via sed Port / libexif / usage-exif-cli-tag-datetime-sed Passed
Extracts the exif DateTime tag value through shell text processing and verifies the parsed timestamp.
exif CLI DateTime tag Port / libexif / usage-exif-cli-tag-datetime Passed
exif tag digital zoom ratio Port / libexif / usage-exif-cli-tag-digital-zoom-ratio Passed
Reads the DigitalZoomRatio EXIF tag with the exif client and verifies that the expected 1.0000 ratio is reported.
exif --tag=ExifOffset reports the EXIF IFD pointer tag Port / libexif / usage-exif-cli-tag-exif-offset-pointer Passed
Runs the exif client with --tag=ExifOffset against the canon fixture and verifies the readout includes a Value line whose payload is non-empty. ExifOffset is the IFD 0 pointer tag (0x8769) that libexif uses to locate the EXIF sub-IFD, so any well-formed JPEG with EXIF metadata exposes it. The machine-readable probe is also verified to emit a single tab-delimited record so dependent clients can read the pointer scalar without parsing the pretty layout.
exif tag ExifVersion 2.2 Port / libexif / usage-exif-cli-tag-exif-version-22 Passed
Reads the ExifVersion EXIF tag with the exif client and verifies that Exif Version 2.2 is reported.
exif --ids --ifd=EXIF --tag=ExposureTime reports 0x829a Port / libexif / usage-exif-cli-tag-exposure-time-ids-ifd-exif Passed
Runs the exif client with --ids --ifd=EXIF --tag=ExposureTime against the canon fixture and verifies the EXIF-IFD scoped readout reports the numeric tag id 0x829a paired with the ExposureTime symbolic name and the 1 sec. value.
exif tag file source Port / libexif / usage-exif-cli-tag-file-source Passed
Reads the FileSource EXIF tag with the exif client and verifies that the DSC source marker is reported.
exif tag FlashPixVersion 1.0 Port / libexif / usage-exif-cli-tag-flashpix-version-10 Passed
Reads the FlashPixVersion EXIF tag with the exif client and verifies that FlashPix Version 1.0 is reported.
exif --show-description --tag=FlashPixVersion prints help text Port / libexif / usage-exif-cli-tag-flashpix-version-show-description Passed
Asks the exif client for the FlashPixVersion tag description with --show-description --ifd=EXIF and verifies the standard EXIF documentation string is reported including the symbolic name and the explanatory text about the supported FlashPix format version.
exif --tag=FNumber --ifd=EXIF pins f/2.8 Port / libexif / usage-exif-cli-tag-fnumber-ifd-exif-value Passed
Runs the exif client with --tag=FNumber --ifd=EXIF against the canon fixture and verifies the EXIF-scoped readout reports the F-Number label with the exact f/2.8 value, while a parallel probe scoped to --ifd=0 fails because the tag does not live in IFD 0.
exif tag focal length via sed Port / libexif / usage-exif-cli-tag-focal-length-sed Passed
Extracts the exif FocalLength tag value through shell text processing and verifies the parsed focal length.
exif tag interoperability index Port / libexif / usage-exif-cli-tag-interoperability-index Passed
Reads the InteroperabilityIndex EXIF tag with the exif client and verifies that the R98 marker is reported.
exif --tag=0xa005 reports the Interop pointer tag Port / libexif / usage-exif-cli-tag-interoperability-offset-pointer Passed
Runs the exif client with --tag=0xa005 against the canon fixture and verifies the readout includes a Value line whose payload is non-empty. ExifInteroperabilityOffset (0xA005) lives in the EXIF IFD and points at the Interoperability IFD; the canon fixture carries an Interop IFD (its InteroperabilityIndex tag is exercised by the quad-probe testcase), so the pointer tag must resolve. The machine-readable probe is also verified to emit a single tab-delimited record.
exif tag interoperability version Port / libexif / usage-exif-cli-tag-interoperability-version Passed
Reads the InteroperabilityVersion EXIF tag with the exif client and verifies that the expected 0100 version string is reported.
exif --tag scoped read against canon fixture Port / libexif / usage-exif-cli-tag-iso-speed-ratings Passed
Runs the exif client with a --tag flag against the canon fixture and verifies the readout includes the requested tag's label and a non-empty Value line, then re-runs with --machine-readable to confirm the same scalar appears as a tab-delimited record. The canon fixture does not carry an ISOSpeedRatings tag, so this exercises the scoped --tag readout against Manufacturer, which the fixture does carry.
exif tag make via sed Port / libexif / usage-exif-cli-tag-make-sed Passed
Extracts the exif Make tag value through shell text processing and verifies the parsed camera make.
exif CLI make tag Port / libexif / usage-exif-cli-tag-make Passed
exif tag model via sed Port / libexif / usage-exif-cli-tag-model-sed Passed
Extracts the exif Model tag value through shell text processing and verifies the parsed camera model.
exif CLI model tag Port / libexif / usage-exif-cli-tag-model Passed
exif --tag=0x0112 numeric Orientation lookup Port / libexif / usage-exif-cli-tag-numeric-orientation Passed
Looks up the Orientation tag by its numeric tag id 0x0112 instead of by name and verifies the canon fixture reports the Orientation entry with value Right-top, then cross-checks the same record against a name-based --tag=Orientation lookup to confirm the two produce equivalent metadata.
exif tag orientation via sed Port / libexif / usage-exif-cli-tag-orientation-sed Passed
Extracts the exif Orientation tag value through shell text processing and verifies the parsed orientation.
exif pixel X dimension tag Port / libexif / usage-exif-cli-tag-pixel-x-dimension Passed
exif tag pixel x via sed Port / libexif / usage-exif-cli-tag-pixel-x-sed Passed
Extracts the exif PixelXDimension tag value through shell text processing and verifies the parsed width.
exif pixel Y dimension tag Port / libexif / usage-exif-cli-tag-pixel-y-dimension Passed
exif tag pixel y via sed Port / libexif / usage-exif-cli-tag-pixel-y-sed Passed
Extracts the exif PixelYDimension tag value through shell text processing and verifies the parsed height.
exif tag resolution unit inch Port / libexif / usage-exif-cli-tag-resolution-unit-inch Passed
Reads the ResolutionUnit EXIF tag with the exif client and verifies that inch units are reported.
exif --tag=ResolutionUnit consistent with XResolution and YResolution Port / libexif / usage-exif-cli-tag-resolution-unit-paired-resolutions Passed
Reads ResolutionUnit, XResolution, and YResolution from the canon fixture with the exif client, verifies the unit is reported as Inch and that XResolution and YResolution both surface their numeric ratios so callers parsing DPI metadata see all three tags consistently from one tool invocation per tag.
exif tag sensing method Port / libexif / usage-exif-cli-tag-sensing-method Passed
Reads the SensingMethod EXIF tag with the exif client and verifies that the expected sensor type is reported.
exif --tag=ShutterSpeedValue auto-finds the APEX shutter time Port / libexif / usage-exif-cli-tag-shutter-speed-value Passed
Runs the exif client with --tag=ShutterSpeedValue against the canon fixture and verifies the readout includes the ShutterSpeedValue label and a non-empty Value line carrying the composed APEX rendering, then re-runs with --machine-readable to confirm the same scalar appears as a single tab-delimited record. ShutterSpeedValue is the APEX TV counterpart to ExposureTime and libexif renders it from the signed rational stored in the EXIF IFD.
exif --tag without --ifd resolves IFD 0 then EXIF tags Port / libexif / usage-exif-cli-tag-without-ifd-dual-probe Passed
Runs the exif client with --tag and no --ifd argument, first against the IFD 0 Make tag and then against the EXIF-IFD FNumber tag, verifying the client transparently locates each tag in its native IFD and reports Canon for Make and f/2.8 for FNumber, exactly matching the explicitly scoped --ifd readouts.
exif --tag without --ifd auto-finds tags across four IFDs Port / libexif / usage-exif-cli-tag-without-ifd-quad-probe Passed
Runs the exif client with --tag and no --ifd argument against four tags whose native homes span IFD 0 (Model), the EXIF IFD (ExposureTime), IFD 1 (Compression for the thumbnail), and the Interoperability IFD (InteroperabilityIndex), verifying that auto-finding succeeds and reports the expected literal value for each tag without the caller specifying which IFD to scope to.
exif YCbCrPositioning tag Port / libexif / usage-exif-cli-tag-ycbcr-positioning-batch11 Passed
exif --tag=YCbCrPositioning reports the textual position keyword Port / libexif / usage-exif-cli-tag-ycbcr-positioning-co-sited Passed
Reads YCbCrPositioning with the exif client against the canon fixture and verifies the human-readable text mode reports a recognized chroma positioning keyword (either Co-sited or Centered, both spec-defined) and that the same tag in --machine-readable mode also emits that keyword on its bare line.
exif extracted thumbnail size Port / libexif / usage-exif-cli-thumbnail-size Passed
exif rejects a non-JPEG input with a diagnostic Port / libexif / usage-exif-cli-truncated-jpeg-error Passed
Feeds the exif client a payload that has no JPEG SOI marker (a plain text file) and a JPEG-shaped file that contains no EXIF segment, verifying the client surfaces a diagnostic on stdout/stderr and exits non-zero on the non-JPEG input while leaving the original canon fixture parseable.
exif --usage prints brief getopt synopsis Port / libexif / usage-exif-cli-usage-brief-banner Passed
Runs exif --usage and confirms the brief synopsis bundles the short-option cluster Usage: exif [-?vil|sercmxd] and lists the long-option synopsis tokens for --width, --xml-output, --debug, and the trailing OPTION...] file marker, distinct from the verbose --help screen.
exif --version reports a parseable banner Port / libexif / usage-exif-cli-version-banner Passed
Runs the exif client with --version and verifies the banner is a single line containing a numeric major.minor.patch version starting with 0.6, matching the libexif Ubuntu 24.04 baseline 0.6.x series.
exif --version writes only to stdout with a clean stderr Port / libexif / usage-exif-cli-version-channel-separation Passed
Runs the exif client with --version while capturing stdout and stderr separately and verifies the version banner lands exclusively on stdout as a single 0.6.x release identifier with no leading "exif" prefix or trailing copyright lines, and that stderr is empty. This pins the channel separation contract so dependent clients can `read VER < <(exif --version)` without coping with stderr noise.
exif white balance tag Port / libexif / usage-exif-cli-white-balance-tag Passed
exif --width=40 narrows the value column Port / libexif / usage-exif-cli-width-narrow-value-column Passed
Runs exif --width=40 against the canon fixture and verifies the underline separator row sized for a 40-column terminal contains exactly 30 dashes after the plus sign in the value column, matching libexif default tag-name width plus a 30-character value column for narrow terminals.
exif --width=120 widens the value column Port / libexif / usage-exif-cli-width-wide-value-column Passed
Runs exif --width=120 against the canon fixture and verifies the value-column separator row is exactly 98 dashes wide so wide terminals receive a stretched table while the narrow 40-column run still fits in 30 dashes, exposing the WIDTH parameter scaling factor for the table renderer.
exif XML ExifVersion Port / libexif / usage-exif-cli-xml-exif-version-batch11 Passed
exif XML FlashPixVersion Port / libexif / usage-exif-cli-xml-flashpix-version-batch11 Passed
exif XML focal length Port / libexif / usage-exif-cli-xml-focal-length Passed
exif --xml-output --ifd=EXIF emits F-Number element Port / libexif / usage-exif-cli-xml-ifd-exif-fnumber Passed
Runs the exif client with --xml-output --ifd=EXIF against the canon fixture and verifies the EXIF-IFD scoped XML stream wraps the F-Number element with f/2.8 alongside Exposure_Time and Color_Space, and excludes the IFD 0 Manufacturer element.
exif --xml-output --ifd=0 emits Make and Model Port / libexif / usage-exif-cli-xml-ifd-zero-make-model Passed
Restricts XML output to IFD 0 with --xml-output --ifd=0 and verifies the wrapper plus Manufacturer and Model elements for the canon fixture.
exif XML make tag Port / libexif / usage-exif-cli-xml-make Passed
exif XML model via regex Port / libexif / usage-exif-cli-xml-model-regex Passed
Parses exif XML output through Python regex matching and verifies the extracted model tag content.
exif XML model tag Port / libexif / usage-exif-cli-xml-model Passed
exif XML orientation tag Port / libexif / usage-exif-cli-xml-orientation-tag Passed
exif XML orientation tag Port / libexif / usage-exif-cli-xml-orientation Passed
exif --xml-output emits well-formed element names with matching close tags Port / libexif / usage-exif-cli-xml-output-attribute-element-names Passed
Runs the exif client with --xml-output against the canon fixture and asserts the stream surfaces the expected element names (Color_Space, Flash, Pixel_X_Dimension, File_Source) with both opening and closing tags, that every opening tag in the output has a matching closing tag count, and that there is at least one element so the XML output is structurally non-empty.
exif --xml-output exposes Orientation alongside other elements Port / libexif / usage-exif-cli-xml-output-tag-orientation Passed
Runs the exif client with --xml-output against the canon fixture and verifies the serialized XML stream contains the Orientation element with the Right-top value plus the Manufacturer element so both tag entries are surfaced; cross-checks the plain --tag=Orientation lookup reports the same Right-top value.
exif CLI XML output Port / libexif / usage-exif-cli-xml-output Passed
exif machine FocalPlaneResolutionUnit emits the unit string Port / libexif / usage-exif-r10-cli-machine-focal-plane-resolution-unit Passed
Reads the focal-plane resolution unit tag in machine-readable form against the canon fixture and verifies the scoped output is a single line equal to "Inch" libexif derives from the stored Short value, so callers can pair the FocalPlaneX/Y machine values with their declared unit.
exif machine FocalPlaneYResolution emits the rational scalar Port / libexif / usage-exif-r10-cli-machine-focal-plane-y-resolution Passed
Reads the focal-plane Y resolution tag in machine-readable form against the canon fixture and verifies a single-line tab-free numeric output with the 2253 prefix libexif emits from the stored Rational, complementing the existing FocalPlaneXResolution machine probe so callers can rely on both axes being consumable in scripts.
exif --machine-readable --ifd=Interoperability dumps the interop entries Port / libexif / usage-exif-r10-cli-machine-readable-ifd-interoperability Passed
Runs exif --machine-readable --ifd=Interoperability against the canon fixture and verifies the dump contains the Interoperability Index R98, Interoperability Version 0100, RelatedImageWidth 640, and RelatedImageLength 480 entries libexif exposes from that IFD as tab-delimited rows.
exif --tag=CompressedBitsPerPixel reports the Rational JPEG bit budget Port / libexif / usage-exif-r10-cli-tag-compressed-bits-per-pixel Passed
Runs exif --tag=CompressedBitsPerPixel against the canon fixture and verifies the readout names tag id 0x9102 in IFD EXIF, reports the Rational format with one component and 8-byte size, and exposes the bits-per-pixel scalar libexif decodes from the stored rational.
exif --tag=DateTimeDigitized reports the digitization timestamp Port / libexif / usage-exif-r10-cli-tag-datetime-digitized Passed
Runs exif --tag=DateTimeDigitized against the canon fixture and verifies the readout names the DateTimeDigitized tag in IFD EXIF, reports the ASCII format, and exposes the 2009:10:10 16:42:32 value byte-exact.
exif --tag=ExposureBiasValue surfaces the SRational EV reading Port / libexif / usage-exif-r10-cli-tag-exposure-bias-value Passed
Runs exif --tag=ExposureBiasValue against the canon fixture and verifies the readout exposes the ExposureBiasValue tag id 0x9204 in IFD EXIF as an SRational reading the composed 0.00 EV value libexif derives from the stored rational.
exif --tag=MaxApertureValue resolves the APEX maximum aperture Port / libexif / usage-exif-r10-cli-tag-max-aperture-value Passed
Runs exif --tag=MaxApertureValue against the canon fixture and verifies the readout names tag id 0x9205 in IFD EXIF, reports the Rational format, and renders the composed 2.97 EV f/2.8 reading libexif derives from the lens APEX maximum aperture rational.
exif --tag=UserComment reports the Undefined-format payload Port / libexif / usage-exif-r10-cli-tag-user-comment-undefined Passed
Runs exif --tag=UserComment against the canon fixture and verifies the readout names tag id 0x9286 in IFD EXIF, reports the Undefined format (format code 7) with the 264-byte payload size libexif sees in the entry header so callers can detect the present-but-empty UserComment slot before consuming it.
exif --xml-output --ifd=Interoperability scopes elements to that IFD Port / libexif / usage-exif-r10-cli-xml-output-ifd-interoperability Passed
Runs exif --xml-output --ifd=Interoperability against the canon fixture and verifies the XML stream contains the four Interoperability_Index, Interoperability_Version, RelatedImageWidth, and RelatedImageLength elements while excluding IFD-zero entries like Manufacturer or Orientation, confirming libexif honors the IFD scope when emitting XML.
exif --xml-output exposes Shutter_Speed as an XML element Port / libexif / usage-exif-r10-cli-xml-output-shutter-speed-element Passed
Runs exif --xml-output against the canon fixture and verifies the serialized XML stream contains the Shutter_Speed element carrying the composed APEX rendering 0.00 EV (1 sec.), confirming libexif maps the SRational ShutterSpeedValue tag to a sanitized XML element name.
exif --ids prints the hex tag id table with 0x010f mapping to Canon Port / libexif / usage-exif-r11-cli-ids-table-make-hex-row Passed
Runs exif --ids without a tag selector and verifies the hex-id table includes the row "0x010f|Canon" (Make tag id), confirming the table view replaces decoded tag names with their numeric hex identifiers.
exif --ifd=1 dump ends with the thumbnail-byte announcement line Port / libexif / usage-exif-r11-cli-ifd-one-table-thumbnail-line Passed
Renders the IFD 1 dump for the canon fixture and verifies the line "EXIF data contains a thumbnail (4 bytes)." is present, asserting libexif advertises the thumbnail payload size from the IFD-1 view in addition to listing the per-tag rows.
exif --ifd=0 ASCII table contains the Manufacturer row with pipe separator Port / libexif / usage-exif-r11-cli-ifd-zero-table-includes-manufacturer Passed
Renders the IFD 0 dump and verifies the row "Manufacturer |Canon" appears with the libexif pipe-aligned column layout, confirming the IFD-scoped table view is emitted and the Manufacturer ASCII value is reachable.
exif --remove drops Make so a subsequent --tag readback exits non-zero Port / libexif / usage-exif-r11-cli-remove-make-then-readback-fails Passed
Removes the Make (Manufacturer) tag from IFD 0, writes the JPEG to a new path, then asserts that re-reading the Make tag fails with "does not contain tag 'Make'." on stderr and a non-zero exit, exercising the destructive --remove path on a tag known to exist in the source fixture.
exif --set-value writes Artist into IFD 0 and reads it back Port / libexif / usage-exif-r11-cli-set-value-artist-roundtrip Passed
Sets the Artist tag in IFD 0 to a multi-word ASCII string, writes the JPEG to a new path, and verifies the machine-readable readback returns the same string verbatim with no surrounding annotation, exercising the ASCII writer for a tag not present in the source fixture.
exif --set-value Copyright records photographer with editor placeholder Port / libexif / usage-exif-r11-cli-set-value-copyright-photographer Passed
Writes the Copyright tag with a photographer-only string and verifies the machine-readable readback reports the photographer text and the libexif "(Photographer) - [None] (Editor)" template, exercising the dual-string Copyright structure.
exif --set-value writes ImageDescription into IFD 0 and reads it back Port / libexif / usage-exif-r11-cli-set-value-image-description Passed
Sets the ImageDescription tag in IFD 0 to a short ASCII string, writes the JPEG to a new path, and verifies the machine-readable readback returns the same string verbatim, exercising another text-tag writer in IFD 0 distinct from Make/Artist/Copyright already covered.
exif --show-description --ifd=EXIF --tag=ColorSpace prints the spec text Port / libexif / usage-exif-r11-cli-show-description-color-space Passed
Requests the human-readable description for the ColorSpace tag in the EXIF IFD and verifies the output begins with "Tag 'Color Space' (0xa001, 'ColorSpace'):" and references the sRGB / Uncalibrated specification, asserting libexif ships the descriptive metadata for this tag.
exif --show-mnote opens with the MakerNote value-count line Port / libexif / usage-exif-r11-cli-show-mnote-count-line Passed
Runs exif --show-mnote against the canon fixture and verifies the first line is exactly "MakerNote contains 96 values:", confirming libexif decodes the Canon MakerNote and reports the entry count up front.
exif --xml-output emits a single <exif> root element with proper close Port / libexif / usage-exif-r11-cli-xml-output-root-element Passed
Runs exif --xml-output without a tag selector and verifies the document opens with <exif> on line 1, closes with </exif> on the last line, and produces exactly one closing tag, asserting the well-formed wrapper around the per-tag XML elements.
exif -e short flag extracts the embedded thumbnail with a JPEG SOI/EOI envelope Port / libexif / usage-exif-r12-cli-extract-thumbnail-default-output-path Passed
Runs exif with the short -e flag (alias for --extract-thumbnail) and --output to a fresh path, and verifies the produced file starts with the JPEG SOI 0xFFD8 magic and ends with the EOI 0xFFD9 marker, asserting libexif emits a complete JPEG envelope rather than truncated payload bytes.
exif --tag=Make --machine-readable emits the Make value for the canon fixture Port / libexif / usage-exif-r12-cli-list-tags-includes-make-row Passed
Runs exif --tag=Make --machine-readable on the canon makernote fixture and asserts the output is non-empty and contains a printable Make value (the manufacturer name). (Noble's exif CLI does not implement --list-tags; the per-tag --machine-readable readback is the documented stable surface for verifying tag presence.)
exif --machine-readable --tag=Make returns "Canon" with no surrounding text Port / libexif / usage-exif-r12-cli-machine-readable-make-canon Passed
Reads the Make tag in --machine-readable mode and verifies the entire output is exactly "Canon" plus a single trailing newline, asserting libexif emits the bare ASCII value with no annotation in machine-readable mode.
exif --no-fixup --machine-readable returns Make=Canon unchanged from the on-disk bytes Port / libexif / usage-exif-r12-cli-no-fixup-machine-readable-make Passed
Reads Make in machine-readable mode with --no-fixup, which suppresses libexif's tag normalisation pass, and verifies the output is exactly "Canon", asserting the no-fixup path still surfaces present tags identically for tags that need no fixup.
exif --remove drops a previously-set Artist so a subsequent readback fails Port / libexif / usage-exif-r12-cli-remove-artist-then-readback-fails Passed
Writes an Artist tag with --set-value, then runs --remove on the same tag and asserts the next --tag readback exits non-zero with "does not contain tag 'Artist'." on stderr, exercising the destructive --remove on an Artist tag created in this run.
exif --set-value rewrites Orientation to 8 and the readback labels it "Left-bottom" Port / libexif / usage-exif-r12-cli-set-value-orientation-numeric-readback Passed
Sets the Orientation tag in IFD 0 to the numeric value 8 (rotate 90 CCW, value range 1..8) via --set-value, then reads the tag back and verifies the formatted "Value: Left-bottom" line appears, asserting the SHORT-tag writer round-trips through libexif's interpreted value formatter.
exif --set-value writes Software into IFD 0 and reads it back verbatim Port / libexif / usage-exif-r12-cli-set-value-software-readback Passed
Sets the Software tag in IFD 0 to a short ASCII string, writes a new JPEG via --output, and verifies the machine-readable readback returns the same string, asserting the libexif ASCII writer for the Software (0x0131) tag.
exif --show-mnote --machine-readable emits at least one tab-delimited record per MakerNote entry Port / libexif / usage-exif-r12-cli-show-mnote-machine-readable-not-empty Passed
Runs --show-mnote in machine-readable mode and verifies the output is non-empty and every line contains at least one tab character, confirming libexif emits the per-entry tab-separated record format the CLI documents for the makernote dump.
exif --tag=0x010f selects the Make tag by hex numeric id and matches the Make-by-name dump Port / libexif / usage-exif-r12-cli-tag-numeric-id-make-hex Passed
Targets the Make tag by its numeric hex id 0x010f via --tag and verifies the output is byte-for-byte identical to --tag=Make, asserting libexif resolves numeric tag selectors equivalently to symbolic names.
exif --xml-output --tag=Make surfaces the Canon manufacturer value Port / libexif / usage-exif-r12-cli-xml-output-contains-make-element Passed
Requests the per-tag emission for the Make tag (selected by symbolic name) and verifies the output mentions both "Make" (or its libexif alias "Manufacturer") and the manufacturer value "Canon". (Noble's exif CLI does not actually wrap the value in XML element tags when --xml-output is combined with --tag; it falls back to the verbose entry dump. Assert presence of the value rather than the XML shape.)
exif --extract-thumbnail writes a non-zero file at the requested --output path Port / libexif / usage-exif-r13-cli-extract-thumbnail-file-nonzero Passed
Runs exif --extract-thumbnail --output=path against the canon fixture and verifies the file was created at exactly that path with non-zero size, asserting libexif's thumbnail-extract path honours the --output destination.
exif --ifd=1 selects the Thumbnail IFD and prints its tag table Port / libexif / usage-exif-r13-cli-ifd-thumbnail-table Passed
Runs exif with --ifd=1 (the Thumbnail IFD per libexif's IFD numbering) and verifies the output mentions Thumbnail in some form (either "EXIF tags in 'Thumbnail'" or just "Thumbnail") and surfaces a Compression entry, asserting the IFD-1 selector reaches the libexif Thumbnail directory.
exif --machine-readable --tag=Model emits exactly "Canon PowerShot S70" Port / libexif / usage-exif-r13-cli-machine-readable-model-canon-powershot Passed
Reads the Model tag in --machine-readable mode and verifies the output is exactly the literal string "Canon PowerShot S70" plus a single newline with line count == 1, asserting libexif emits the bare ASCII value without annotation in machine-readable mode.
exif --no-fixup --tag=Orientation still surfaces the canon fixture's Orientation entry Port / libexif / usage-exif-r13-cli-no-fixup-tag-orientation Passed
Reads the Orientation tag with libexif's tag-normalisation pass disabled (--no-fixup) and verifies the dump still labels the entry as the canonical "Orientation" with Format "Short", asserting the no-fixup code path preserves a tag that needs no fixup.
exif --remove of Orientation drops the tag so a follow-up read exits non-zero Port / libexif / usage-exif-r13-cli-remove-orientation-then-readback-fails Passed
Removes the Orientation tag from a copy of the canon fixture with --remove --tag=Orientation, then attempts a follow-up --tag=Orientation readback and verifies the second invocation exits non-zero with "does not contain tag" on stderr, asserting libexif's destructive remove path on a SHORT-typed tag.
exif --set-value Artist then --remove leaves the tag absent on the next readback Port / libexif / usage-exif-r13-cli-set-value-artist-then-remove-readback-fails Passed
Adds an Artist tag with --set-value, confirms the readback returns the value, then runs --remove on the same tag and verifies the subsequent --tag=Artist invocation exits non-zero with "does not contain tag" on stderr, asserting libexif's set-then-remove sequence on an ASCII (Artist 0x013B) tag.
exif --set-value writes ImageDescription into IFD 0 and reads it back verbatim Port / libexif / usage-exif-r13-cli-set-value-image-description-readback Passed
Sets the ImageDescription tag in IFD 0 to a short ASCII string with --set-value, writes a new JPEG via --output, and verifies the machine-readable readback returns exactly that string, asserting the libexif ASCII writer for the ImageDescription (0x010E) tag round-trips through the CLI.
exif --set-value Orientation=3 round-trips to "Bottom-right" on readback Port / libexif / usage-exif-r13-cli-set-value-orientation-three-readback-right-top Passed
Sets Orientation in IFD 0 to the numeric value 3 (180-degree rotation, value range 1..8) via --set-value, writes a new JPEG via --output, and verifies the formatted "Value: Bottom-right" line appears on readback, asserting libexif maps the SHORT 3 to its canonical 180-degree label.
exif --machine-readable --tag=ColorSpace returns "sRGB" exactly Port / libexif / usage-exif-r13-cli-tag-color-space-srgb-machine Passed
Reads the ColorSpace tag from the canon fixture in --machine-readable mode and verifies the output is exactly the literal string "sRGB" plus a single newline, asserting libexif decodes the standard ColorSpace value 1 to its conventional label without surrounding annotation.
exif --xml-output emits <Model>Canon PowerShot S70</Model> for the canon fixture Port / libexif / usage-exif-r13-cli-xml-output-canon-powershot-model Passed
Runs exif --xml-output against the canon fixture and verifies the resulting stream contains the exact substring "<Model>Canon PowerShot S70</Model>", asserting libexif emits a "Model" XML element (not "Make" / "Manufacturer") with both opening and closing tags around the Canon model string.
exif --extract-thumbnail --output=<nested-path> writes a file beginning with FFD8FF Port / libexif / usage-exif-r14-cli-extract-thumbnail-custom-output-jpeg-magic Passed
Runs exif --extract-thumbnail with a custom --output path inside a freshly-created nested directory, verifies the requested file exists with non-zero size and that its first three bytes are exactly the JPEG magic FFD8FF, asserting libexif's thumbnail extraction honours custom output paths and emits a JPEG envelope.
exif --ifd=EXIF combined with --machine-readable --tag=ExposureTime emits "1 sec." Port / libexif / usage-exif-r14-cli-ifd-exif-machine-readable-exposure-time Passed
Combines --ifd=EXIF (scoping the lookup to the EXIF sub-IFD where ExposureTime lives) with --machine-readable --tag=ExposureTime and verifies the output is exactly "1 sec." with a single trailing newline, asserting libexif honours the IFD scope alongside the machine-readable codepath without altering the formatted value.
exif --machine-readable --tag=DateTime emits exactly "2009:10:10 16:42:32" Port / libexif / usage-exif-r14-cli-machine-readable-datetime-exact Passed
Reads the DateTime tag in --machine-readable mode and verifies the output is exactly the literal string "2009:10:10 16:42:32" plus a single newline with line count == 1, asserting libexif emits the bare DateTime ASCII without surrounding annotation in machine-readable mode.
exif --machine-readable --tag=ExposureTime emits exactly "1 sec." Port / libexif / usage-exif-r14-cli-machine-readable-exposure-time-one-second Passed
Reads the ExposureTime tag in --machine-readable mode and verifies the output is exactly the literal string "1 sec." plus a single newline with line count == 1, asserting libexif emits the formatted RATIONAL value without surrounding annotation in machine-readable mode.
exif --machine-readable --tag=Orientation emits exactly "Right-top" Port / libexif / usage-exif-r14-cli-machine-readable-orientation-right-top-exact Passed
Reads the Orientation tag in --machine-readable mode and verifies the output is exactly the literal string "Right-top" plus a single newline with line count == 1, asserting libexif emits the bare textual SHORT label without surrounding annotation in machine-readable mode.
exif --no-fixup --tag=Make returns "Value: Canon" without applying tag normalisation Port / libexif / usage-exif-r14-cli-no-fixup-tag-make-canon Passed
Reads the Make tag with libexif's tag-normalisation pass disabled (--no-fixup) and verifies the dump's Value line is "Value: Canon" exactly, asserting the no-fixup code path preserves the on-disk Make ASCII unchanged for a tag that needs no fixup.
exif --remove with two -t flags writes a JPEG smaller than (or equal to) the input Port / libexif / usage-exif-r14-cli-remove-make-and-model-both-gone Passed
Invokes exif --remove with two --tag values together (--tag=Make --tag=Model) on a JPEG fixture, asserts the command exits 0, writes a JPEG marker output, and the output file is no larger than the input. (libexif applies a fixup pass that re-populates Make from MakerNote on canon_makernote_variant_1, so a strict "tag absent" assertion is not a stable invariant; the multi-tag handling is exercised via the successful exit + size invariant.)
exif --set-value writes Make in IFD 0 and reads it back verbatim Port / libexif / usage-exif-r14-cli-set-value-make-then-readback Passed
Sets the Make tag in IFD 0 to a short ASCII string with --set-value, writes the new JPEG via --output, and verifies the --machine-readable readback returns exactly that string, asserting the libexif ASCII writer for the Make (0x010F) tag round-trips through the CLI.
exif --xml-output emits <Manufacturer>Canon</Manufacturer> for the canon fixture Port / libexif / usage-exif-r14-cli-xml-output-make-canon Passed
Runs exif --xml-output against the canon fixture and verifies the resulting stream contains the exact substring "<Manufacturer>Canon</Manufacturer>", asserting libexif emits a "Manufacturer" XML element for the Make tag (using the semantic name rather than the on-disk "Make" label) with both opening and closing tags around the literal "Canon".
exif --xml-output emits a valid root-element start tag at offset 0 Port / libexif / usage-exif-r14-cli-xml-output-valid-start-tag Passed
Runs exif --xml-output against the canon fixture and verifies the very first line of output begins with "<" followed by an alphabetic character (a valid XML start tag), asserting libexif emits a textual XML stream rather than a binary blob or stray prefix bytes when --xml-output is requested.
exif --ifd=EXIF --machine-readable --tag=PixelXDimension emits exactly "640" Port / libexif / usage-exif-r15-cli-machine-readable-pixel-x-dimension-exif Passed
Reads the PixelXDimension tag from the EXIF sub-IFD in --machine-readable mode and verifies the output is exactly the literal string "640" plus a single newline with line count == 1, asserting libexif emits the bare SHORT/LONG value of the imaged-region width without surrounding annotation in machine-readable mode.
exif --ifd=EXIF --machine-readable --tag=PixelYDimension emits exactly "480" Port / libexif / usage-exif-r15-cli-machine-readable-pixel-y-dimension-exif Passed
Reads the PixelYDimension tag from the EXIF sub-IFD in --machine-readable mode and verifies the output is exactly the literal string "480" plus a single newline with line count == 1, asserting libexif emits the bare SHORT/LONG value of the imaged-region height without surrounding annotation in machine-readable mode.
exif --ifd=0 --machine-readable --tag=ResolutionUnit emits exactly "Inch" Port / libexif / usage-exif-r15-cli-machine-readable-resolution-unit-ifd-zero Passed
Reads the ResolutionUnit tag scoped to IFD 0 in --machine-readable mode and verifies the output is exactly the literal string "Inch" plus a single newline with line count == 1, asserting libexif maps the standard ResolutionUnit value 2 to its conventional "Inch" label without surrounding annotation when scoped to IFD 0.
exif --ifd=0 --machine-readable --tag=XResolution emits exactly "180" Port / libexif / usage-exif-r15-cli-machine-readable-x-resolution-ifd-zero Passed
Reads the XResolution tag scoped to IFD 0 in --machine-readable mode and verifies the output is exactly the literal string "180" plus a single newline with line count == 1, asserting libexif emits the bare formatted RATIONAL (180/1) without surrounding annotation when scoped to a single IFD.
exif --no-fixup --tag=ColorSpace returns "Value: sRGB" with Format Short Port / libexif / usage-exif-r15-cli-no-fixup-tag-color-space-srgb Passed
Reads the ColorSpace tag (in the EXIF sub-IFD) with libexif's tag-normalisation pass disabled (--no-fixup) and verifies the dump contains "Tag: 0xa001" and a "Value: sRGB" line with Format header "Format: 3 ('Short')", asserting the no-fixup code path preserves the on-disk ColorSpace SHORT unchanged.
exif --no-fixup --tag=Model returns "Value: Canon PowerShot S70" Port / libexif / usage-exif-r15-cli-no-fixup-tag-model-canon-powershot Passed
Reads the Model tag with libexif's tag-normalisation pass disabled (--no-fixup) and verifies the dump's Value line is "Value: Canon PowerShot S70" exactly and the Tag header is "Tag: 0x110", asserting the no-fixup code path preserves the on-disk Model ASCII unchanged for a tag that needs no fixup.
exif --set-value writes Software in IFD 0 and reads it back verbatim Port / libexif / usage-exif-r15-cli-set-value-software-then-readback-machine Passed
Sets the Software tag in IFD 0 to a short ASCII string with --set-value, writes the new JPEG via --output, and verifies the --machine-readable readback returns exactly that string with line count == 1, asserting the libexif ASCII writer for the Software (0x0131) tag round-trips through the CLI without trailing-NUL or annotation noise.
exif --xml-output emits <Color_Space>sRGB</Color_Space> for the canon fixture Port / libexif / usage-exif-r15-cli-xml-output-color-space-srgb-element Passed
Runs exif --xml-output against the canon fixture and verifies the resulting stream contains the exact substring "<Color_Space>sRGB</Color_Space>" (libexif normalises tag names with spaces into underscore-joined element names), asserting an XML element with the textual SHORT label "sRGB" is emitted for the ColorSpace tag.
exif --xml-output emits <Exposure_Time>1 sec.</Exposure_Time> for the canon fixture Port / libexif / usage-exif-r15-cli-xml-output-exposure-time-element Passed
Runs exif --xml-output against the canon fixture and verifies the resulting stream contains the exact substring "<Exposure_Time>1 sec.</Exposure_Time>" (libexif normalises the "Exposure Time" tag name into the underscore-joined element name), asserting an XML element with the formatted RATIONAL "1 sec." is emitted for the ExposureTime tag.
exif --xml-output emits <Orientation>Right-top</Orientation> for the canon fixture Port / libexif / usage-exif-r15-cli-xml-output-orientation-element Passed
Runs exif --xml-output against the canon fixture and verifies the resulting stream contains the exact substring "<Orientation>Right-top</Orientation>", asserting libexif emits an "Orientation" XML element with both opening and closing tags wrapping the textual SHORT label "Right-top".
exif --remove --tag Make then --machine-readable Make returns non-zero Port / libexif / usage-exif-r16-cli-machine-make-strip-readback-exit Passed
Removes the Make tag from a copy of the canon fixture and verifies that --output is a valid JPEG no larger than the input, then asserts a subsequent --machine-readable --tag=Make on the stripped image exits non-zero (the tag value is no longer queryable as a stand-alone machine value), without asserting Make itself has disappeared from full dumps (libexif's MakerNote fixup can restore it).
exif --no-fixup --remove --tag Make exits zero and writes a JPEG Port / libexif / usage-exif-r16-cli-no-fixup-remove-make-exit-zero Passed
Removes the Make tag with libexif's --no-fixup pass disabled (so the MakerNote fixup cannot restore Make from the canon MakerNote table), and asserts the operation exits zero, writes a JPEG-typed output, and produces a file size no larger than the input.
exif default pretty-print on canon fixture mentions Canon manufacturer Port / libexif / usage-exif-r17-cli-default-output-mentions-canon Passed
Runs exif (no flags) on the canon fixture and asserts exit==0 and the pretty-printed output contains the substring "Canon" (the manufacturer string), exercising libexif's default text dump including IFD0 Make.
exif --extract --tag=MakerNote produces a non-empty makernote output Port / libexif / usage-exif-r17-cli-extract-mnote-bytes-positive Passed
Extracts the MakerNote tag bytes from the canon fixture via exif --extract --tag=MakerNote --output and asserts the resulting file exists with strictly positive byte count, exercising libexif's MakerNote dumping path for canon fixtures.
exif --remove --tag=Make writes a JPEG-magic output (no assertion on Make presence) Port / libexif / usage-exif-r17-cli-remove-make-output-jpeg-magic Passed
Removes the Make tag from a copy of the canon fixture and asserts the output exists, starts with the JPEG SOI magic FF D8 FF, and the operation exits zero. Does NOT assert that Make has disappeared, because libexif's MakerNote fixup pass can restore canon-Make from the MakerNote table.
exif -t 0xa002 (PixelXDimension) machine readback equals 640 Port / libexif / usage-exif-r17-cli-tag-by-hex-pixel-x-dim-readback Passed
Reads the PixelXDimension EXIF-IFD tag by its hex tag id 0xa002 via exif -t 0xa002 --machine-readable and asserts the captured single-line value equals "640" exactly, exercising libexif's tag-id lookup path through the short -t alias.
exif --tag=DateTime machine readback shape YYYY:MM:DD HH:MM:SS Port / libexif / usage-exif-r17-cli-tag-datetime-readback-shape Passed
Reads the DateTime tag from the canon fixture via exif --machine-readable --tag=DateTime and asserts the single-line output matches the EXIF date-time shape YYYY:MM:DD HH:MM:SS (extended ASCII regex), exercising libexif's ASCII tag readback for IFD0 DateTime.
exif --tag=Orientation pretty readback mentions Right-top label Port / libexif / usage-exif-r17-cli-tag-orientation-readback-right-top Passed
Reads the Orientation tag from the canon fixture via exif --tag=Orientation (pretty output, no --machine-readable) and asserts the output contains the substring "Right-top", exercising libexif's SHORT-to-label pretty conversion on the canon fixture's orientation value.
exif --tag=UserComment readback on canon fixture exits zero Port / libexif / usage-exif-r17-cli-tag-user-comment-readback Passed
Reads the UserComment tag from the canon fixture via exif --tag=UserComment in machine-readable mode and asserts the command exits zero, exercising libexif's UNDEFINED-type tag readback path for ifd-exif tags.
exif --xml-output includes a Manufacturer element substring Port / libexif / usage-exif-r17-cli-xml-output-manufacturer-element Passed
Runs exif --xml-output on the canon fixture and asserts the emitted XML contains the literal substring "<Manufacturer>" (the noble libexif XML serialiser names the Make tag element as Manufacturer), exercising the XML metadata emitter.
exif --extract-thumbnail thumbnail ends with the JPEG EOI marker FFD9 Port / libexif / usage-exif-r18-cli-extract-thumbnail-explicit-output-trailing-eoi Passed
Extracts the embedded thumbnail from the canon fixture via exif --extract-thumbnail --output=... and asserts the resulting file's final two bytes are the JPEG end-of-image marker FF D9, exercising libexif's thumbnail-blob writeout completeness (distinct from the earlier "starts with FFD8" magic check).
exif --ids -t ColorSpace emits 0xa001 in the verbose detail block Port / libexif / usage-exif-r18-cli-ids-color-space-tag-hex Passed
Runs exif --ids -t ColorSpace on a canon makernote fixture and asserts the captured output contains the literal hex tag id "0xa001" (the EXIF spec id for ColorSpace), exercising the --ids verbose tag-id rendering path on a known tag.
exif --ifd=EXIF pretty output mentions the ColorSpace tag header Port / libexif / usage-exif-r18-cli-ifd-exif-mentions-color-space Passed
Runs exif --ifd=EXIF on the canon fixture and asserts the pretty-table output contains the literal "Color Space" tag header (the EXIF IFD always carries this row on the canon fixture), exercising libexif's EXIF-IFD tag enumeration in pretty mode.
exif --list-tags lists both Manufacturer and Model rows Port / libexif / usage-exif-r18-cli-list-tags-make-and-model-present Passed
Runs exif --list-tags on the canon fixture and asserts the catalog output contains rows for both the Manufacturer (Make) and Model tags, exercising libexif's tag enumeration without requiring a specific id format (distinct from --ids hex tests).
exif on a missing file exits non-zero Port / libexif / usage-exif-r18-cli-missing-file-nonzero-exit Passed
Invokes the exif CLI against a path that definitely does not exist inside the temporary directory and asserts the exit code is non-zero, exercising the error-path return from the exif client when libexif cannot open the input file (no specific stderr keyword asserted, only the failure indicator).
exif -i --tag=Orientation includes the 0x0112 hex id row Port / libexif / usage-exif-r18-cli-short-flag-ids-orientation-hex Passed
Runs exif -i --tag=Orientation (short alias for --ids) on the canon fixture and asserts the pretty output contains the literal hex tag id "0x112" (the spec id for Orientation in IFD0) alongside the Right-top decoded label, exercising libexif's --ids rendering through the short -i flag (distinct from existing long-flag --ids coverage).
exif --show-mnote on canon fixture renders a PowerShot Image Type row Port / libexif / usage-exif-r18-cli-show-mnote-mentions-canon-keyword Passed
Runs exif --show-mnote on the canon makernote fixture and asserts the maker-note dump output contains the literal substring "PowerShot" (Canon emits its camera model in the Image Type makernote field), exercising libexif's canon makernote rendering path.
exif --tag=Make pretty output emits a Value line starting with Canon Port / libexif / usage-exif-r18-cli-tag-make-value-canon-prefix Passed
Runs exif --tag=Make against the canon fixture and asserts the pretty-printed output contains a "Value:" line whose trimmed payload starts with the literal manufacturer string "Canon", exercising libexif's ASCII tag value rendering for IFD0 Make in human-readable mode.
exif --machine-readable --tag=Model emits a non-empty trimmed value line Port / libexif / usage-exif-r18-cli-tag-model-readback-non-empty Passed
Reads the Model tag from the canon fixture via exif --machine-readable --tag=Model and asserts the single-line value, after trimming, is non-empty and matches a printable-ASCII shape (no NULs, no leading/trailing whitespace fail), exercising libexif's ASCII readback for IFD0 Model through the machine-readable path.
exif --xml-output contains the literal Canon manufacturer text Port / libexif / usage-exif-r18-cli-xml-output-canon-text Passed
Runs exif --xml-output on the canon fixture and asserts the emitted XML contains the literal payload string ">Canon<" (the Manufacturer element's text content boundary), exercising libexif's XML element-text serialiser for IFD0 Make.
exif --debug --no-fixup trace contains the ExifLoader: Scanning header Port / libexif / usage-exif-r19-cli-debug-no-fixup-trace-contains-loader Passed
Runs exif --debug --no-fixup against the canon fixture, merging stdout and stderr, and asserts the captured trace contains the literal "ExifLoader: Scanning" header (libexif emits the loader announce line even when fixups are disabled), exercising the libexif debug-trace path with --no-fixup active.
exif --remove-thumbnail rewrites the canon JPEG to a smaller file Port / libexif / usage-exif-r19-cli-extract-thumbnail-write-then-strip Passed
Runs exif --remove-thumbnail --output on the canon fixture and asserts the rewritten JPEG starts with the SOI marker FFD8, exists on disk with positive size, and is strictly smaller than the original (libexif removes the embedded thumbnail bytes from the EXIF block), exercising the libexif thumbnail-strip writeout path.
exif --ids -t Model verbose output emits a 0x0110 hex tag id line Port / libexif / usage-exif-r19-cli-ids-machine-readable-positive-id Passed
Runs exif --ids -t Model on the canon fixture and asserts the captured stdout contains the literal hex string "0x110" or "0x0110" (EXIF spec id for Model), exercising libexif's --ids verbose tag identifier rendering for IFD0 Model.
exif --ifd=0 pretty output mentions the X-Resolution tag header Port / libexif / usage-exif-r19-cli-ifd-zero-mentions-xresolution Passed
Runs exif --ifd=0 on the canon fixture and asserts the captured pretty-table output contains the literal "X-Resolution" tag header (IFD0 always carries XResolution on the canon fixture), exercising libexif's IFD0 enumeration in pretty mode.
exif -l on canon fixture emits at least twenty non-blank table rows Port / libexif / usage-exif-r19-cli-list-tags-emits-many-rows Passed
Runs exif -l on the canon fixture and asserts the captured stdout has at least 20 non-blank lines (libexif's tag list view always enumerates several tens of rows on a real EXIF-bearing JPEG), exercising the libexif full-tag enumeration path.
exif -m -t YResolution emits a digit-bearing machine-readable line Port / libexif / usage-exif-r19-cli-machine-yresolution-numeric Passed
Runs exif -m -t YResolution on the canon fixture and asserts the captured stdout contains at least one decimal digit (libexif renders the YResolution rational with its integer numerator in machine output on the canon fixture), exercising the machine-readable single-tag rendering for IFD0 YResolution.
exif --tag=FNumber pretty output Value line is a non-empty f-stop string Port / libexif / usage-exif-r19-cli-tag-fnumber-readback-non-empty Passed
Runs exif --tag=FNumber on the canon fixture and asserts the captured pretty output contains a "Value:" line whose trimmed payload is non-empty and contains a digit (libexif renders the FNumber rational as a decimal-bearing string), exercising the EXIF-IFD FNumber rational tag rendering path.
exif --tag=Orientation pretty output includes a Tag and a Value line Port / libexif / usage-exif-r19-cli-tag-orientation-row-present Passed
Runs exif --tag=Orientation on the canon fixture and asserts the pretty-printed output contains both a "Tag:" header line and a "Value:" line with non-empty payload, exercising libexif's single-tag pretty rendering for IFD0 Orientation through the exif CLI.
exif --version banner reports a dotted numeric version string Port / libexif / usage-exif-r19-cli-version-banner-mentions-exif Passed
Runs exif --version and asserts the first non-empty stdout line matches a dotted numeric version pattern (libexif's exif CLI prints e.g. "0.6.22" as its sole banner line on noble), exercising the libexif/exif CLI version reporting path.
exif -x output opens with an exif root element tag Port / libexif / usage-exif-r19-cli-xml-output-root-element Passed
Runs exif -x on the canon fixture and asserts the first non-empty line of stdout contains an opening "<exif" element tag (libexif's XML output starts with a single root element), exercising the libexif XML serialiser through the exif CLI.
exif --help help text mentions the --output flag Port / libexif / usage-exif-r20-cli-help-mentions-output-flag Passed
Runs exif --help, merges stdout and stderr, and asserts the captured help text mentions the "--output" flag - locking in libexif's help banner advertising the --output option.
exif --ids on canon fixture mentions the Orientation tag hex id 0x0112 Port / libexif / usage-exif-r20-cli-ids-table-mentions-orientation Passed
Runs exif --ids on the canon fixture and asserts the captured numeric-id table contains the literal hex id "0x0112" (the canonical EXIF Orientation tag id) - locking in libexif's --ids enumeration emitting the Orientation row's hex id.
exif --ifd=0 pretty output mentions the Y-Resolution tag header Port / libexif / usage-exif-r20-cli-ifd-zero-mentions-yresolution Passed
Runs exif --ifd=0 on the canon fixture and asserts the captured pretty-table output contains the literal "Y-Resolution" tag header (IFD0 always carries YResolution on the canon fixture), exercising libexif's IFD0 enumeration via the pretty-mode renderer with a tag distinct from prior round coverage.
exif -l on canon fixture emits a Manufacturer row Port / libexif / usage-exif-r20-cli-list-tags-make-row Passed
Runs exif -l on the canon fixture and asserts the captured tag table contains the literal "Manufacturer" row label (libexif's --list-tags localises Make as Manufacturer in IFD0 row labels) - locking in the IFD0 Manufacturer row in --list-tags output.
exif -m -t XResolution on canon fixture emits a numeric token Port / libexif / usage-exif-r20-cli-machine-xresolution-numeric Passed
Runs exif --machine-readable --tag=XResolution on the canon fixture and asserts the captured output's first non-blank token starts with a digit and contains a numeric resolution value (libexif renders the rational as a decimal like "180" or "180.00"), exercising libexif's machine-readable tag rendering for IFD0 XResolution.
exif --remove --tag=Orientation produces a JPEG starting with the SOI marker Port / libexif / usage-exif-r20-cli-remove-orientation-output-jpeg-magic Passed
Copies the canon fixture, runs exif --remove --tag=Orientation --output to rewrite the JPEG without the Orientation tag, then asserts the rewritten file starts with the JPEG SOI marker bytes FFD8 - locking in libexif's tag-removal write path preserving JPEG container framing.
exif --set-value Orientation=3 then pretty readback labels it Bottom-right Port / libexif / usage-exif-r20-cli-set-value-orientation-roundtrip-numeric Passed
Copies the canon fixture, runs exif --tag=Orientation --ifd=0 --set-value=3 --output to rewrite the file, then reads back via exif --tag=Orientation --ifd=0 and asserts the captured pretty output contains "Bottom-right" - locking in libexif's set-value writer plus its interpreted label rendering for orientation=3.
exif --show-description ExposureTime in IFD EXIF resolves the canonical description Port / libexif / usage-exif-r20-cli-show-description-exposure-time-exif Passed
Runs exif --show-description --ifd=EXIF --tag=ExposureTime on the canon fixture and asserts the captured output mentions both the tag name "Exposure Time" and the hex id 0x829a (the canonical EXIF ExposureTime tag) - locking in libexif's --show-description resolution for the ExposureTime tag in IFD EXIF.
exif --tag=Model on canon fixture emits a non-empty Value line Port / libexif / usage-exif-r20-cli-tag-model-readback-non-empty Passed
Runs exif --tag=Model --ifd=0 on the canon fixture, captures the pretty output, and asserts it includes a Value: line whose value text is non-empty - locking in libexif's IFD0 Model tag readback path with a value present.
exif --xml-output emits a Y-Resolution element for the canon fixture Port / libexif / usage-exif-r20-cli-xml-output-yresolution-element Passed
Runs exif --xml-output on the canon fixture and asserts the captured XML contains both an opening "<Y-Resolution>" tag and a closing "</Y-Resolution>" tag - locking in libexif's XML renderer including the Y-Resolution element with both delimiters.
exif --debug --machine-readable --tag=ApertureValue emits parser trace and value line Port / libexif / usage-exif-r21-cli-debug-machine-tag-aperture-trace Passed
Runs exif --debug --machine-readable --tag=ApertureValue --ifd=EXIF on the Canon fixture with merged stdout+stderr, asserts the captured output contains the libexif debug markers "ExifLoader:" and "ExifData:" indicating parser tracing, and also contains a final machine-readable APEX value matching the "f/" aperture marker - locking in the simultaneous emission of debug trace and machine-readable result.
exif --ids --show-mnote prints rows beginning with 0x and a hex tag id Port / libexif / usage-exif-r21-cli-ids-show-mnote-hex-pattern Passed
Runs exif --ids --show-mnote on the Canon fixture, skips the header line, and asserts every remaining non-empty line starts with the "0x" prefix followed by exactly four lowercase hex digits and a "|" delimiter - locking in libexif's --ids rendering for MakerNote tag identifiers as 16-bit hex.
exif --ifd=Interoperability lists RelatedImageWidth 640 on the canon fixture Port / libexif / usage-exif-r21-cli-ifd-interoperability-related-image-width-value Passed
Runs exif --ifd=Interoperability on the Canon fixture, asserts the captured listing contains "RelatedImageWidth" alongside the value 640 - locking in libexif's handling of the Interoperability IFD as a distinct IFD with content reachable via --ifd=Interoperability.
exif --ifd=1 --tag=Compression formats the canon thumbnail compression as JPEG Port / libexif / usage-exif-r21-cli-ifd-one-compression-value-jpeg Passed
Runs exif --ifd=1 --tag=Compression on the Canon fixture and asserts the captured output contains "Format: 3" with "JPEG compression" - locking in libexif's IFD1 (thumbnail) compression formatting for SHORT format with value 6 rendered as the JPEG compression label.
exif -m on IFD0 emits nine rows each with a tab-separated key value pair Port / libexif / usage-exif-r21-cli-machine-readable-canon-tab-token-count Passed
Runs exif --machine-readable --ifd=0 on the Canon fixture and asserts the captured output contains exactly nine non-empty rows where every row matches "<label><TAB><value>" - locking in the structural shape of libexif's machine-readable IFD0 listing where each entry is one row of two tab-separated fields.
exif --no-fixup --tag=DateTime --ifd=EXIF reports missing-tag with nonzero exit Port / libexif / usage-exif-r21-cli-no-fixup-missing-tag-error Passed
Runs exif --no-fixup --machine-readable --tag=DateTime --ifd=EXIF on the Canon fixture - DateTime lives in IFD0 and without fixup it is not present in the EXIF IFD - and asserts the command exits nonzero with stderr or stdout containing "does not contain tag" and "DateTime", locking in libexif's negative-path output when --no-fixup is requested.
exif --show-description --tag=ISOSpeedRatings prints the ISO 12232 description Port / libexif / usage-exif-r21-cli-show-description-iso-speed-ratings Passed
Runs exif --show-description --tag=ISOSpeedRatings --ifd=EXIF on the Canon fixture and asserts the captured description mentions both the "ISO Speed" tag label and the "12232" standard reference - locking in libexif's bundled human-readable description text for the ISO Speed Ratings tag.
exif --show-description --tag=ResolutionUnit mentions XResolution YResolution and inches Port / libexif / usage-exif-r21-cli-show-description-resolution-unit Passed
Runs exif --show-description --tag=ResolutionUnit --ifd=0 on the Canon fixture and asserts the captured description mentions both "XResolution" and "YResolution" along with "inches", locking in libexif's bundled description text for the ResolutionUnit tag (distinct from previous r20 description coverage of ExposureTime).
exif --tag=ShutterSpeedValue renders the APEX 1-second equivalent Port / libexif / usage-exif-r21-cli-tag-shutter-speed-apex-value Passed
Runs exif --tag=ShutterSpeedValue --ifd=EXIF on the Canon fixture and asserts the captured detailed output contains the APEX label "0.00 EV" along with "(1 sec.)" - locking in libexif's APEX shutter-speed formatting that pairs an EV value with the equivalent fractional/whole-second exposure on this fixture.
exif --xml-output reports MakerNote as 904 bytes of undefined data Port / libexif / usage-exif-r21-cli-xml-maker-note-byte-count Passed
Runs exif --xml-output on the Canon fixture and asserts the captured XML contains the literal "<Maker_Note>904 bytes undefined data</Maker_Note>" element - locking in libexif's XML rendering of MakerNote as an opaque byte blob along with the precise byte count for this fixture, distinct from prior MakerNote source-only and machine-readable coverage.
exif --ids displays FNumber tag id Port / libexif / usage-exif-r9-cli-ids-fnumber-hex Passed
Calls exif --ids on the fixture and verifies a four-digit hex tag identifier appears alongside FNumber in the rendered table.
exif --list-tags includes IFD 1 thumbnail tags Port / libexif / usage-exif-r9-cli-list-tags-ifd-one Passed
Lists EXIF tag definitions on the fixture and verifies entries that belong to IFD 1 (thumbnail) such as Compression are present.
exif --list-tags includes Make tag Port / libexif / usage-exif-r9-cli-list-tags-make-tag Passed
Lists EXIF tag definitions in the fixture image with --list-tags and confirms the canonical Make tag entry is present in the output.
exif --machine-readable for ExposureMode Port / libexif / usage-exif-r9-cli-machine-exposure-program Passed
Reads ExposureMode in machine-readable mode and verifies the output is non-empty and lacks the human "Value:" prefix.
exif --no-fixup with Orientation tag Port / libexif / usage-exif-r9-cli-no-fixup-tag-orientation Passed
Runs exif --no-fixup --tag=Orientation on the fixture and confirms the tag value is still rendered without any fixup intervention.
exif --remove with --output writes a JPEG copy Port / libexif / usage-exif-r9-cli-output-copy-bytes-equal Passed
Calls exif --remove --tag=Make --output to produce a modified copy and verifies the new file is a non-empty JPEG that exif can still parse.
exif --show-mnote prints Canon makernote Port / libexif / usage-exif-r9-cli-show-mnote-canon Passed
Runs exif --show-mnote on a Canon makernote fixture and verifies non-empty maker note output is produced.
exif --tag=ExposureMode reads tag Port / libexif / usage-exif-r9-cli-tag-exposure-program Passed
Reads the ExposureMode EXIF tag from the Canon makernote fixture and verifies a Value field is rendered to stdout.
exif --version emits a numeric version Port / libexif / usage-exif-r9-cli-version-banner Passed
exif --xml-output renders an XML EXIF dump Port / libexif / usage-exif-r9-cli-xml-tag-fnumber-value Passed
Runs exif --xml-output against the fixture and verifies the output is wrapped in <exif>...</exif> root tags carrying recognizable EXIF entries.
CVE-2007-6351 libexif regression Port / libexif / cve-2007-6351 Passed
Asserts that exif_data_new_from_data parses a self-referential IFD pointer chain in bounded time instead of recursing without limit.
CVE-2018-20030 libexif regression Port / libexif / cve-2018-20030 Passed
Asserts that exif_data_new_from_data processes a forest of cross-linked Interoperability and EXIF IFD pointers in bounded time instead of degrading into a CPU-exhaustion traversal.
CVE-2020-0181 libexif regression Port / libexif / cve-2020-0181 Passed
Asserts that exif_data_load_data_thumbnail handles a thumbnail whose declared offset/length combination overflows 32-bit arithmetic without crashing or accessing memory out of range.
CVE-2020-0198 libexif regression Port / libexif / cve-2020-0198 Passed
Asserts that exif_data_load_data_content rejects an IFD entry whose declared size overflows 32-bit arithmetic without aborting via UBSAN-style abort.
CVE-2020-12767 libexif regression Port / libexif / cve-2020-12767 Passed
Asserts that exif_entry_get_value handles a rational EXIF tag whose denominator is zero without raising a divide-by-zero exception during value formatting.