public void TestSubscriptionCommon <T>(Action <T> userCallback, Action <T> connectCallback,
                                               Action <T> wildcardPresenceCallback, Action <T> disconnectCallback)
        {
            Subscription.Instance.CleanUp();
            //Add CE with ch cg, ch-pres, cgpres, 2 awaiting connect callback with userstate
            List <ChannelEntity> channelEntities = Common.CreateListOfChannelEntities <T>(true, true, true, true,
                                                                                          userCallback, connectCallback,
                                                                                          wildcardPresenceCallback,
                                                                                          disconnectCallback
                                                                                          );

            Subscription.Instance.Add(channelEntities);

            // Test All
            RunAssertions("{\"ch1\":{\"k\":\"v\",\"k2\":\"v2\"},\"ch2\":{\"k3\":\"v3\",\"k4\":\"v4\"},\"ch2-pnpres\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"ch7\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"cg1\":{\"k5\":\"v5\",\"k6\":\"v6\"},\"cg2\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"cg2-pnpres\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"cg8\":{\"k7\":\"v7\",\"k8\":\"v8\"}}",
                          false, true, true, true, true, 4, 4,
                          new string[] { "cg1", "cg2", "cg2-pnpres", "cg8" },
                          new string[] { "ch1", "ch2", "ch2-pnpres", "ch7" },
                          new string[] { "ch1", "ch2", "ch7", "cg1", "cg2", "cg8" },
                          new string[] { "cg2-pnpres", "ch2-pnpres" },
                          new string[] { "ch7", "cg8" },
                          new string[] { "ch1", "ch2", "ch2-pnpres", "ch7", "cg1", "cg2", "cg2-pnpres", "cg8" });


            // Delete 2
            ChannelEntity ce = Helpers.CreateChannelEntity("ch2", false, false, null, userCallback,
                                                           connectCallback, Common.ErrorCallback, disconnectCallback, wildcardPresenceCallback
                                                           );

            Subscription.Instance.Delete(ce);
            ChannelEntity ce2 = Helpers.CreateChannelEntity("cg2", false, true, null, userCallback,
                                                            connectCallback, Common.ErrorCallback, disconnectCallback, wildcardPresenceCallback
                                                            );

            Subscription.Instance.Delete(ce2);

            // Test All
            RunAssertions("{\"ch1\":{\"k\":\"v\",\"k2\":\"v2\"},\"ch2-pnpres\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"ch7\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"cg1\":{\"k5\":\"v5\",\"k6\":\"v6\"},\"cg2-pnpres\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"cg8\":{\"k7\":\"v7\",\"k8\":\"v8\"}}",
                          false, true, true, true, true, 3, 3,
                          new string[] { "cg1", "cg2-pnpres", "cg8" },
                          new string[] { "ch1", "ch2-pnpres", "ch7" },
                          new string[] { "ch1", "ch7", "cg1", "cg8" },
                          new string[] { "cg2-pnpres", "ch2-pnpres" },
                          new string[] { "ch7", "cg8" },
                          new string[] { "ch1", "ch2-pnpres", "ch7", "cg1", "cg2-pnpres", "cg8" });


            // UpdateOrAddUserStateOfEntity
            ChannelEntity ce3 = Helpers.CreateChannelEntity("ch1", false, false, null, userCallback,
                                                            connectCallback, Common.ErrorCallback, disconnectCallback, wildcardPresenceCallback
                                                            );
            var dictSMN = new Dictionary <string, object>();

            dictSMN.Add("k", "v9");

            Subscription.Instance.UpdateOrAddUserStateOfEntity(ref ce3, dictSMN, true);

            // Test All
            RunAssertions("{\"ch1\":{\"k\":\"v9\",\"k2\":\"v2\"},\"ch2-pnpres\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"ch7\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"cg1\":{\"k5\":\"v5\",\"k6\":\"v6\"},\"cg2-pnpres\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"cg8\":{\"k7\":\"v7\",\"k8\":\"v8\"}}",
                          false, true, true, true, true, 3, 3,
                          new string[] { "cg1", "cg2-pnpres", "cg8" },
                          new string[] { "ch1", "ch2-pnpres", "ch7" },
                          new string[] { "ch1", "ch7", "cg1", "cg8" },
                          new string[] { "cg2-pnpres", "ch2-pnpres" },
                          new string[] { "ch7", "cg8" },
                          new string[] { "ch1", "ch2-pnpres", "ch7", "cg1", "cg2-pnpres", "cg8" });

            // UpdateIsAwaitingConnectCallbacksOfEntity
            ChannelEntity ce4 = Helpers.CreateChannelEntity("ch7", false, false, null, userCallback,
                                                            connectCallback, Common.ErrorCallback, disconnectCallback, wildcardPresenceCallback
                                                            );
            ChannelEntity ce5 = Helpers.CreateChannelEntity("cg8", false, true, null, userCallback,
                                                            connectCallback, Common.ErrorCallback, disconnectCallback, wildcardPresenceCallback
                                                            );

            List <ChannelEntity> lstCE = new List <ChannelEntity>();

            lstCE.Add(ce4);
            lstCE.Add(ce5);

            Subscription.Instance.UpdateIsAwaitingConnectCallbacksOfEntity(lstCE, false);

            // Test All
            RunAssertions("{\"ch1\":{\"k\":\"v9\",\"k2\":\"v2\"},\"ch2-pnpres\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"ch7\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"cg1\":{\"k5\":\"v5\",\"k6\":\"v6\"},\"cg2-pnpres\":{\"k7\":\"v7\",\"k8\":\"v8\"},\"cg8\":{\"k7\":\"v7\",\"k8\":\"v8\"}}",
                          true, true, true, true, true, 3, 3,
                          new string[] { "cg1", "cg2-pnpres", "cg8" },
                          new string[] { "ch1", "ch2-pnpres", "ch7" },
                          new string[] { "ch1", "ch7", "cg1", "cg8" },
                          new string[] { "cg2-pnpres", "ch2-pnpres" },
                          new string[] { "ch7", "cg8" },
                          new string[] { "ch1", "ch2-pnpres", "ch7", "cg1", "cg2-pnpres", "cg8" });

            // CleanUp
            Subscription.Instance.CleanUp();

            // Test All

            RunAssertions(String.Empty,
                          false, false, false, false, false, 0, 0,
                          new string[] {},
                          new string[] {},
                          new string[] {},
                          new string[] {},
                          new string[] {},
                          new string[] {});
        }