Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
1923728
feat(provider-tck): add Java conformance suite for OpenFeature providers
aepfli Jul 27, 2026
c257f21
feat(provider-tck): cover both flagd resolver modes, expand type mism…
aepfli Jul 27, 2026
efa609a
feat(provider-tck): gate lifecycle scenarios on @lifecycle, not @events
aepfli Aug 24, 2026
6f8873c
feat(provider-tck): move the adopter-facing API to this PR
aepfli Sep 11, 2026
a96ae5d
refactor(provider-tck): extract BackendControl and split the base class
aepfli Aug 24, 2026
8b02b84
feat(provider-tck): in-process backend control and an in-memory self-…
aepfli Aug 24, 2026
35db474
test(provider-tck): also run the self-test against MultiProvider
aepfli Aug 24, 2026
cb8b4be
feat(provider-tck): source the spec artifacts from the open-feature/s…
aepfli Aug 24, 2026
5cb4fbb
style(provider-tck): reformat the in-memory self-test to what spotles…
aepfli Sep 11, 2026
1f5f786
feat(provider-tck): let adopters add scenarios by convention
aepfli Sep 11, 2026
ea39f67
feat(provider-tck): own the declaration vocabulary here, so reporting…
aepfli Sep 11, 2026
9588e35
refactor(provider-tck): move the flagd adoption to its own change
aepfli Sep 11, 2026
ade878e
docs(provider-tck): drop the links to the flagd adoption, which is a …
aepfli Sep 11, 2026
b1602c6
feat(provider-tck): implement the shutdown, metadata and error-messag…
aepfli Sep 11, 2026
ca2f27c
feat(provider-tck): model @large-integers as not applicable and seed …
aepfli Sep 11, 2026
e41ea6e
fix(provider-tck): drop the suppression TckState no longer needs
aepfli Sep 11, 2026
756334e
style(provider-tck): reformat the not-applicable paths to what spotle…
aepfli Sep 11, 2026
0afde03
fix(provider-tck): name the falsy flags what the SDK suite already na…
aepfli Sep 11, 2026
f2832f7
feat(provider-tck): gate reinitialisation, which 2.5.2 permits rather…
aepfli Sep 11, 2026
bc8d13e
fix(provider-tck): report the feature paths Appendix F names
aepfli Sep 11, 2026
c2b6388
fix(provider-tck): seed the in-process control from the packaged flag…
aepfli Sep 11, 2026
4d836a3
fix(provider-tck): one skip with a reason, not a second kind of decla…
aepfli Sep 11, 2026
9759cf2
ci: run the provider-tck stacked pull requests
aepfli Sep 11, 2026
b685eac
feat(provider-tck): gate the variant, and make @targeting a real capa…
aepfli Sep 11, 2026
a205248
feat(provider-tck): gate a disabled flag on @disabled-flags
aepfli Sep 12, 2026
2a0bb81
refactor(tck): rename provider-tck to tck, and start at 0.1.0
aepfli Sep 12, 2026
cbba562
refactor(tck): drop the post-command settle, and keep the readiness p…
aepfli Sep 12, 2026
c500ef6
docs(tck): state both shapes a known deviation takes, and which to pr…
aepfli Sep 12, 2026
a462064
refactor(tck): name the compose concepts what the other three languag…
aepfli Sep 12, 2026
9156451
test(tck): cover the lifecycle feature without Docker
aepfli Sep 12, 2026
7fa92ee
refactor(tck)!: a control states which API drove it, and /restart is …
aepfli Sep 12, 2026
4b94112
refactor(tck)!: name the backend's configuration after the backend
aepfli Sep 12, 2026
c8ba1c7
build(tck): keep testcontainers off every adopter's classpath
aepfli Sep 12, 2026
8075b97
docs(tck): follow the renames, and write down the CI exclusion
aepfli Sep 12, 2026
7329afd
test(tck): assert the control API request sequence without Docker
aepfli Sep 12, 2026
20de327
docs(tck): point at Appendix F for why a suite is excluded from CI
aepfli Sep 12, 2026
a52be04
feat(tck): fail the run when a scenario carries a reserved tag
aepfli Sep 12, 2026
39ae680
feat(tck): gate the resolution reason behind @standard-reasons
aepfli Sep 13, 2026
a5b0ce8
test(tck): fail the build when a declarable capability gates nothing
aepfli Sep 13, 2026
0e28f59
chore(tck): re-pin the canonical assets to 89b1519a
aepfli Sep 13, 2026
7098d51
build(tck): fail the build when the packaged assets are not the pinne…
aepfli Sep 13, 2026
d9ca3dd
feat(tck): refuse @large-integers, which no Java provider can be asked
aepfli Sep 13, 2026
5b99b69
docs(tck): stop naming a report-branch class from the base
aepfli Sep 13, 2026
85e1727
feat(tck): refuse a deviation against a capability nothing asked
aepfli Sep 13, 2026
c1397bf
docs(tck): one tag withheld twice, and the rule that decides which ab…
aepfli Sep 13, 2026
5509e26
chore(tck): re-pin the canonical assets to aa2ad24f
aepfli Sep 13, 2026
b34f130
docs(tck): the documented command is a step, and the step is called tck
aepfli Sep 13, 2026
dafa391
docs(tck): select the conformance suite by directory, not by filename
aepfli Sep 13, 2026
6aace03
docs(tck): rewrite the README as an adoption guide
aepfli Sep 14, 2026
bc9dd65
docs(tck): let Appendix F own the vocabulary and the declaring rules
aepfli Sep 14, 2026
1c7e189
docs(tck): @disabled-flags is gated on what the response says, not on…
aepfli Sep 14, 2026
29582ea
feat(tck): add @string-typing, and re-pin the canonical assets to d47…
aepfli Sep 15, 2026
337a531
feat(tck): re-pin to bda599f1, and fail a capability tag the vocabula…
aepfli Sep 16, 2026
863b41e
style(tck): wrap the capability-gate call the way spotless wants
aepfli Sep 16, 2026
92fefde
chore(tck): follow the spec pin to the rebased appendix
aepfli Sep 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/component_owners.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ components:
- toddbaert
tools/flagd-http-connector:
- liran2000
tools/tck:
- aepfli

ignored-authors:
- renovate-bot
49 changes: 49 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,57 @@ on:
- reopened
branches:
- main
# Temporary, for the duration of the provider conformance suite's review.
# Without it a stacked pull request gets no CI at all: this filter matches
# the pull request's BASE branch, so only the suite PR itself -- the one
# targeting main -- was ever checked, and the report and adoption PRs
# stacked on it were merged-in-theory and tested never. Remove once the
# chain has landed. See open-feature/spec#417.
- 'feat/provider-tck*'

jobs:
# Fast canary for the Provider TCK: runs the full applicable conformance suite three times --
# against the SDK's InMemoryProvider, against MultiProvider wrapping one of them, and against
# the TCK's own controllable provider, which has a real initialisation and so is the only one
# of the three that covers the @lifecycle scenarios. No Docker, no Compose stack and no
# network. It finishes in seconds, so a broken step definition, a mis-wired capability gate or
# a regression in the shared harness is reported long before the containerised provider suites
# in `main` get there — and it points at the TCK rather than at whichever provider noticed
# first.
#
# Deliberately not a gate on `main`: the two run in parallel so a green run is not delayed.
# The same suite also runs inside `main` as part of the reactor build; this job exists to
# report it fast and in isolation.
tck:
name: Provider TCK (no Docker)
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
with:
# The feature files, canonical flag set and control-API document are copied in from
# the open-feature/spec submodule at generate-resources; without it there is no suite.
submodules: recursive

- name: Set up JDK 21
uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5
with:
java-version: 21
distribution: 'temurin'
cache: maven

- name: Cache local Maven repository
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}21-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}21-maven-

- name: Verify the TCK against the in-memory provider
# No `e2e` profile and no Docker: the in-memory suite is not gated behind either.
run: mvn --batch-mode --activate-profiles codequality -pl tools/tck -am clean verify

main:
strategy:
matrix:
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@
path = tools/flagd-api-testkit/test-harness
url = https://github.com/open-feature/test-harness.git
branch = v3.10.1
[submodule "tools/tck/spec"]
path = tools/tck/spec
url = https://github.com/open-feature/spec.git
1 change: 1 addition & 0 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"tools/flagd-http-connector": "0.0.5",
"tools/flagd-api": "1.0.0",
"tools/flagd-api-testkit": "0.2.1",
"tools/tck": "0.1.0",
"tools/flagd-core": "2.0.1",
".": "1.0.0",
"providers/optimizely": "1.0.0"
Expand Down
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
</licenses>

<modules>
<module>tools/tck</module>
<module>tools/flagd-api-testkit</module>
<module>tools/flagd-api</module>
<module>tools/flagd-core</module>
Expand Down
11 changes: 11 additions & 0 deletions release-please-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,17 @@
"README.md"
]
},
"tools/tck": {
"package-name": "dev.openfeature.contrib.tools.tck",
"release-type": "simple",
"bump-minor-pre-major": true,
"bump-patch-for-minor-pre-major": true,
"versioning": "default",
"extra-files": [
"pom.xml",
"README.md"
]
},
"tools/flagd-api-testkit": {
"package-name": "dev.openfeature.contrib.tools.flagdapitestkit",
"release-type": "simple",
Expand Down
7 changes: 7 additions & 0 deletions tools/tck/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Copied from the `spec` submodule at build time (mvn generate-resources).
# Do not edit these files directly — they are the language-agnostic definition of the
# provider contract and live in open-feature/spec, under
# specification/assets/provider-tck/ (Appendix F).
src/main/resources/gherkin/
src/main/resources/flags/
src/main/resources/openapi/
Loading
Loading