157d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkelpackage com.xtremelabs.robolectric.shadows;
257d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
357d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkelimport com.xtremelabs.robolectric.internal.Implementation;
457d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkelimport com.xtremelabs.robolectric.internal.Implements;
557d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkelimport com.xtremelabs.robolectric.internal.RealObject;
657d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
757d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkelimport android.content.SyncResult;
857d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkelimport android.content.SyncStats;
957d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
1057d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkelimport java.lang.reflect.Field;
1157d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
1257d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel@Implements(SyncResult.class)
1357d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkelpublic class ShadowSyncResult {
1457d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    @RealObject
1557d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    private SyncResult result;
1657d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
1757d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    public void __constructor__() {
1857d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        try {
1957d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            Field f = SyncResult.class.getDeclaredField("stats");
2057d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            f.setAccessible(true);
2157d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            f.set(result, new SyncStats());
2257d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        } catch (NoSuchFieldException e) {
2357d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            throw new RuntimeException(e);
2457d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        } catch (IllegalAccessException e) {
2557d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            throw new RuntimeException(e);
2657d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        }
2757d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    }
2857d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
2957d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    @Implementation
3057d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    public boolean hasSoftError() {
3157d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        return result.syncAlreadyInProgress || result.stats.numIoExceptions > 0;
3257d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    }
3357d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
3457d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    @Implementation
3557d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    public boolean hasHardError() {
3657d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        return result.stats.numParseExceptions > 0
3757d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel                || result.stats.numConflictDetectedExceptions > 0
3857d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel                || result.stats.numAuthExceptions > 0
3957d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel                || result.tooManyDeletions
4057d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel                || result.tooManyRetries
4157d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel                || result.databaseError;
4257d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    }
4357d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
4457d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    @Implementation
4557d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    public boolean hasError() {
4657d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        return hasSoftError() || hasHardError();
4757d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    }
4857d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
4957d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    @Implementation
5057d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    public boolean madeSomeProgress() {
5157d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        return ((result.stats.numDeletes > 0) && !result.tooManyDeletions)
5257d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel                || result.stats.numInserts > 0
5357d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel                || result.stats.numUpdates > 0;
5457d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    }
5557d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
5657d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    @Implementation
5757d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    public void clear() {
5857d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        if (result.syncAlreadyInProgress) {
5957d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            throw new UnsupportedOperationException(
6057d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel                    "you are not allowed to clear the ALREADY_IN_PROGRESS SyncStats");
6157d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        }
6257d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        result.tooManyDeletions = false;
6357d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        result.tooManyRetries = false;
6457d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        result.databaseError = false;
6557d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        result.fullSyncRequested = false;
6657d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        result.partialSyncUnavailable = false;
6757d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        result.moreRecordsToGet = false;
6857d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        result.delayUntil = 0;
6957d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        result.stats.clear();
7057d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    }
7157d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
7257d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
7357d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    @Implements(SyncStats.class)
7457d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    public static class ShadowSyncStats {
7557d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        @RealObject
7657d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        private SyncStats stats;
7757d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel
7857d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        @Implementation
7957d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        public void clear() {
8057d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            stats.numAuthExceptions = 0;
8157d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            stats.numIoExceptions = 0;
8257d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            stats.numParseExceptions = 0;
8357d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            stats.numConflictDetectedExceptions = 0;
8457d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            stats.numInserts = 0;
8557d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            stats.numUpdates = 0;
8657d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            stats.numDeletes = 0;
8757d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            stats.numEntries = 0;
8857d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel            stats.numSkippedEntries = 0;
8957d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel        }
9057d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel    }
9157d524e7eebcea4a186fd6f849142a56bcaa1b2aJan Berkel}
92