isolate sk_sp from larger cl

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1752683002

Review URL: https://codereview.chromium.org/1752683002
diff --git a/tests/RefCntTest.cpp b/tests/RefCntTest.cpp
index 6a1e0dc..e3f41bd 100644
--- a/tests/RefCntTest.cpp
+++ b/tests/RefCntTest.cpp
@@ -79,3 +79,93 @@
     test_refCnt(reporter);
     test_weakRefCnt(reporter);
 }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+static int gRefCounter;
+static int gUnrefCounter;
+static int gNewCounter;
+static int gDeleteCounter;
+
+#define check(reporter, ref, unref, make, kill)             \
+    REPORTER_ASSERT(reporter, gRefCounter == ref);          \
+    REPORTER_ASSERT(reporter, gUnrefCounter == unref);      \
+    REPORTER_ASSERT(reporter, gNewCounter == make);         \
+    REPORTER_ASSERT(reporter, gDeleteCounter == kill);
+
+
+class Effect {
+public:
+    Effect() : fRefCnt(1) {
+        gNewCounter += 1;
+    }
+
+    int fRefCnt;
+
+    void ref() {
+        gRefCounter += 1;
+        fRefCnt += 1;
+    }
+    void unref() {
+        gUnrefCounter += 1;
+
+        SkASSERT(fRefCnt > 0);
+        if (0 == --fRefCnt) {
+            gDeleteCounter += 1;
+            delete this;
+        }
+    }
+
+    int* method() const { return new int; }
+};
+
+static sk_sp<Effect> Create() {
+    return sk_sp<Effect>(new Effect);
+}
+
+class Paint {
+public:
+    sk_sp<Effect> fEffect;
+
+    const sk_sp<Effect>& get() const { return fEffect; }
+
+    void set(sk_sp<Effect> value) {
+        fEffect = std::move(value);
+    }
+};
+
+DEF_TEST(sk_sp, reporter) {
+    gRefCounter = 0;
+    gUnrefCounter = 0;
+    gNewCounter = 0;
+    gDeleteCounter = 0;
+
+    Paint paint;
+    REPORTER_ASSERT(reporter, paint.fEffect.get() == nullptr);
+    REPORTER_ASSERT(reporter, !paint.get());
+    check(reporter, 0, 0, 0, 0);
+
+    paint.set(Create());
+    check(reporter, 0, 0, 1, 0);
+    REPORTER_ASSERT(reporter, paint.fEffect.get()->fRefCnt == 1);
+
+    paint.set(nullptr);
+    check(reporter, 0, 1, 1, 1);
+
+    auto e = Create();
+    REPORTER_ASSERT(reporter, sizeof(e) == sizeof(void*));
+
+    check(reporter, 0, 1, 2, 1);
+    paint.set(e);
+    check(reporter, 1, 1, 2, 1);
+    REPORTER_ASSERT(reporter, paint.fEffect.get()->fRefCnt == 2);
+
+    Paint paint2;
+    paint2.set(paint.get());
+    check(reporter, 2, 1, 2, 1);
+    REPORTER_ASSERT(reporter, paint.fEffect.get()->fRefCnt == 3);
+
+    delete paint.get()->method();
+    check(reporter, 2, 1, 2, 1);
+}
+