1
2
3
4
5 package mockit.internal.state;
6
7 import static mockit.internal.expectations.RecordAndReplayExecution.RECORD_OR_REPLAY_LOCK;
8
9 import edu.umd.cs.findbugs.annotations.NonNull;
10
11 import java.util.List;
12 import java.util.Map;
13 import java.util.Set;
14
15 import mockit.internal.ClassIdentification;
16 import mockit.internal.faking.FakeClasses;
17
18 public final class SavePoint {
19 @NonNull
20 private final Set<ClassIdentification> previousTransformedClasses;
21 @NonNull
22 private final Map<Class<?>, byte[]> previousRedefinedClasses;
23 private final int previousCaptureTransformerCount;
24 @NonNull
25 private final List<Class<?>> previousMockedClasses;
26 @NonNull
27 private final FakeClasses.SavePoint previousFakeClasses;
28
29 public SavePoint() {
30 MockFixture mockFixture = TestRun.mockFixture();
31 previousTransformedClasses = mockFixture.getTransformedClasses();
32 previousRedefinedClasses = mockFixture.getRedefinedClasses();
33 previousCaptureTransformerCount = mockFixture.getCaptureTransformerCount();
34 previousMockedClasses = mockFixture.getMockedClasses();
35 previousFakeClasses = TestRun.getFakeClasses().new SavePoint();
36 }
37
38 public synchronized void rollback() {
39 RECORD_OR_REPLAY_LOCK.lock();
40
41 try {
42 MockFixture mockFixture = TestRun.mockFixture();
43 mockFixture.removeCaptureTransformers(previousCaptureTransformerCount);
44 mockFixture.restoreTransformedClasses(previousTransformedClasses);
45 mockFixture.restoreRedefinedClasses(previousRedefinedClasses);
46 mockFixture.removeMockedClasses(previousMockedClasses);
47 previousFakeClasses.rollback();
48 } finally {
49 RECORD_OR_REPLAY_LOCK.unlock();
50 }
51 }
52 }