From 4d079213e5dbf35f9ae20172ac9a069352dff637 Mon Sep 17 00:00:00 2001 From: Christophe De Troyer Date: Fri, 18 May 2018 16:53:07 +0200 Subject: [PATCH] unsubscribe test works --- lib/behavior/gen_observable.ex | 24 +++++++++++++++++++++++- lib/subject.1.ex | 11 +++++++++++ test/unsubscribe_test.exs | 28 ++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 lib/subject.1.ex create mode 100644 test/unsubscribe_test.exs diff --git a/lib/behavior/gen_observable.ex b/lib/behavior/gen_observable.ex index 78620f5..7c75f27 100644 --- a/lib/behavior/gen_observable.ex +++ b/lib/behavior/gen_observable.ex @@ -186,6 +186,20 @@ defmodule Observables.GenObservable do {:noreply, state} end + def handle_cast(:unsubscribe, state) do + # First notify all our dependees that we no longer want their data. + # This has as a side effect qwe no longer listen to them as well. + state.listeningto + |> Enum.map(fn producer -> + stop_send_to(producer, self()) + end) + + # Now it should be safe to stop. + GenObservable.stop(self()) + + {:noreply, state} + end + def handle_info({:event, value}, state) do cast(self(), {:event, value}) {:noreply, state} @@ -235,7 +249,15 @@ defmodule Observables.GenObservable do Makes an observable stop and gracefully shut down. """ def stop(producer, reason \\ :normal) do - cast(producer, {:stop, reason}) + #cast(producer, {:stop, reason}) + cast(producer, :stop) + end + + @doc """ + Unsubscribes ourself from all our dependencies. + """ + def unsubscribe(producer) do + cast(producer, :unsubscribe) end ########### diff --git a/lib/subject.1.ex b/lib/subject.1.ex new file mode 100644 index 0000000..eecab1c --- /dev/null +++ b/lib/subject.1.ex @@ -0,0 +1,11 @@ +defmodule Observables.Observable do + alias Observables.GenObservable + + @moduledoc """ + WRITE ME PLEASE KIND SIR + """ + + def unsubscribe() do + GenObservable.unsubscribe(self()) + end +end diff --git a/test/unsubscribe_test.exs b/test/unsubscribe_test.exs new file mode 100644 index 0000000..378cb44 --- /dev/null +++ b/test/unsubscribe_test.exs @@ -0,0 +1,28 @@ +defmodule UnsubscribeTest do + use ExUnit.Case + alias Observables.{Obs} + require Logger + + @tag :unsubscribe + test "ubsubscribe" do + Code.load_file("test/util.ex") + + testproc = self() + + Obs.range(1, :infinity, 500) + |> Obs.map(fn v -> + if v > 5 do + Observables.Observable.unsubscribe() + else + send(testproc, v) + end + end) + + Test.Util.sleep(2000) + + 1..5 + |> Enum.map(fn v -> + assert_receive(^v, 5000, "did not get this message #{v}") + end) + end +end