public void GetOrAddNamedOptionForCurrentTenantOnly(string name) { var ti = new TenantInfo("test-id-123", null, null, null, null); var tc = new MultiTenantContext(); tc.TenantInfo = ti; var tca = new TestMultiTenantContextAccessor(tc); var cache = new MultiTenantOptionsCache <CookieAuthenticationOptions>(tca); var options = new CookieAuthenticationOptions(); options.Cookie.Name = "a_name"; var options2 = new CookieAuthenticationOptions(); options2.Cookie.Name = "diff_name"; // Add new options. var result = cache.GetOrAdd(name, () => options); Assert.Same(options, result); // Get the existing options if exists. result = cache.GetOrAdd(name, () => options2); Assert.NotSame(options2, result); // Confirm different tenant on same object is an add (ie it didn't exist there). ti.Id = "diff_id"; result = cache.GetOrAdd(name, () => options2); Assert.Same(options2, result); }
public void AddNamedOptionsForCurrentTenantOnlyOnAdd(string name) { var ti = new TenantInfo("test-id-123", null, null, null, null); var tc = new MultiTenantContext(); tc.TenantInfo = ti; var tca = new TestMultiTenantContextAccessor(tc); var cache = new MultiTenantOptionsCache <CookieAuthenticationOptions>(tca); var options = new CookieAuthenticationOptions(); // Add new options. var result = cache.TryAdd(name, options); Assert.True(result); // Fail adding options under same name. result = cache.TryAdd(name, options); Assert.False(result); // Change the tenant id and confirm options can be added again. ti.Id = "diff_id"; result = cache.TryAdd(name, options); Assert.True(result); }
public void AdjustOptionsNameOnGetOrAdd(string name) { var ti = new TenantInfo("test-id-123", null, null, null, null); var tc = new MultiTenantContext(); tc.TenantInfo = ti; var tca = new TestMultiTenantContextAccessor(tc); var cache = new MultiTenantOptionsCache <CookieAuthenticationOptions>(tca); var options = new CookieAuthenticationOptions(); options.Cookie.Name = "a_name"; var options2 = new CookieAuthenticationOptions(); options2.Cookie.Name = "diff_name"; // Add new options. var result = cache.GetOrAdd(name, () => options); Assert.Equal(options.Cookie.Name, result.Cookie.Name); // Get the existing object. result = cache.GetOrAdd(name, () => options2); Assert.NotEqual(options2.Cookie.Name, result.Cookie.Name); // Confirm different tenant on same object is an add. ti.Id = "diff_id"; result = cache.GetOrAdd(name, () => options2); Assert.Equal(options2.Cookie.Name, result.Cookie.Name); }
public void ThrowIfContructorParamIsNull() { var tc = new MultiTenantContext(); var tca = new TestMultiTenantContextAccessor(tc); Assert.Throws <ArgumentNullException>(() => new MultiTenantOptionsCache <CookieAuthenticationOptions>(null)); }
public void RemoveOptionsForAllTenants(string name) { var ti = new TenantInfo("test-id-123", null, null, null, null); var tc = new MultiTenantContext(); tc.TenantInfo = ti; var tca = new TestMultiTenantContextAccessor(tc); var cache = new MultiTenantOptionsCache <CookieAuthenticationOptions>(tca); var options = new CookieAuthenticationOptions(); // Add new options. var result = cache.TryAdd(name, options); Assert.True(result); // Add under a different tenant. ti.Id = "diff_id"; result = cache.TryAdd(name, options); Assert.True(result); // Remove all options and assert empty. result = cache.TryRemove(name); Assert.True(result); Assert.Empty((IEnumerable)cache.GetType().BaseType. GetField("_cache", BindingFlags.NonPublic | BindingFlags.Instance). GetValue(cache)); }
public void ThrowsIfGetOrAddFactoryIsNull() { var tc = new MultiTenantContext(); var tca = new TestMultiTenantContextAccessor(tc); var cache = new MultiTenantOptionsCache <CookieAuthenticationOptions>(tca); Assert.Throws <ArgumentNullException>(() => cache.GetOrAdd("", null)); }
public void HandleNullMultiTenantContextOnGetOrAdd() { var tca = new TestMultiTenantContextAccessor(null); var cache = new MultiTenantOptionsCache <CookieAuthenticationOptions>(tca); var options = new CookieAuthenticationOptions(); // Add new options, ensure no exception caused by null MultiTenantContext. var result = cache.GetOrAdd("", () => options); Assert.NotNull(result); }
public void HandleNullMultiTenantContextOnAdd() { var tca = new TestMultiTenantContextAccessor(null); var cache = new MultiTenantOptionsCache <InMemoryStoreOptions>(tca); var options = new InMemoryStoreOptions(); // Add new options, ensure no exception caused by null MultiTenantContext. var result = cache.TryAdd("", options); Assert.True(result); }
public void HandleNullMultiTenantContextWhenAdjustedOptionsNameOnAdd() { var tca = new TestMultiTenantContextAccessor(null); var cache = new MultiTenantOptionsCache <CookieAuthenticationOptions>(tca); var options = new CookieAuthenticationOptions(); // Add new options, ensure no exception caused by null MultiTenantContext. var result = cache.TryAdd("", options); Assert.True(result); }
public void RemoveNamedOptionsForCurrentTenantOnly(string name) { var ti = new TenantInfo("test-id-123", null, null, null, null); var tc = new MultiTenantContext(); tc.TenantInfo = ti; var tca = new TestMultiTenantContextAccessor(tc); var cache = new MultiTenantOptionsCache <CookieAuthenticationOptions>(tca); var options = new CookieAuthenticationOptions(); // Add new options. var result = cache.TryAdd(name, options); Assert.True(result); // Add under a different tenant. ti.Id = "diff_id"; result = cache.TryAdd(name, options); Assert.True(result); result = cache.TryAdd("diffname", options); Assert.True(result); // Remove named options for current tenant. result = cache.TryRemove(name); Assert.True(result); var tenantCache = (ConcurrentDictionary <string, IOptionsMonitorCache <CookieAuthenticationOptions> >)cache.GetType(). GetField("map", BindingFlags.NonPublic | BindingFlags.Instance). GetValue(cache); dynamic tenantInternalCache = tenantCache[ti.Id].GetType().GetField("_cache", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(tenantCache[ti.Id]); // Assert named options removed and other options on tenant left as-is. Assert.False(tenantInternalCache.Keys.Contains(name ?? "")); Assert.True(tenantInternalCache.Keys.Contains("diffname")); // Assert other tenant not affected. ti.Id = "test-id-123"; tenantInternalCache = tenantCache[ti.Id].GetType().GetField("_cache", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(tenantCache[ti.Id]); Assert.True(tenantInternalCache.ContainsKey(name ?? "")); }
public void IgnoreNullMultiTenantContext() { var tca = new TestMultiTenantContextAccessor(null); var services = new ServiceCollection(); services.AddTransient <IMultiTenantContextAccessor>(_sp => tca); services.Configure <InMemoryStoreOptions>(o => o.DefaultConnectionString = "begin"); services.PostConfigure <InMemoryStoreOptions>(o => o.DefaultConnectionString += "end"); var sp = services.BuildServiceProvider(); Action <InMemoryStoreOptions, TenantInfo> tenantConfig = (o, _ti) => o.DefaultConnectionString += $"_{_ti.Id}_"; var factory = ActivatorUtilities. CreateInstance <MultiTenantOptionsFactory <InMemoryStoreOptions> >(sp, new [] { tenantConfig }); var options = factory.Create(""); Assert.Equal($"beginend", options.DefaultConnectionString); }
public void IgnoreNullTenantInfo() { var tca = new TestMultiTenantContextAccessor(new MultiTenantContext()); var services = new ServiceCollection(); services.AddTransient <IMultiTenantContextAccessor>(_sp => tca); services.Configure <CookieAuthenticationOptions>(o => o.Cookie.Name = "begin"); services.PostConfigure <CookieAuthenticationOptions>(o => o.Cookie.Name += "end"); var sp = services.BuildServiceProvider(); Action <CookieAuthenticationOptions, TenantInfo> tenantConfig = (o, _ti) => o.Cookie.Name += $"_{_ti.Id}_"; var factory = ActivatorUtilities. CreateInstance <MultiTenantOptionsFactory <CookieAuthenticationOptions> >(sp, new [] { tenantConfig }); var options = factory.Create(""); Assert.Equal($"beginend", options.Cookie.Name); }
public void ClearOptionsForCurrentTenantOnly() { var ti = new TenantInfo("test-id-123", null, null, null, null); var tc = new MultiTenantContext(); tc.TenantInfo = ti; var tca = new TestMultiTenantContextAccessor(tc); var cache = new MultiTenantOptionsCache <CookieAuthenticationOptions>(tca); var options = new CookieAuthenticationOptions(); // Add new options. var result = cache.TryAdd("", options); Assert.True(result); // Add under a different tenant. ti.Id = "diff_id"; result = cache.TryAdd("", options); Assert.True(result); // Clear options on first tenant. ti.Id = "test-id-123"; cache.Clear(); // Assert options cleared on this tenant. var tenantCache = (ConcurrentDictionary <string, IOptionsMonitorCache <CookieAuthenticationOptions> >)cache.GetType(). GetField("map", BindingFlags.NonPublic | BindingFlags.Instance). GetValue(cache); dynamic tenantInternalCache = tenantCache[ti.Id].GetType().GetField("_cache", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(tenantCache[ti.Id]); Assert.True(tenantInternalCache.IsEmpty); // Assert options still exist on other tenant. ti.Id = "diff_id"; tenantInternalCache = tenantCache[ti.Id].GetType().GetField("_cache", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(tenantCache[ti.Id]); Assert.False(tenantInternalCache.IsEmpty); }
public void CreateOptionsWithTenantAction(string name) { var ti = new TenantInfo("test-id-123", null, null, null, null); var tc = new MultiTenantContext(); tc.TenantInfo = ti; var tca = new TestMultiTenantContextAccessor(tc); var services = new ServiceCollection(); services.AddTransient <IMultiTenantContextAccessor>(_sp => tca); services.Configure <InMemoryStoreOptions>(name, o => o.DefaultConnectionString = $"{name}_begin"); services.PostConfigure <InMemoryStoreOptions>(name, o => o.DefaultConnectionString += "end"); var sp = services.BuildServiceProvider(); Action <InMemoryStoreOptions, TenantInfo> tenantConfig = (o, _ti) => o.DefaultConnectionString += $"_{_ti.Id}_"; var factory = ActivatorUtilities. CreateInstance <MultiTenantOptionsFactory <InMemoryStoreOptions> >(sp, new [] { tenantConfig }); var options = factory.Create(name); Assert.Equal($"{name}_begin_{ti.Id}_end", options.DefaultConnectionString); }