Skip to content

Commit 0fab29d

Browse files
authored
Fix build (#332)
* update dependencies * update build tools and circle yml * update roboelectric, rollback support distribution until play service update their dependencies * Fix KeepAliveTest This CL fixes the KeepAliveTest to better handle the delay between finishing a job and consumer going idle. I've also changed when we save when a consumer is done. This would not have any effect on real time but important for test stability.
1 parent 7ef816e commit 0fab29d

File tree

8 files changed

+101
-56
lines changed

8 files changed

+101
-56
lines changed

circle.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,10 @@ machine:
2323
version: openjdk8
2424
dependencies:
2525
pre:
26-
- echo y | android update sdk --no-ui --all --filter "tools,android-25,build-tools-24.0.3,platform-tools,extra-android-m2repository,extra-google-m2repository,extra-google-google_play_services"
26+
- echo y | android update sdk -u -a -t tools
27+
- echo y | android update sdk -u -a -t platform-tools
28+
- echo y | android update sdk -u -a -t build-tools-25.0.2
29+
- echo y | android update sdk -u -a -t android-25
30+
- echo y | android update sdk -u -a -t extra-google-m2repository
31+
- echo y | android update sdk -u -a -t extra-android-m2repository
32+
- echo y | android update sdk -u -a -t extra-google-google_play_services

jobqueue/build.gradle

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ buildscript {
2727
}
2828

2929
dependencies {
30-
classpath 'com.android.tools.build:gradle:2.2.3'
30+
classpath 'com.android.tools.build:gradle:2.3.0'
3131
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
3232
}
3333
}
@@ -46,25 +46,26 @@ configurations {
4646

4747
dependencies {
4848
testCompile 'junit:junit:4.12'
49-
testCompile "org.robolectric:robolectric:3.2.2"
49+
testCompile "org.robolectric:robolectric:3.3"
5050
testCompile 'org.hamcrest:hamcrest-core:1.3'
5151
testCompile 'org.easytesting:fest-util:1.2.5'
5252
testCompile 'org.easytesting:fest-reflect:1.4.1'
53-
testCompile 'org.mockito:mockito-core:2.0.2-beta'
53+
testCompile 'org.mockito:mockito-core:2.7.13'
5454

5555
compile 'com.squareup.okio:okio:1.8.0'
5656

5757
// use an old version since we only need a few util classes that were already there for a long
5858
// time. If app depends on a newer one, gradle will pick it for us.
5959
//noinspection GradleDependency
60-
compile 'com.android.support:support-core-utils:25.0.1'
60+
// remove when gms moves to individual libraries
61+
compile 'com.android.support:support-v4:25.2.0'
6162
// build tools does not allow making this provided so we make it optional when pom is created
62-
compile 'com.google.android.gms:play-services-gcm:10.0.1'
63+
compile 'com.google.android.gms:play-services-gcm:10.2.0'
6364
}
6465

6566
android {
6667
compileSdkVersion 25
67-
buildToolsVersion "24.0.3"
68+
buildToolsVersion "25.0.2"
6869
buildTypes {
6970
debug {
7071
testCoverageEnabled = true
@@ -75,7 +76,7 @@ android {
7576
}
7677

7778
defaultConfig {
78-
minSdkVersion 9
79+
minSdkVersion 14
7980
targetSdkVersion 25
8081
}
8182

jobqueue/src/main/java/com/birbit/android/jobqueue/ConsumerManager.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,10 +217,11 @@ boolean handleIdle(@NonNull JobConsumerIdleMessage message) {
217217
return true;
218218
} else {
219219
long keepAliveTimeout = message.getLastJobCompleted() + consumerKeepAliveNs;
220-
JqLog.d("keep alive: %s", keepAliveTimeout);
220+
JqLog.v("keep alive: %s", keepAliveTimeout);
221221
final boolean tooMany = consumers.size() > minConsumerCount;
222222
boolean kill = !running || (tooMany && keepAliveTimeout < timer.nanoTime());
223-
JqLog.d("Consumer idle, will kill? %s . isRunning: %s", kill, running);
223+
JqLog.v("Consumer idle, will kill? %s. isRunning: %s. too many? %s timeout: %s now: %s",
224+
kill, running, tooMany, keepAliveTimeout, timer.nanoTime() );
224225
if (kill) {
225226
CommandMessage command = factory.obtain(CommandMessage.class);
226227
command.set(CommandMessage.QUIT);
@@ -341,7 +342,7 @@ static class Consumer implements Runnable {
341342

342343
boolean hasJob;// controlled by the consumer controller to avoid multiple idle-job loops
343344

344-
long lastJobCompleted;
345+
volatile long lastJobCompleted;
345346

346347
static final MessagePredicate pokeMessagePredicate =
347348
new MessagePredicate() {
@@ -358,7 +359,6 @@ public void handleMessage(Message message) {
358359
switch (message.type) {
359360
case RUN_JOB:
360361
handleRunJob((RunJobMessage) message);
361-
lastJobCompleted = timer.nanoTime();
362362
removePokeMessages();
363363
break;
364364
case COMMAND:
@@ -415,6 +415,8 @@ private void handleRunJob(RunJobMessage message) {
415415
resultMessage.setJobHolder(jobHolder);
416416
resultMessage.setResult(result);
417417
resultMessage.setWorker(this);
418+
// update time here before posting the result
419+
lastJobCompleted = timer.nanoTime();
418420
parentMessageQueue.post(resultMessage);
419421
}
420422
}

jobqueue/src/main/java/com/birbit/android/jobqueue/JobManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,11 @@ public void waitUntilConsumersAreFinished() {
203203
private void waitUntilConsumersAreFinished(boolean stop) {
204204
assertNotInMainThread();
205205
final CountDownLatch latch = new CountDownLatch(1);
206+
JqLog.v("adding no consumers listener.");
206207
jobManagerThread.consumerManager.addNoConsumersListener(new Runnable() {
207208
@Override
208209
public void run() {
210+
JqLog.v("received no consumers callback");
209211
latch.countDown();
210212
jobManagerThread.consumerManager.removeNoConsumersListener(this);
211213
}

jobqueue/src/test/java/com/birbit/android/jobqueue/test/TestBase.java

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -62,40 +62,4 @@ private String prefix() {
6262
}
6363
});
6464
}
65-
66-
protected void enableCollectingDebug() {
67-
ShadowLog.stream = System.out;
68-
JqLog.setCustomLogger(new CustomLogger() {
69-
private String TAG = "test_logger";
70-
private StringBuffer logs = new StringBuffer();
71-
@Override
72-
public boolean isDebugEnabled() {
73-
return true;
74-
}
75-
76-
@Override
77-
public void d(String text, Object... args) {
78-
logs.append(Thread.currentThread().getName()).append("[d]:");
79-
logs.append(String.format(text, args)).append("\n");
80-
}
81-
82-
@Override
83-
public void e(Throwable t, String text, Object... args) {
84-
logs.append(Thread.currentThread().getName()).append("[e]:");
85-
logs.append(String.format(text, args)).append("\n");
86-
}
87-
88-
@Override
89-
public void e(String text, Object... args) {
90-
logs.append(Thread.currentThread().getName()).append("[e]:");
91-
logs.append(String.format(text, args)).append("\n");
92-
}
93-
94-
@Override
95-
public void v(String text, Object... args) {
96-
logs.append(Thread.currentThread().getName()).append("[v]:");
97-
logs.append(String.format(text, args)).append("\n");
98-
}
99-
});
100-
}
10165
}

jobqueue/src/test/java/com/birbit/android/jobqueue/test/jobmanager/JobManagerTestBase.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.os.Build;
77
import android.support.annotation.NonNull;
88

9+
import com.birbit.android.jobqueue.BuildConfig;
910
import com.birbit.android.jobqueue.JobManager;
1011
import com.birbit.android.jobqueue.JobManagerThreadRunnable;
1112
import com.birbit.android.jobqueue.RetryConstraint;
@@ -20,6 +21,7 @@
2021
import com.birbit.android.jobqueue.test.TestBase;
2122
import com.birbit.android.jobqueue.test.jobs.DummyJob;
2223
import com.birbit.android.jobqueue.test.timer.MockTimer;
24+
import com.birbit.android.jobqueue.testing.CollectLogsRule;
2325

2426
import static org.hamcrest.CoreMatchers.*;
2527

@@ -44,6 +46,8 @@ public class JobManagerTestBase extends TestBase {
4446
final MockTimer mockTimer = new MockTimer();
4547
@Rule public CleanupRule cleanup = new CleanupRule(this);
4648
@Rule public Timeout timeout = Timeout.seconds(getTimeout());
49+
@Rule public CollectLogsRule collectLogsRule = new CollectLogsRule();
50+
4751

4852
protected int getActiveConsumerCount(JobManager jobManager) {
4953
return jobManager.getActiveConsumerCount();
@@ -68,6 +72,9 @@ protected JobManager createJobManager(Configuration.Builder configurationBuilder
6872
if(createdJobManagers.size() > 0) {
6973
throw new AssertionError("only 1 job manager per test");
7074
}
75+
if (BuildConfig.DEBUG) {
76+
configurationBuilder.customLogger(collectLogsRule.logger);
77+
}
7178
Configuration config = configurationBuilder.inTestMode().id(UUID.randomUUID().toString())
7279
.build();
7380
if (config.getTimer() != mockTimer && !canUseRealTimer()) {

jobqueue/src/test/java/com/birbit/android/jobqueue/test/jobmanager/KeepAliveTest.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
import com.birbit.android.jobqueue.config.Configuration;
1515
import com.birbit.android.jobqueue.network.NetworkUtil;
1616
import com.birbit.android.jobqueue.test.jobs.DummyJob;
17+
import com.birbit.android.jobqueue.testing.CollectLogsRule;
1718

1819
import org.hamcrest.CoreMatchers;
1920
import org.hamcrest.MatcherAssert;
2021
import org.junit.Assert;
22+
import org.junit.Rule;
2123
import org.junit.Test;
2224
import org.junit.runner.RunWith;
2325
import org.robolectric.RobolectricTestRunner;
@@ -45,8 +47,10 @@ public void testKeepAliveWithoutNetworkEvents() throws Exception {
4547
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
4648
public void testKeepAlive(final DummyNetworkUtil networkUtil) throws Exception {
4749
int keepAlive = 3;
48-
final JobManager jobManager = createJobManager(new Configuration.Builder(RuntimeEnvironment.application)
49-
.consumerKeepAlive(keepAlive).networkUtil(networkUtil).timer(mockTimer));
50+
final JobManager jobManager = createJobManager(new Configuration
51+
.Builder(RuntimeEnvironment.application)
52+
.consumerKeepAlive(keepAlive).networkUtil(networkUtil)
53+
.timer(mockTimer));
5054
//give it a little time to create first consumer
5155
final CountDownLatch jobDone = new CountDownLatch(1);
5256
jobManager.addCallback(new JobManagerCallbackAdapter() {
@@ -62,11 +66,12 @@ public void onDone(@NonNull Job job) {
6266
MatcherAssert.assertThat("there should be 1 thread actively waiting for jobs",
6367
jobManager.getActiveConsumerCount(), equalTo(1));
6468
MatcherAssert.assertThat(jobDone.await(1, TimeUnit.MINUTES), CoreMatchers.is(true));
65-
//sleep till it dies
66-
mockTimer.incrementNs((long) (JobManager.NETWORK_CHECK_INTERVAL
67-
+ TimeUnit.SECONDS.toNanos(keepAlive) * 1.33));
6869
// Sync on job manager to ensure it handled add requests
6970
jobManager.count();
71+
72+
mockTimer.incrementNs((long) (JobManager.NETWORK_CHECK_INTERVAL
73+
+ TimeUnit.SECONDS.toNanos(keepAlive) + 1));
74+
7075
FutureTask<Void> waitForConsumersFuture = new FutureTask<>(new Callable<Void>() {
7176
@Override
7277
public Void call() throws Exception {
@@ -84,7 +89,8 @@ public Void call() throws Exception {
8489
networkUtil.setNetworkStatus(NetworkUtil.DISCONNECTED);
8590
final DummyJob dj1 = new DummyJob(new Params(0).requireNetwork());
8691
jobManager.addJob(dj1);
87-
92+
// sync add job request
93+
jobManager.count();
8894
mockTimer.incrementNs(JobManager.NETWORK_CHECK_INTERVAL +
8995
TimeUnit.SECONDS.toNanos(keepAlive) * 2);
9096

@@ -101,8 +107,6 @@ public void assertJob(Job job) {
101107
});
102108
MatcherAssert.assertThat("when network is recovered, job should be handled",
103109
jobManager.count(), equalTo(0));
104-
105-
106110
}
107111

108112
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.birbit.android.jobqueue.testing;
2+
3+
4+
import com.birbit.android.jobqueue.log.CustomLogger;
5+
import com.birbit.android.jobqueue.log.JqLog;
6+
7+
import org.junit.rules.TestWatcher;
8+
import org.junit.runner.Description;
9+
10+
public class CollectLogsRule extends TestWatcher {
11+
public final CollectingLogger logger = new CollectingLogger();
12+
13+
public CollectLogsRule() {
14+
super();
15+
}
16+
17+
@Override
18+
protected void starting(Description description) {
19+
super.starting(description);
20+
JqLog.setCustomLogger(logger);
21+
}
22+
23+
@Override
24+
public void failed(Throwable e, Description description) {
25+
throw new AssertionError(logger.logs.toString());
26+
}
27+
28+
static class CollectingLogger implements CustomLogger {
29+
private StringBuffer logs = new StringBuffer();
30+
@Override
31+
public boolean isDebugEnabled() {
32+
return true;
33+
}
34+
35+
@Override
36+
public void d(String text, Object... args) {
37+
logs.append(Thread.currentThread().getName()).append("[d]:");
38+
logs.append(String.format(text, args)).append("\n");
39+
}
40+
41+
@Override
42+
public void e(Throwable t, String text, Object... args) {
43+
logs.append(Thread.currentThread().getName()).append("[e]:");
44+
logs.append(String.format(text, args)).append("\n");
45+
}
46+
47+
@Override
48+
public void e(String text, Object... args) {
49+
logs.append(Thread.currentThread().getName()).append("[e]:");
50+
logs.append(String.format(text, args)).append("\n");
51+
}
52+
53+
@Override
54+
public void v(String text, Object... args) {
55+
logs.append(Thread.currentThread().getName()).append("[v]:");
56+
logs.append(String.format(text, args)).append("\n");
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)