Skip to content

Commit

Permalink
Use github actions for continuous integration
Browse files Browse the repository at this point in the history
Unfortunately, TravisCI is gradually turning down its OSS offering.
This has the benefit of using clearer, flexible, and more powerful
workflow definitions. Due to getting a little attention, some
long-standing flaky tests were fixed and style cleaned up.
  • Loading branch information
ben-manes committed Nov 9, 2020
1 parent f5ababd commit f5e46aa
Show file tree
Hide file tree
Showing 27 changed files with 379 additions and 182 deletions.
10 changes: 10 additions & 0 deletions .github/scripts/analyze.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/bin/bash
set -eu

run() {
echo $1
eval $1
}

run "./gradlew pmdJavaPoet pmdMain -Dpmd"
run "./gradlew spotbugsJavaPoet spotbugsMain spotbugsJmh -Dspotbugs"
11 changes: 11 additions & 0 deletions .github/scripts/test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash
set -eu

run() {
echo $1
eval $1
}

run "./gradlew check"
run "./gradlew :caffeine:slowGuavaTest"
run "./gradlew :caffeine:slowCaffeineTest"
32 changes: 32 additions & 0 deletions .github/workflows/analysis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: analysis
on: [ push, pull_request ]

env:
ORG_GRADLE_PROJECT_checksumFailOn: build_finish
ORG_GRADLE_PROJECT_checksumIgnore: false
ORG_GRADLE_PROJECT_checksumPrint: true

jobs:
analyze:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ 8, 15 ]
steps:
- uses: actions/checkout@v2
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v1
with:
java-version: ${{ matrix.java }}
- name: Cache Gradle packages
uses: actions/cache@v2
with:
path: |
~/.gradle/wrapper
~/.gradle/caches
~/.sonar/cache
~/.m2
key: ${{ runner.os }}-${{ github.job }}-${{ matrix.java }}-${{ hashFiles('**/*.gradle') }}
restore-keys: ${{ runner.os }}-gradle
- name: Run analyzers
run: ./.github/scripts/analyze.sh
63 changes: 63 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: build
on: [ push, pull_request ]

env:
ORG_GRADLE_PROJECT_checksumFailOn: build_finish
ORG_GRADLE_PROJECT_checksumIgnore: false
ORG_GRADLE_PROJECT_checksumPrint: true
MAX_JVM: 15
MIN_JVM: 8

jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ 8, 15 ]
steps:
- uses: actions/checkout@v2
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v1
with:
java-version: ${{ matrix.java }}
- name: Cache Gradle packages
uses: actions/cache@v2
with:
path: |
~/.gradle/wrapper
~/.gradle/caches
~/.sonar/cache
~/.m2
key: ${{ runner.os }}-${{ github.job }}-${{ matrix.java }}-${{ hashFiles('**/*.gradle') }}
restore-keys: ${{ runner.os }}-gradle
- name: Run tests
run: ./.github/scripts/test.sh
- name: Publish Coverage
if: >
success()
&& matrix.java == env.MIN_JVM
&& github.event_name == 'push'
&& endsWith(github.ref, github.event.repository.default_branch)
env:
COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
run: ./gradlew coveralls
- name: SonarQube
if: >
success()
&& matrix.java == env.MAX_JVM
&& github.event_name == 'push'
&& endsWith(github.ref, github.event.repository.default_branch)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: ./gradlew sonarqube
- name: Publish Snapshot
if: >
success()
&& matrix.java == env.MIN_JVM
&& github.event_name == 'push'
&& endsWith(github.ref, github.event.repository.default_branch)
env:
NEXUS_USERNAME: ${{ secrets.NEXUS_USERNAME }}
NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }}
run: ./gradlew publish
File renamed without changes.
39 changes: 39 additions & 0 deletions .github/workflows/examples.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: examples
on: [ push, pull_request ]

env:
ORG_GRADLE_PROJECT_checksumFailOn: build_finish
ORG_GRADLE_PROJECT_checksumIgnore: false
ORG_GRADLE_PROJECT_checksumPrint: true

jobs:
examples:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ 8, 15 ]
steps:
- uses: actions/checkout@v2
- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v1
with:
java-version: ${{ matrix.java }}
- name: Cache Gradle packages
uses: actions/cache@v2
with:
path: |
~/.gradle/wrapper
~/.gradle/caches
~/.sonar/cache
~/.m2
key: ${{ runner.os }}-${{ github.job }}-${{ matrix.java }}-${{ hashFiles('**/*.gradle') }}
restore-keys: ${{ runner.os }}-gradle
- name: stats-metrics
working-directory: examples/stats-metrics
run: ./gradlew test
- name: write-behind-rxjava
working-directory: examples/write-behind-rxjava
run: mvn test
- name: coalescing-bulkloader
working-directory: examples/coalescing-bulkloader
run: mvn test
38 changes: 0 additions & 38 deletions .travis.yml

This file was deleted.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[![Build Status](https://travis-ci.org/ben-manes/caffeine.svg)](https://travis-ci.org/ben-manes/caffeine)
[![Build Status](https://github.com/ben-manes/caffeine/workflows/build/badge.svg)](https://github.com/ben-manes/caffeine/actions?query=workflow%3Abuild)
[![Coverage Status](https://img.shields.io/coveralls/ben-manes/caffeine.svg)](https://coveralls.io/r/ben-manes/caffeine?branch=master)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.ben-manes.caffeine/caffeine/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.ben-manes.caffeine/caffeine)
[![JavaDoc](http://www.javadoc.io/badge/com.github.ben-manes.caffeine/caffeine.svg)](http://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.github.benmanes.caffeine;

import static com.github.benmanes.caffeine.IsValidSingleConsumerQueue.validate;
import static com.github.benmanes.caffeine.testing.Awaits.await;
import static com.github.benmanes.caffeine.testing.IsEmptyIterable.deeplyEmpty;
import static com.google.common.collect.Iterators.elementsEqual;
import static org.hamcrest.MatcherAssert.assertThat;
Expand Down Expand Up @@ -45,7 +46,6 @@
import org.testng.annotations.Test;

import com.github.benmanes.caffeine.SingleConsumerQueueTest.ValidatingQueueListener;
import com.github.benmanes.caffeine.testing.Awaits;
import com.github.benmanes.caffeine.testing.ConcurrentTestHarness;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
Expand Down Expand Up @@ -426,22 +426,22 @@ public void oneProducer_oneConsumer(Queue<Integer> queue) {

ConcurrentTestHarness.execute(() -> {
started.incrementAndGet();
Awaits.await().untilAtomic(started, is(2));
await().untilAtomic(started, is(2));
for (int i = 0; i < PRODUCE; i++) {
queue.add(i);
}
finished.incrementAndGet();
});
ConcurrentTestHarness.execute(() -> {
started.incrementAndGet();
Awaits.await().untilAtomic(started, is(2));
await().untilAtomic(started, is(2));
for (int i = 0; i < PRODUCE; i++) {
while (queue.poll() == null) {}
}
finished.incrementAndGet();
});

Awaits.await().untilAtomic(finished, is(2));
await().untilAtomic(finished, is(2));
assertThat(queue, is(deeplyEmpty()));
}

Expand All @@ -463,7 +463,7 @@ public void manyProducers_oneConsumer(Queue<Integer> queue) {

ConcurrentTestHarness.execute(() -> {
started.incrementAndGet();
Awaits.await().untilAtomic(started, is(NUM_PRODUCERS + 1));
await().untilAtomic(started, is(NUM_PRODUCERS + 1));
for (int i = 0; i < (NUM_PRODUCERS * PRODUCE); i++) {
while (queue.poll() == null) {}
}
Expand All @@ -472,14 +472,14 @@ public void manyProducers_oneConsumer(Queue<Integer> queue) {

ConcurrentTestHarness.timeTasks(NUM_PRODUCERS, () -> {
started.incrementAndGet();
Awaits.await().untilAtomic(started, is(NUM_PRODUCERS + 1));
await().untilAtomic(started, is(NUM_PRODUCERS + 1));
for (int i = 0; i < PRODUCE; i++) {
queue.add(i);
}
finished.incrementAndGet();
});

Awaits.await().untilAtomic(finished, is(NUM_PRODUCERS + 1));
await().untilAtomic(finished, is(NUM_PRODUCERS + 1));
assertThat(queue, is(deeplyEmpty()));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@
import com.github.benmanes.caffeine.cache.testing.CacheValidationListener;
import com.github.benmanes.caffeine.cache.testing.CheckNoStats;
import com.github.benmanes.caffeine.cache.testing.CheckNoWriter;
import com.github.benmanes.caffeine.testing.Awaits;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
Expand Down Expand Up @@ -162,16 +161,16 @@ public void getFunc_absent_null_async(AsyncCache<Integer, Integer> cache, CacheC
AtomicBoolean ready = new AtomicBoolean();
AtomicBoolean done = new AtomicBoolean();
CompletableFuture<Integer> valueFuture = cache.get(key, k -> {
Awaits.await().untilTrue(ready);
await().untilTrue(ready);
return null;
});
valueFuture.whenComplete((r, e) -> done.set(true));

ready.set(true);
Awaits.await().untilTrue(done);
Awaits.await().until(() -> !cache.synchronous().asMap().containsKey(context.absentKey()));
Awaits.await().until(() -> context, both(hasMissCount(1)).and(hasHitCount(0)));
Awaits.await().until(() -> context, both(hasLoadSuccessCount(0)).and(hasLoadFailureCount(1)));
await().untilTrue(done);
await().until(() -> !cache.synchronous().asMap().containsKey(context.absentKey()));
assertThat(context, both(hasMissCount(1)).and(hasHitCount(0)));
assertThat(context, both(hasLoadSuccessCount(0)).and(hasLoadFailureCount(1)));

assertThat(valueFuture.isDone(), is(true));
assertThat(cache.synchronous().asMap(), not(hasKey(key)));
Expand Down Expand Up @@ -199,16 +198,16 @@ public void getFunc_absent_failure_async(
AtomicBoolean ready = new AtomicBoolean();
AtomicBoolean done = new AtomicBoolean();
CompletableFuture<Integer> valueFuture = cache.get(context.absentKey(), k -> {
Awaits.await().untilTrue(ready);
await().untilTrue(ready);
throw new IllegalStateException();
});
valueFuture.whenComplete((r, e) -> done.set(true));

ready.set(true);
Awaits.await().untilTrue(done);
Awaits.await().until(() -> !cache.synchronous().asMap().containsKey(context.absentKey()));
Awaits.await().until(() -> context, both(hasMissCount(1)).and(hasHitCount(0)));
Awaits.await().until(() -> context, both(hasLoadSuccessCount(0)).and(hasLoadFailureCount(1)));
await().untilTrue(done);
await().until(() -> !cache.synchronous().asMap().containsKey(context.absentKey()));
assertThat(context, both(hasMissCount(1)).and(hasHitCount(0)));
assertThat(context, both(hasLoadSuccessCount(0)).and(hasLoadFailureCount(1)));

assertThat(valueFuture.isCompletedExceptionally(), is(true));
assertThat(cache.getIfPresent(context.absentKey()), is(nullValue()));
Expand All @@ -220,15 +219,15 @@ public void getFunc_absent_failure_async(
public void getFunc_absent_cancelled(AsyncCache<Integer, Integer> cache, CacheContext context) {
AtomicBoolean done = new AtomicBoolean();
CompletableFuture<Integer> valueFuture = cache.get(context.absentKey(), k -> {
Awaits.await().until(done::get);
await().until(done::get);
return null;
});
valueFuture.whenComplete((r, e) -> done.set(true));
valueFuture.cancel(true);

Awaits.await().untilTrue(done);
await().until(() -> context, both(hasMissCount(1)).and(hasHitCount(0)));
await().until(() -> context, both(hasLoadSuccessCount(0)).and(hasLoadFailureCount(1)));
await().untilTrue(done);
assertThat(context, both(hasMissCount(1)).and(hasHitCount(0)));
assertThat(context, both(hasLoadSuccessCount(0)).and(hasLoadFailureCount(1)));

assertThat(valueFuture.isDone(), is(true));
assertThat(cache.getIfPresent(context.absentKey()), is(nullValue()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@
import com.github.benmanes.caffeine.cache.testing.CacheValidationListener;
import com.github.benmanes.caffeine.cache.testing.CheckNoStats;
import com.github.benmanes.caffeine.cache.testing.CheckNoWriter;
import com.github.benmanes.caffeine.testing.Awaits;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
Expand Down Expand Up @@ -112,13 +111,14 @@ public void get_absent_failure_async(
CompletableFuture<Integer> valueFuture = cache.get(key);
valueFuture.whenComplete((r, e) -> done.set(true));

Awaits.await().untilTrue(done);
Awaits.await().until(() -> !cache.synchronous().asMap().containsKey(context.absentKey()));
Awaits.await().until(() -> context, both(hasMissCount(1)).and(hasHitCount(0)));
Awaits.await().until(() -> context, both(hasLoadSuccessCount(0)).and(hasLoadFailureCount(1)));
await().untilTrue(done);
await().until(() -> !cache.synchronous().asMap().containsKey(context.absentKey()));
assertThat(context, both(hasMissCount(1)).and(hasHitCount(0)));
assertThat(context, both(hasLoadSuccessCount(0)).and(hasLoadFailureCount(1)));

assertThat(valueFuture.isCompletedExceptionally(), is(true));
assertThat(cache.getIfPresent(key), is(nullValue()));
await().until(() -> cache.synchronous().estimatedSize(), is(context.initialSize()));
}

@CheckNoWriter
Expand Down
Loading

0 comments on commit f5e46aa

Please sign in to comment.