﻿/*
 * 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.EntityFramework.Tests
{
    using System;
    using Apache.Ignite.Core;
    using Apache.Ignite.Core.Cache.Configuration;
    using Apache.Ignite.Core.Common;
    using Apache.Ignite.Core.Tests;
    using Apache.Ignite.EntityFramework;
    using NUnit.Framework;

    /// <summary>
    /// Tests the EF cache provider.
    /// </summary>
    public class EntityFrameworkCacheInitializationTest
    {
        /// <summary>
        /// Fixture tear down.
        /// </summary>
        [TestFixtureTearDown]
        public void TestFixtureTearDown()
        {
            Ignition.StopAll(true);
        }

        /// <summary>
        /// Tests the IgniteDbConfiguration.
        /// </summary>
        [Test]
        public void TestConfigurationAndStartup()
        {
            using (EnvVar.Set("IGNITE_NATIVE_TEST_CLASSPATH", bool.TrueString))
            {
                Assert.IsNull(Ignition.TryGetIgnite());

                // Test default config (picks up app.config section).
                CheckCacheAndStop("myGrid1", IgniteDbConfiguration.DefaultCacheNamePrefix, new IgniteDbConfiguration());

                // Specific config section.
                CheckCacheAndStop("myGrid2", "cacheName2",
                    new IgniteDbConfiguration("igniteConfiguration2", "cacheName2", null));

                // Specific config section, nonexistent cache.
                CheckCacheAndStop("myGrid2", "newCache",
                    new IgniteDbConfiguration("igniteConfiguration2", "newCache", null));

                // In-code configuration.
                CheckCacheAndStop("myGrid3", "myCache",
                    new IgniteDbConfiguration(new IgniteConfiguration(TestUtils.GetTestConfiguration())
                        {
                            IgniteInstanceName = "myGrid3"
                        }, new CacheConfiguration("myCache_metadata")
                        {
                            CacheMode = CacheMode.Replicated,
                            AtomicityMode = CacheAtomicityMode.Transactional
                        },
                        new CacheConfiguration("myCache_data") {CacheMode = CacheMode.Replicated}, null),
                    CacheMode.Replicated);

                // Existing instance.
                var ignite = Ignition.Start(TestUtils.GetTestConfiguration());
                CheckCacheAndStop(null, "123", new IgniteDbConfiguration(ignite,
                    new CacheConfiguration("123_metadata")
                    {
                        Backups = 1,
                        AtomicityMode = CacheAtomicityMode.Transactional
                    },
                    new CacheConfiguration("123_data"), null));

                // Non-tx meta cache.
                var ex = Assert.Throws<IgniteException>(() => CheckCacheAndStop(null, "123",
                    new IgniteDbConfiguration(TestUtils.GetTestConfiguration(),
                        new CacheConfiguration("123_metadata"),
                        new CacheConfiguration("123_data"), null)));

                Assert.AreEqual("EntityFramework meta cache should be Transactional.", ex.Message);

                // Same cache names.
                var ex2 = Assert.Throws<ArgumentException>(() => CheckCacheAndStop(null, "abc",
                    new IgniteDbConfiguration(TestUtils.GetTestConfiguration(),
                        new CacheConfiguration("abc"),
                        new CacheConfiguration("abc"), null)));

                Assert.IsTrue(ex2.Message.Contains("Meta and Data cache can't have the same name."));
            }
        }

        /// <summary>
        /// Checks that specified cache exists and stops all Ignite instances.
        /// </summary>
        // ReSharper disable once UnusedParameter.Local
        // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local
        private static void CheckCacheAndStop(string gridName, string cacheName, IgniteDbConfiguration cfg,
            CacheMode cacheMode = CacheMode.Partitioned)
        {
            try
            {
                Assert.IsNotNull(cfg);

                var ignite = Ignition.TryGetIgnite(gridName);
                Assert.IsNotNull(ignite);

                var metaCache = ignite.GetCache<object, object>(cacheName + "_metadata");
                Assert.IsNotNull(metaCache);
                Assert.AreEqual(cacheMode, metaCache.GetConfiguration().CacheMode);

                if (cacheMode == CacheMode.Partitioned)
                    Assert.AreEqual(1, metaCache.GetConfiguration().Backups);

                var dataCache = ignite.GetCache<object, object>(cacheName + "_data");
                Assert.IsNotNull(dataCache);
                Assert.AreEqual(cacheMode, dataCache.GetConfiguration().CacheMode);

                if (cacheMode == CacheMode.Partitioned)
                    Assert.AreEqual(0, dataCache.GetConfiguration().Backups);
            }
            finally
            {
                Ignition.StopAll(true);
            }
        }
    }
}
