# Test Case: Compact and Extended Timestamp Validation

**Test ID**: TC156-inode-timestamp-validation
**Category**: Inode Corruption
**Priority**: Critical
**Regression**: Timestamp arithmetic and conversion accepted malformed values

## Objective

Verify checked compact-inode epoch addition, nanoseconds below one billion for
both inode layouts, and rejection of unsigned seconds that cannot be represented
by FreeBSD 15 amd64 `time_t`.

## Fixtures

Generate the review fixtures with `tests/review_fixtures.py`. Its structured
field assertions produce:

| Image | Malformed field | Trigger |
|---|---|---|
| `compact-epoch-wrap.erofs` | `epoch=UINT64_MAX`, root `i_mtime=1` | `uint64_t` addition overflow |
| `compact-epoch-range.erofs` | `epoch=INT64_MAX`, target `i_mtime=1` | result exceeds signed 64-bit `time_t` |
| `compact-nsec-invalid.erofs` | `fixed_nsec=1000000000` | invalid compact nanoseconds |
| `extended-nsec-invalid.erofs` | target `i_mtime_nsec=1000000000` | invalid extended nanoseconds |
| `extended-seconds-range.erofs` | target `i_mtime=INT64_MAX+1` | seconds exceed `time_t` |

Every image must pass the helper's EROFS field-location and CRC32C checks before
guest transfer.

## Procedure

1. For `compact-epoch-wrap.erofs`, attach the image and trace the mount. The
   mount must fail with `ERR#97` when the root inode is decoded.
2. For `compact-nsec-invalid.erofs`, trace the mount. Superblock timestamp
   validation must fail with `ERR#97` before a vnode is returned.
3. Mount `compact-epoch-range.erofs`. The root timestamp at `INT64_MAX` remains
   representable, but `stat /zz-identity.txt` must fail with `ERR#97`.
4. Mount each extended fixture. The root remains usable, while
   `stat /extended-time.txt` must fail with `ERR#97` for the targeted field.
5. Repeat every failing access, compare dmesg, and clean the mount and md unit
   after each image.

## Expected Results

- Compact epoch addition overflow returns `EINTEGRITY`, not a wrapped time.
- Exactly `999999999` remains the maximum accepted nanosecond value;
  `1000000000` is rejected for compact and extended timestamps.
- `INT64_MAX` seconds is accepted on the qualified amd64 ABI, while
  `INT64_MAX+1` is rejected before assignment to `timespec.tv_sec`.
- No malformed inode creates a vnode with normalized, negative, or wrapped
  timestamps, and no panic or assertion occurs.
