Fix behavior of sk_sp::reset(T*) and add unittest.

Previously, sk_sp::reset(T* t) did not release its own reference
if its internal pointer was the same as 't'. This leaks a reference.
Now always release the current reference when non-nullptr.

Review URL: https://codereview.chromium.org/1767983002
diff --git a/tests/RefCntTest.cpp b/tests/RefCntTest.cpp
index 8914ccf..f5345b6 100644
--- a/tests/RefCntTest.cpp
+++ b/tests/RefCntTest.cpp
@@ -290,3 +290,21 @@
 DEF_TEST(sk_make_sp, r) {
     auto x = make_foo();
 }
+
+// Test that reset() "adopts" ownership from the caller, even if we are given the same ptr twice
+//
+DEF_TEST(sk_sp_reset, r) {
+    SkRefCnt* rc = new SkRefCnt;
+    REPORTER_ASSERT(r, rc->unique());
+
+    sk_sp<SkRefCnt> sp;
+    sp.reset(rc);
+    // We have transfered our ownership over to sp
+    REPORTER_ASSERT(r, rc->unique());
+
+    rc->ref();  // now "rc" is also an owner
+    REPORTER_ASSERT(r, !rc->unique());
+
+    sp.reset(rc);   // this should transfer our ownership over to sp
+    REPORTER_ASSERT(r, rc->unique());
+}