Beispiel #1
0
    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);
    }
Beispiel #2
0
    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);
    }
Beispiel #4
0
    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));
    }
Beispiel #6
0
    public void ThrowsIfGetOrAddFactoryIsNull()
    {
        var tc    = new MultiTenantContext();
        var tca   = new TestMultiTenantContextAccessor(tc);
        var cache = new MultiTenantOptionsCache <CookieAuthenticationOptions>(tca);

        Assert.Throws <ArgumentNullException>(() => cache.GetOrAdd("", null));
    }
Beispiel #7
0
    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);
    }
Beispiel #10
0
    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 ?? ""));
    }
Beispiel #11
0
    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);
    }
Beispiel #13
0
    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);
    }
Beispiel #14
0
    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);
    }