public async Task GetAllUserIds() { using (var manager1 = CreateNewHubLifetimeManager <MyHub>()) using (var manager2 = CreateNewHubLifetimeManager <MyHub>()) using (var client1 = new TestClient(userIdentifier: "userA")) using (var client2 = new TestClient(userIdentifier: "userA")) using (var client3 = new TestClient(userIdentifier: "userB")) { var userPartitioner = new DefaultClientSetPartitioner <IUserPartitionGrain>(); var connection1 = HubConnectionContextUtils.Create(client1.Connection); var connection2 = HubConnectionContextUtils.Create(client2.Connection); var connection3 = HubConnectionContextUtils.Create(client3.Connection); await manager1.OnConnectedAsync(connection1).OrTimeout(); await manager1.OnConnectedAsync(connection3).OrTimeout(); await manager2.OnConnectedAsync(connection2).OrTimeout(); await manager2.OnDisconnectedAsync(connection2).OrTimeout(); var result1 = await userPartitioner.GetAllClientSetIdsAsync(_fixture.TestCluster.Client, typeof(MyHub).GUID).OrTimeout(); Assert.Equal(2, result1.Count()); await manager1.OnDisconnectedAsync(connection3).OrTimeout(); var result2 = await userPartitioner.GetAllClientSetIdsAsync(_fixture.TestCluster.Client, typeof(MyHub).GUID).OrTimeout(); Assert.Single(result2); } }
public OrleansHubLifetimeManager <THub> CreateNewHubLifetimeManager <THub>() where THub : Hub { var groupPartitioner = new DefaultClientSetPartitioner <IGroupPartitionGrain>(); var userPartitioner = new DefaultClientSetPartitioner <IUserPartitionGrain>(); var options = new OrleansOptions <THub> { ClusterClient = _fixture.TestCluster.Client }; return(new OrleansHubLifetimeManager <THub>(Options.Create(options), groupPartitioner, userPartitioner, new DefaultUserIdProvider(), NullLogger <OrleansHubLifetimeManager <THub> > .Instance)); }
public async Task GetAllGroupNames() { using (var manager1 = CreateNewHubLifetimeManager <MyHub>()) using (var manager2 = CreateNewHubLifetimeManager <MyHub>()) using (var client1 = new TestClient()) using (var client2 = new TestClient()) using (var client3 = new TestClient()) { var groupPartitioner = new DefaultClientSetPartitioner <IGroupPartitionGrain>(); var connection1 = HubConnectionContextUtils.Create(client1.Connection); var connection2 = HubConnectionContextUtils.Create(client2.Connection); var connection3 = HubConnectionContextUtils.Create(client2.Connection); await manager2.OnConnectedAsync(connection1).OrTimeout(); await manager2.OnConnectedAsync(connection2).OrTimeout(); await manager1.OnConnectedAsync(connection3).OrTimeout(); await manager1.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout(); await manager1.AddToGroupAsync(connection2.ConnectionId, "group").OrTimeout(); await manager2.AddToGroupAsync(connection3.ConnectionId, "group2").OrTimeout(); var result = await groupPartitioner.GetAllClientSetIdsAsync(_fixture.TestCluster.Client, typeof(MyHub).GUID).OrTimeout(); Assert.Equal(2, result.Count()); await manager1.OnDisconnectedAsync(connection2).OrTimeout(); // TODO //var result1 = await groupPartitioner.GetClientSetIds(_fixture.TestCluster.Client).OrTimeout(); //Assert.Equal(2, result1.Count()); await manager2.OnDisconnectedAsync(connection3).OrTimeout(); var result2 = await groupPartitioner.GetAllClientSetIdsAsync(_fixture.TestCluster.Client, typeof(MyHub).GUID).OrTimeout(); Assert.Single(result2); } }
protected override Task ExecuteAsync(CancellationToken stoppingToken) { stoppingToken.Register(async() => { foreach (var item in clientDisposables.Values) { item.Dispose(); } foreach (var item in testClients.Values) { item.Abort(); } foreach (var item in managers.Values) { item.Dispose(); } await _testCluster.Client.Close(); _logger.LogInformation(2, "stopped."); }); Observable.FromAsync(() => Console.In.ReadLineAsync()) .Repeat() .Where(value => !string.IsNullOrEmpty(value)) .Select(value => value.Split(' ')) .SubscribeOn(TaskPoolScheduler.Default) .Subscribe(async(string[] value) => { await Task.CompletedTask; try { switch (value[0]) { case "m": { var managerId = value[1]; var groupPartitioner = new DefaultClientSetPartitioner <IGroupPartitionGrain>(); var userPartitioner = new DefaultClientSetPartitioner <IUserPartitionGrain>(); managers[managerId] = new OrleansHubLifetimeManager <SampleHub>(Options.Create(new OrleansOptions <SampleHub> { ClusterClient = _testCluster.Client }), groupPartitioner, userPartitioner, new DefaultUserIdProvider(), _loggerFactory.CreateLogger <OrleansHubLifetimeManager <SampleHub> >()); groupPartitioners[managerId] = groupPartitioner; userPartitioners[managerId] = userPartitioner; } break; case "dm": { var managerId = value[1]; managers[managerId].Dispose(); } break; case "sa": { var managerId = value[1]; await managers[managerId].SendAllAsync("Hello", new object[] { "World" }); } break; case "sg": { var managerId = value[1]; var groupName = value[2]; await managers[managerId].SendGroupAsync(groupName, "Hello", new object[] { "World" }); } break; case "atg": { var managerId = value[1]; var connectionId = value[2]; var groupName = value[3]; await managers[managerId].AddToGroupAsync(testClients[connectionId].ConnectionId, groupName); } break; case "rfg": { var managerId = value[1]; var connectionId = value[2]; var groupName = value[3]; await managers[managerId].RemoveFromGroupAsync(testClients[connectionId].ConnectionId, groupName); } break; case "c": { var managerId = value[1]; var connectionId = value[2]; var userId = value[3]; var client = new TestClient(userIdentifier: userId); var connection = HubConnectionContextUtils.Create(client.Connection); testClients[connectionId] = connection; await managers[managerId].OnConnectedAsync(connection); var disposable = Observable.Repeat(Observable.FromAsync(() => client.ReadAsync())) .ObserveOn(TaskPoolScheduler.Default) .Subscribe(message => { var _message = message as InvocationMessage; _logger.LogInformation($"Method {_message.Target}, Args {JsonConvert.SerializeObject(_message.Arguments)}"); }); clientDisposables[connectionId] = disposable; } break; case "ga": { var managerId = value[1]; var result2 = await groupPartitioners[managerId].GetAllClientSetIdsAsync(_testCluster.Client, typeof(SampleHub).GUID); var result3 = await userPartitioners[managerId].GetAllClientSetIdsAsync(_testCluster.Client, typeof(SampleHub).GUID); _logger.LogInformation($"GroupNames: {JsonConvert.SerializeObject(result2)}, " + $"UserIds: {JsonConvert.SerializeObject(result3)}"); } break; case "dc": { var managerId = value[1]; var connectionId = value[2]; await managers[managerId].OnDisconnectedAsync(testClients[connectionId]); } break; //case "sr": // { // var range = RangeFactory.CreateRange(uint.Parse(value[1]), uint.Parse(value[2])); // var subRanges = RangeFactory.GetSubRanges(range); // _logger.LogInformation($"subRanges: {JsonConvert.SerializeObject(subRanges)}"); // //var id = Utils.CalculateIdHash(value[1]); // //_logger.LogInformation($"id: {id}"); // } // break; //case "ifr": // { // var fullRange = RangeFactory.CreateFullRange(); // _logger.LogInformation($"{value[1]} in full range: {fullRange.InRange(uint.Parse(value[1]))}"); // } // break; //case "ir": // { // var range = RangeFactory.CreateRange(uint.Parse(value[1]), uint.Parse(value[2])); // _logger.LogInformation($"{value[3]} in range: {range.InRange(uint.Parse(value[3]))}"); // } // break; default: break; } } catch (Exception e) { _logger.LogError(e, "Exception onNext."); } }, error => _logger.LogError(error, "OnError."), () => _logger.LogInformation("OnCompleted.")); return(Task.CompletedTask); }