3 // Shadow is the interface that any "shadow" structures must implement.
5 // A shadow structure is an interface implementation (typically) that
6 // shadows a real implementation and verifies that the same behavior occurs
7 // on both. The semantics of this behavior are up to the interface itself.
9 // A shadow NEVER modifies real values or state. It must always be safe to use.
11 // For example, a ResourceProvider shadow ensures that the same operations
12 // are done on the same resources with the same configurations.
14 // The typical usage of a shadow following this interface is to complete
15 // the real operations, then call CloseShadow which tells the shadow that
16 // the real side is done. Then, once the shadow is also complete, call
17 // ShadowError to find any errors that may have been caught.
18 type Shadow interface {
19 // CloseShadow tells the shadow that the REAL implementation is
20 // complete. Therefore, any calls that would block should now return
21 // immediately since no more changes will happen to the real side.
24 // ShadowError returns the errors that the shadow has found.
25 // This should be called AFTER CloseShadow and AFTER the shadow is
26 // known to be complete (no more calls to it).