This file provides context for AI coding agents (Claude Code, GitHub Copilot, Cursor, etc.) working in this repository.
- Product family: Mobile (Android)
- Primary language(s): Java
- Build system: Gradle
- Test framework: JUnit, Appium
- CI system: GitHub Actions
src/- Test source code; the single Gherkin feature file issrc/test/resources/io/cucumber/features.featureserver/- Server setup scriptsbuild.gradle- Gradle build configurationgradle/- Gradle wrapperrunAppium.sh- Appium server launcherlocal.properties- Local configuration (APK names, passcode, package name, Appium URL). Gitignored; seeLocProperties.javafor the keys it expects.
- Branching: main
- Commit messages: DCO sign-off required (
git commit -s) - Code style: No linter is configured
- PR process: Open a PR against main. All CI checks must pass.
# Build
./gradlew build
# Build without running tests
./gradlew build -x test
# Test
./gradlew clean test -Dserver="https://myserver:9200" -Dusername=john -Dpassword=mypass -Dcommit=87a6f33A single-scenario Cucumber/JUnit/Appium suite that verifies the ownCloud Android app upgrade path.
All Cucumber classes receive a World instance via PicoContainer constructor
injection. World is the single service locator — it lazily constructs every
collaborator on first access.
StepDefinitions -> preconditions / tasks / assertions -> pages / APIs
^
World
steps/StepDefinitions- thin glue only; each step body is a single delegation call.preconditions/- server-side setup via API before the app is touched (@Given).tasks/- UI interactions the actor performs (@When).assertions/- state verification withassertTrue/assertEquals(@Then).pages/- Page Object Model; one class per screen.CommonPageis the base.api/- OkHttp-based REST/WebDAV clients.CommonAPIis the base (holds credentials, personal-space ID,baseRequestBuilder()). AllResponseobjects must be wrapped in try-with-resources.world/World- lazy singleton hub; never instantiates a collaborator more than once per scenario.hooks/Hooks- Cucumber@Before/@After; starts/stops screen recording and device cleanup.support/- cross-cutting utilities:Log,StepLogger,ScreenRecorder,DeviceClient,oCHttpClient, SAX/JSON parsers.
isOCISinCommonAPIis hardcodedtrue- all OC10 branches in the API layer are unreachable dead code.AndroidManageris a static singleton;getDriver()initialises it on first call.ScreenRecordersaves video only when a scenario fails.
- All code contributions must be compatible with the GPL-3.0 license
- Do not introduce new copyleft-licensed dependencies (GPL, AGPL, LGPL, MPL) without explicit discussion in an issue first. This is especially important for repos migrating to Apache 2.0.
- Do not introduce new dependencies without discussion in an issue first
- Tests require a running Appium server and an Android device/emulator
- Tests require two APK files (older and newer versions) placed under
src/test/resources/, and a reachable ownCloud server
- Only use actions owned by
owncloud, created by GitHub (actions/*), verified on the GitHub Marketplace, or verified by the ownCloud Maintainers. - Pin all actions to their full commit SHA (not tags):
uses: actions/checkout@<SHA> # vX.Y.Z - Never introduce actions from unverified third parties.
- Dependabot is configured for automated dependency updates.
- Review and merge Dependabot PRs as part of regular maintenance.
- Do not introduce new dependencies without discussion in an issue first.
- Rebase policy: Always rebase; never create merge commits. Use
git pull --rebaseandgit rebasebefore pushing. - Signed commits: All commits must be PGP/GPG signed (
git commit -S -s). - DCO sign-off: Every commit needs a
Signed-off-byline (git commit -s). - Conventional Commits & Squash Merge: Use the Conventional Commits format where the repository enforces it. Many repos use squash merge, where the PR title becomes the commit message on the default branch — apply Conventional Commits format to PR titles as well. A reusable GitHub Actions workflow enforces this.
- Match existing code style
- Do not refactor unrelated code in the same PR
- Write tests for new functionality
- Keep PRs focused and atomic
- This is a focused test repo - changes should relate to update/upgrade testing only