blob: 137382e7b8ad76b6da88c58f0071ae9e5881eecd [file] [log] [blame]
/*
* 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.
*/
namespace Apache.Ignite.AspNet.Tests
{
using System;
using System.IO;
using System.Linq;
using Apache.Ignite.AspNet.Impl;
using Apache.Ignite.Core.Impl.Binary;
using Apache.Ignite.Core.Impl.Binary.IO;
using NUnit.Framework;
/// <summary>
/// Tests for <see cref="IgniteSessionStateItemCollection"/>.
/// </summary>
public class IgniteSessionStateItemCollectionTest
{
/// <summary>
/// Tests the empty collection.
/// </summary>
[Test]
public void TestEmpty()
{
var col1 = new IgniteSessionStateItemCollection();
var col2 = SerializeDeserialize(col1);
foreach (var col in new[] { col1, col2 })
{
Assert.IsFalse(col.Dirty);
Assert.IsFalse(col.IsSynchronized);
Assert.AreEqual(0, col.Count);
Assert.IsNotNull(col.SyncRoot);
Assert.IsEmpty(col);
Assert.IsEmpty(col.OfType<string>().ToArray());
Assert.IsEmpty(col.Keys);
Assert.IsNotNull(col.SyncRoot);
Assert.IsNull(col["key"]);
Assert.Throws<ArgumentOutOfRangeException>(() => col[0] = "x");
Assert.Throws<ArgumentOutOfRangeException>(() => Assert.AreEqual(0, col[0]));
Assert.Throws<ArgumentOutOfRangeException>(() => col.RemoveAt(0));
col.Clear();
col.Remove("test");
Assert.AreEqual(0, col.Count);
col.Dirty = true;
Assert.IsTrue(col.Dirty);
}
}
/// <summary>
/// Tests the modification.
/// </summary>
[Test]
public void TestModification()
{
var col = new IgniteSessionStateItemCollection();
// Populate and check.
col["key"] = "val";
col["1"] = 1;
Assert.AreEqual("val", col["key"]);
Assert.AreEqual(1, col["1"]);
Assert.AreEqual(2, col.Count);
Assert.IsTrue(col.Dirty);
CollectionAssert.AreEquivalent(new[] {"key", "1"}, col);
CollectionAssert.AreEquivalent(new[] {"key", "1"}, col.Keys);
// Modify using index.
col[0] = "val1";
col[1] = 2;
Assert.AreEqual("val1", col["key"]);
Assert.AreEqual(2, col["1"]);
// Modify using key.
col["1"] = 3;
col["key"] = "val2";
Assert.AreEqual("val2", col["key"]);
Assert.AreEqual(3, col["1"]);
// CopyTo.
var keys = new string[5];
col.CopyTo(keys, 2);
Assert.AreEqual(new[] {null, null, "key", "1", null}, keys);
// Remove.
col["2"] = 2;
col["3"] = 3;
col.Remove("invalid");
Assert.AreEqual(4, col.Count);
col.Remove("1");
Assert.AreEqual(new[] { "key", "2", "3" }, col.OfType<string>());
Assert.AreEqual(null, col["1"]);
Assert.AreEqual("val2", col["key"]);
Assert.AreEqual("val2", col[0]);
Assert.AreEqual(2, col["2"]);
Assert.AreEqual(2, col[1]);
Assert.AreEqual(3, col["3"]);
Assert.AreEqual(3, col[2]);
// RemoveAt.
col.RemoveAt(0);
Assert.AreEqual(new[] { "2", "3" }, col.OfType<string>());
// Clear.
Assert.AreEqual(2, col.Count);
col.Clear();
Assert.AreEqual(0, col.Count);
// Set dirty.
var col1 = new IgniteSessionStateItemCollection {Dirty = true};
Assert.IsTrue(col1.Dirty);
}
/// <summary>
/// Tests dirty tracking.
/// </summary>
[Test]
public void TestApplyChanges()
{
Func<IgniteSessionStateItemCollection> getCol = () =>
{
var res = new IgniteSessionStateItemCollection();
res["1"] = 1;
res["2"] = 2;
res["3"] = 3;
return res;
};
var col = getCol();
var col0 = SerializeDeserialize(col);
Assert.AreEqual(3, col0.Count);
col0.Remove("1");
col0["2"] = 22;
col0["4"] = 44;
// Apply non-serialized changes.
col.ApplyChanges(col0);
Assert.AreEqual(3, col.Count);
Assert.AreEqual(null, col["1"]);
Assert.AreEqual(22, col["2"]);
Assert.AreEqual(3, col["3"]);
Assert.AreEqual(44, col["4"]);
// Apply serialized changes without WriteChangesOnly.
col = getCol();
col.ApplyChanges(SerializeDeserialize(col0));
Assert.AreEqual(3, col.Count);
Assert.AreEqual(null, col["1"]);
Assert.AreEqual(22, col["2"]);
Assert.AreEqual(3, col["3"]);
Assert.AreEqual(44, col["4"]);
// Apply serialized changes with WriteChangesOnly.
col = getCol();
col.ApplyChanges(SerializeDeserialize(col0, true));
Assert.AreEqual(3, col.Count);
Assert.AreEqual(null, col["1"]);
Assert.AreEqual(22, col["2"]);
Assert.AreEqual(3, col["3"]);
Assert.AreEqual(44, col["4"]);
// Remove key then add back.
col0.Remove("2");
col0.Remove("3");
col0["2"] = 222;
col = getCol();
col.ApplyChanges(SerializeDeserialize(col0));
Assert.AreEqual(2, col.Count);
Assert.AreEqual(222, col["2"]);
Assert.AreEqual(44, col["4"]);
// Remove all.
col0 = SerializeDeserialize(getCol());
col0.Clear();
col = getCol();
col.ApplyChanges(SerializeDeserialize(col0, true));
Assert.AreEqual(0, col.Count);
// Add to empty.
col0["-1"] = -1;
col0["-2"] = -2;
col = getCol();
col.ApplyChanges(SerializeDeserialize(col0));
Assert.AreEqual(2, col.Count);
Assert.AreEqual(-1, col0["-1"]);
Assert.AreEqual(-2, col0["-2"]);
// Remove initial key, then add it back, then remove again.
col0 = SerializeDeserialize(getCol());
col0.Remove("1");
col0.Remove("2");
col0["1"] = "111";
col0.Remove("1");
col = getCol();
col.ApplyChanges(SerializeDeserialize(col0, true));
Assert.AreEqual(1, col.Count);
Assert.AreEqual(3, col["3"]);
}
/// <summary>
/// Serializes and deserializes back an instance.
/// </summary>
private static IgniteSessionStateItemCollection SerializeDeserialize(IgniteSessionStateItemCollection data,
bool changesOnly = false)
{
var marsh = BinaryUtils.Marshaller;
using (var stream = new BinaryHeapStream(128))
{
var writer = marsh.StartMarshal(stream);
data.WriteBinary(writer.GetRawWriter(), changesOnly);
stream.Seek(0, SeekOrigin.Begin);
return new IgniteSessionStateItemCollection(marsh.StartUnmarshal(stream));
}
}
}
}