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