blob: 09009c0a60cad81fcc5af02a7b064a8029caed0c [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
using OpenDAL.Layer;
namespace OpenDAL.Tests;
public class LayerTest
{
[Fact]
public void WithConcurrentLimit_ReturnsNewOperator()
{
using var op = new Operator("memory");
var before = op.Op;
using var layered = op.WithLayer(new ConcurrentLimitLayer(4));
Assert.NotEqual(IntPtr.Zero, layered.Op);
Assert.NotSame(op, layered);
Assert.Equal(before, op.Op);
Assert.NotEqual(before, layered.Op);
layered.Write("layer-concurrent", [1, 2, 3]);
var value = layered.Read("layer-concurrent");
Assert.Equal([1, 2, 3], value);
}
[Fact]
public void WithRetry_ReturnsNewOperator()
{
using var op = new Operator("memory");
var before = op.Op;
using var layered = op.WithLayer(new RetryLayer
{
Jitter = false,
Factor = 2,
MinDelay = TimeSpan.FromMilliseconds(1),
MaxDelay = TimeSpan.FromMilliseconds(10),
MaxTimes = 2,
});
Assert.NotEqual(IntPtr.Zero, layered.Op);
Assert.NotSame(op, layered);
Assert.Equal(before, op.Op);
Assert.NotEqual(before, layered.Op);
layered.Write("layer-retry", [4, 5, 6]);
var value = layered.Read("layer-retry");
Assert.Equal([4, 5, 6], value);
}
[Fact]
public void WithConcurrentLimit_ZeroPermits_ThrowsArgumentOutOfRangeException()
{
using var op = new Operator("memory");
Assert.Throws<ArgumentOutOfRangeException>(() => op.WithLayer(new ConcurrentLimitLayer(0)));
}
[Fact]
public void WithRetry_InvalidFactor_ThrowsArgumentOutOfRangeException()
{
using var op = new Operator("memory");
Assert.Throws<ArgumentOutOfRangeException>(() => op.WithLayer(new RetryLayer
{
Factor = 0,
}));
}
[Fact]
public void WithTimeout_ReturnsNewOperator()
{
using var op = new Operator("memory");
var before = op.Op;
using var layered = op.WithLayer(new TimeoutLayer
{
Timeout = TimeSpan.FromSeconds(5),
IoTimeout = TimeSpan.FromSeconds(2),
});
Assert.NotEqual(IntPtr.Zero, layered.Op);
Assert.NotSame(op, layered);
Assert.Equal(before, op.Op);
Assert.NotEqual(before, layered.Op);
layered.Write("layer-timeout", [7, 8, 9]);
var value = layered.Read("layer-timeout");
Assert.Equal([7, 8, 9], value);
}
[Fact]
public void WithTimeout_ZeroTimeout_ThrowsArgumentOutOfRangeException()
{
using var op = new Operator("memory");
Assert.Throws<ArgumentOutOfRangeException>(() => op.WithLayer(new TimeoutLayer
{
Timeout = TimeSpan.Zero,
}));
}
[Fact]
public void WithLayer_OperatorsCanBeDisposedIndependently()
{
var op = new Operator("memory");
var layered = op.WithLayer(new ConcurrentLimitLayer(2));
layered.Dispose();
op.Write("layer-dispose-origin", [1, 1, 1]);
var originalValue = op.Read("layer-dispose-origin");
Assert.Equal([1, 1, 1], originalValue);
op.Dispose();
var op2 = new Operator("memory");
var layered2 = op2.WithLayer(new ConcurrentLimitLayer(2));
op2.Dispose();
layered2.Write("layer-dispose-layered", [2, 2, 2]);
var layeredValue = layered2.Read("layer-dispose-layered");
Assert.Equal([2, 2, 2], layeredValue);
layered2.Dispose();
}
}