event: Add non-owning constructor

This allows internal store event objects without having to contain
circular references. A circular reference in an event source will cause
the event loop from ever cleaning up correctly.

Change-Id: I23fe0c95093953071216cf1deeb17e79defb7ffb
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/test/event.cpp b/test/event.cpp
index 1bf5976..ff574be 100644
--- a/test/event.cpp
+++ b/test/event.cpp
@@ -43,6 +43,40 @@
     EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
 }
 
+TEST_F(EventTest, CopyEventNoOwn)
+{
+    Event event(expected_event, std::false_type(), &mock);
+    EXPECT_EQ(&mock, event.getSdEvent());
+    EXPECT_EQ(expected_event, event.get());
+
+    Event event_noown(event, sdeventplus::internal::NoOwn());
+    EXPECT_EQ(&mock, event_noown.getSdEvent());
+    EXPECT_EQ(expected_event, event_noown.get());
+
+    EXPECT_CALL(mock, sd_event_unref(expected_event)).WillOnce(Return(nullptr));
+}
+
+TEST_F(EventTest, CopyEventNoOwnCopy)
+{
+    Event event(expected_event, std::false_type(), &mock);
+    EXPECT_EQ(&mock, event.getSdEvent());
+    EXPECT_EQ(expected_event, event.get());
+
+    Event event_noown(event, sdeventplus::internal::NoOwn());
+    EXPECT_EQ(&mock, event_noown.getSdEvent());
+    EXPECT_EQ(expected_event, event_noown.get());
+
+    EXPECT_CALL(mock, sd_event_ref(expected_event))
+        .WillOnce(Return(expected_event));
+    Event event2(event_noown);
+    EXPECT_EQ(&mock, event2.getSdEvent());
+    EXPECT_EQ(expected_event, event2.get());
+
+    EXPECT_CALL(mock, sd_event_unref(expected_event))
+        .WillOnce(Return(nullptr))
+        .WillOnce(Return(nullptr));
+}
+
 TEST_F(EventTest, GetNewEvent)
 {
     EXPECT_CALL(mock, sd_event_new(testing::_))