Skip to content

Conversation

@philhassey
Copy link

No description provided.

This implements a new schema parsing and serialization package using
patterns similar to the public "ast" package for policies.

Features:
- Programmatic schema construction using a fluent builder API
- Cedar human-readable schema format parsing (UnmarshalCedar)
- Cedar human-readable schema format serialization (MarshalCedar)
- Support for all Cedar schema constructs:
  - Namespaces with nested declarations
  - Entity types with shapes, tags, and memberOf
  - Enum entity types
  - Actions with appliesTo (principal, resource, context)
  - Common type aliases
  - All primitive, extension, set, and record types
  - Annotations

Package structure:
- x/exp/schema2: Top-level package with UnmarshalCedar
- x/exp/schema2/ast: Schema AST types and builder functions
- x/exp/schema2/internal/parser: Parser implementation

Test coverage: 85-100% across packages.
- Add _ = 0 to marker methods in ast package for coverage
- Create internal_test.go files to test unexported methods
- Add comprehensive table-driven tests in schema_test.go
- Add extensive parser error case tests
- Add scanner edge case tests for UTF-8, NUL, and buffer handling
- Achieve 99-100% coverage across all schema2 packages

Coverage results:
- schema2: 100%
- ast: 98.3%
- internal/parser: 99.0%
- Add reader error tests (non-EOF errors)
- Add UTF-8 buffer boundary tests
- Add split reader for precise buffer control
- Fix goimports formatting

Coverage now at 99.4% for internal/parser.
Remaining uncovered: dead code error handlers in parseEntityRef
and rare buffer accumulation path in tokenText.
- Add consumeString helper for when token type is already verified
- Update parseEntityRef to use consumeString, removing dead code
- Add test for tokenText when tokPos is negative
- Add test for tokBuf accumulation during buffer refills

All internal/parser functions now have 100% statement coverage.
Add tests for:
- Schema with multiple top-level nodes (covers i > 0 branch)
- ResolvedSchema with multiple top-level nodes
- Action with empty name (needsQuoting empty string)
- Action name starting with digit (needsQuoting !isIdentStart)
- Record key starting with digit
- Record key with empty name
Features:
- Support comma-separated entity declarations (e.g., entity User, Admin;)
- Support comma-separated action declarations (e.g., action read, write;)
- Shared modifiers (in, shape, tags, appliesTo) apply to all names

Tests:
- Add comprehensive reference tests from Rust cedar-policy implementation
- Add TestAccessControlSchema with anonymized IAM-style schema
- Add TestReferenceSchemas covering sandbox_a/b, github, tinytodo, etc.
- Add TestReferenceVerification for edge cases
- Add TestCommaSeparatedDeclarations for new parser features
- Remove dead code for empty appliesTo (Cedar requires principal+resource)

All three schema2 packages maintain 100% test coverage.
Bug fixes:
- Reject trailing commas in entity type ref lists (e.g., [Group,])
- Reject trailing commas in entity ref lists (e.g., ["action",])
- Reject 'in' as entity/type/action name (reserved identifier)

Bug bash tests:
- Add comprehensive edge case testing for parser robustness
- Test unicode, escape sequences, deeply nested structures
- Test reserved words, trailing commas, malformed inputs
- Round-trip testing for marshal stability
- Fuzz-like testing to ensure graceful error handling

All schema2 packages maintain 100% test coverage.
- Replace large inline test table with corpus files in testdata/corpus/
- valid/*.cedarschema: schemas that must parse and round-trip
- invalid/*.cedarschema: schemas that must fail to parse
- Keep minimal code tests for round-trip stability and panic safety
- Fix linter issues (errcheck, goimports)

Corpus includes reference schemas from Rust implementation.
- Add MarshalJSON and UnmarshalJSON methods to ast.Schema
- Add UnmarshalJSON function to schema2 package
- Resolve entity type references correctly when marshalling to JSON
- Create JSON corpus files for all valid Cedar schemas
- Add comprehensive round-trip tests for JSON format
- Validate all JSON output against Rust reference implementation
- Create internal/json package with Marshal and Unmarshal functions
- Remove ast/json.go to avoid import cycle
- Add MarshalJSON function to schema2 package
- Update tests to use schema2.MarshalJSON instead of json.Marshal
- Add comprehensive tests for internal/json package
Add comprehensive tests covering:
- TypeRef to entity resolution in common types and record attributes
- Error propagation for invalid nested Set/Record types
- Empty TypeName error handling
- Named namespace error propagation
- Nil type handling in default switch cases
- Various attribute type marshalling/unmarshalling
- Change "Set type missing element" to "set type missing element" per
  staticcheck ST1005 (error strings should not be capitalized)
- Format json_test.go with goimports
Add extensive tests to verify our JSON implementation against the
Cedar Rust reference implementation:

- TestJSONSchemaFormatCompliance: Verify JSON output structure matches
  Cedar JSON schema spec (entity types, actions, common types, etc.)
- TestJSONReferenceSchemasParsing: Test parsing various JSON schemas
  that match Rust implementation output
- TestJSONEdgeCases: Test complex scenarios (deeply nested records,
  action hierarchies, extension types, enums, tags, etc.)
- TestJSONCorpusExactMatch: Byte-for-byte comparison of our JSON
  output with expected corpus JSON files

All tests verify against the cedar CLI reference implementation.
- Handle EntityOrCommon type format from Rust CLI v4.8+
- Support __cedar::String, __cedar::Long, __cedar::Bool as primitives
- Ensure Record types always output 'attributes' field (even if empty)
- Only emit appliesTo when it has meaningful content
- Use "Action" as default type for action memberOf references
- Add custom MarshalJSON for Type and Attr to ensure format compliance
- Add edge case corpus files for extensions, nested types, hierarchies
- Add JSON corpus files for reference schemas
- Consolidate tests into corpus-based approach
- Add tests for EntityOrCommon format parsing (Rust CLI v4.8+)
- Add tests for resolveEntityOrCommon with all branch coverage
- Add tests for Record MarshalJSON with nil attributes
- Add tests for action memberOf with empty type defaulting to Action
- Add tests for empty appliesTo not being emitted
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants