Skip to content

Instantly share code, notes, and snippets.

@pauldambra
Created November 8, 2016 11:09
Show Gist options
  • Select an option

  • Save pauldambra/aef5f2e6694c1dc4b41b2f02fee56412 to your computer and use it in GitHub Desktop.

Select an option

Save pauldambra/aef5f2e6694c1dc4b41b2f02fee56412 to your computer and use it in GitHub Desktop.

Revisions

  1. pauldambra created this gist Nov 8, 2016.
    141 changes: 141 additions & 0 deletions ElasticSearchIntegration.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,141 @@
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace NCrunch.Framework
    {
    public abstract class ResourceUsageAttribute : Attribute
    {
    private readonly string[] _resourceNames;

    public ResourceUsageAttribute(params string[] resourceName)
    {
    _resourceNames = resourceName;
    }

    public string[] ResourceNames
    {
    get { return _resourceNames; }
    }
    }

    public class ExclusivelyUsesAttribute : ResourceUsageAttribute
    {
    public ExclusivelyUsesAttribute(params string[] resourceName)
    : base(resourceName) { }
    }
    }

    namespace ElasticSearch.Integration.Tests
    {
    using System;
    using System.Diagnostics;
    using System.Net.Http;
    using System.Threading;
    using Newtonsoft.Json;
    using NUnit.Framework;

    [SetUpFixture]
    public class ElasticSearchIntegration : IDisposable
    {
    private Process _process;
    private static readonly HttpClient HttpClient = new HttpClient();

    private readonly string _elasticSearchDir = (Environment.GetEnvironmentVariable("ELASTIC_HOME") ?? @"C:\elasticsearch\elasticsearch-local-1.4.2").TrimEnd('\\');

    [SetUp]
    public void RunBeforeAnyTests()
    {
    string batchFile = string.Format(@"{0}\bin\elasticsearch.bat", _elasticSearchDir);

    try
    {
    _process = new Process
    {
    StartInfo =
    {
    FileName = batchFile,
    WindowStyle = ProcessWindowStyle.Hidden,
    RedirectStandardInput = true,
    UseShellExecute = false
    }
    };
    // Configure the process using the StartInfo properties.
    _process.Start();

    PingClusterTillGreen();
    }
    catch (Exception ex)
    {
    var m = string.Format("exception while loading elastic search from {0} :( --- {1}", batchFile, ex.Message);
    var wrappedException = new Exception(m, ex);
    throw wrappedException;
    }
    }

    public static void DeleteAllElasticData(string index = "_all")
    {
    //curl -XDELETE 'http://localhost:9200/_all' and wait
    HttpClient.DeleteAsync("http://localhost:9200/" + index).Wait();
    }

    private void PingClusterTillGreen()
    {
    var clusterGreen = false;
    var attempts = 0;
    while (!clusterGreen && attempts < 10)
    {
    Thread.Sleep(1000);

    string c = GetClusterStatus();
    Console.WriteLine(c);

    clusterGreen = JsonConvert.DeserializeObject<dynamic>(c)["status"] == "green";
    attempts++;
    }
    }

    private string GetClusterStatus()
    {
    try
    {
    var response = HttpClient.GetAsync("http://localhost:9200/_cluster/health?pretty=true").Result;
    var c = response.Content.ReadAsStringAsync().Result;
    return c;
    }
    catch (Exception)
    {
    //swallow
    return "{\"status\": \"red\"}";
    }
    }

    [TearDown]
    public void RunAfterAnyTests()
    {
    Debug.WriteLine("Running After Tests to dispose of Elastic Search");
    _process.StandardInput.WriteLine("\x3"); //send ctrl + c
    _process.StandardInput.Close();
    Dispose();
    }

    public void Dispose()
    {
    if (_process == null)
    {
    return;
    }

    //this may just need a call to dispose
    if (!_process.HasExited)
    {
    _process.CloseMainWindow();
    _process.Close();
    }
    _process.Dispose();
    _process = null;
    }
    }
    }
    58 changes: 58 additions & 0 deletions ExampleTest,cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,58 @@
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ElasticSearch.Integration.Tests
    {
    using FluentAssertions;
    using NCrunch.Framework;
    using Nest;
    using NUnit.Framework;

    //stops ncrunch running these elastic tests in parallel and trying to start many instances of the server
    [ExclusivelyUses("ElasticSearch")]
    public class ExampleTest
    {
    private ElasticClient _client;

    private class TestThing
    {
    public Guid Uniqueness { get; private set; }

    public TestThing(Guid uniqueness)
    {
    Uniqueness = uniqueness;
    }
    }

    [SetUp]
    public void Before()
    {
    //defaults to http://localhost:9200
    ConnectionSettings connectionSettings = new ConnectionSettings();
    //each test could write to its own index for isolation
    connectionSettings.SetDefaultIndex("test-index");

    ElasticSearchIntegration.DeleteAllElasticData("test-index");

    _client = new ElasticClient(connectionSettings);
    }

    [Test]
    public void Hello()
    {
    //arrange
    var guid = Guid.NewGuid();
    _client.Index(new TestThing(guid), id => id.Refresh());

    //act
    var results = _client.Search<TestThing>(sd => sd);

    //assert
    results.ConnectionStatus.Success.Should().BeTrue();
    results.Documents.Single().Uniqueness.Should().Be(guid);
    }
    }
    }