diff --git a/CHANGELOG.md b/CHANGELOG.md index 41e3f6269..7a15bb006 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## 1.15.0 [unreleased] +### Bug Fixes +1. [#143](https://github.com/influxdata/influxdb-client-csharp/pull/143): Added validation that a configuration is present when is client configured via file + ### CI 1. [#140](https://github.com/influxdata/influxdb-client-csharp/pull/140): Updated default docker image to v2.0.3 diff --git a/Client.Test/App.config b/Client.Test/App.config index 748bef16b..478599c30 100644 --- a/Client.Test/App.config +++ b/Client.Test/App.config @@ -2,6 +2,7 @@
+
@@ -20,4 +21,10 @@ + \ No newline at end of file diff --git a/Client.Test/InfluxDbClientFactoryTest.cs b/Client.Test/InfluxDbClientFactoryTest.cs index 60217a9bb..49aa4e399 100644 --- a/Client.Test/InfluxDbClientFactoryTest.cs +++ b/Client.Test/InfluxDbClientFactoryTest.cs @@ -120,9 +120,7 @@ public void LoadFromConnectionUnknownUnit() [Test] public void LoadFromConfiguration() { - // copy App.config to assemble format - var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - File.Copy(Directory.GetCurrentDirectory() + "/../../../App.config", config.FilePath, true); + CopyAppConfig(); var client = InfluxDBClientFactory.Create(); @@ -145,7 +143,29 @@ public void LoadFromConfiguration() Assert.AreEqual("California Miner", defaultTags["customer"]); Assert.AreEqual("${SensorVersion}", defaultTags["version"]); } - + + [Test] + public void LoadFromConfigurationWithoutUrl() + { + CopyAppConfig(); + + var ce = Assert.Throws(() => InfluxDBClientOptions.Builder + .CreateNew() + .LoadConfig("influx2-without-url")); + + StringAssert.StartsWith("Required attribute 'url' not found.", ce.Message); + } + + [Test] + public void LoadFromConfigurationNotExist() + { + var ce = Assert.Throws(() => InfluxDBClientOptions.Builder + .CreateNew() + .LoadConfig("influx2-not-exits")); + + StringAssert.StartsWith("The configuration doesn't contains a 'influx2'", ce.Message); + } + [Test] public void V1Configuration() { @@ -188,7 +208,14 @@ private static T GetDeclaredField(IReflect type, object instance, string fiel const BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.DeclaredOnly; var field = type.GetField(fieldName, bindFlags); - return (T) field.GetValue(instance); + return (T) field?.GetValue(instance); + } + + private static void CopyAppConfig() + { + // copy App.config to assemble format + var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + File.Copy(Directory.GetCurrentDirectory() + "/../../../App.config", config.FilePath, true); } } } \ No newline at end of file diff --git a/Client.Test/ItWriteApiRaceTest.cs b/Client.Test/ItWriteApiRaceTest.cs index 1a4343e29..9ad291079 100644 --- a/Client.Test/ItWriteApiRaceTest.cs +++ b/Client.Test/ItWriteApiRaceTest.cs @@ -1,16 +1,9 @@ -using System; using System.Collections.Generic; -using System.Configuration; -using System.Diagnostics; -using System.Linq; using System.Threading; +using System.Threading.Tasks; using InfluxDB.Client.Api.Domain; -using InfluxDB.Client.Core; using InfluxDB.Client.Writes; -using NodaTime; using NUnit.Framework; -using Duration = NodaTime.Duration; -using Task = System.Threading.Tasks.Task; namespace InfluxDB.Client.Test { @@ -58,11 +51,6 @@ public class ItWriteApiRaceTest : AbstractItClientTest [Test] public void Race() { - var options = new InfluxDBClientOptions.Builder().Url(InfluxDbUrl) - .LoadConfig() - .Url(InfluxDbUrl) - .AuthenticateToken(_token) - .Build(); var point = PointData.Measurement("race-test") .Tag("test", "stress") .Field("value", 1); diff --git a/Client.Test/ItWriteQueryApiTest.cs b/Client.Test/ItWriteQueryApiTest.cs index 36f9fd696..aa30edf28 100644 --- a/Client.Test/ItWriteQueryApiTest.cs +++ b/Client.Test/ItWriteQueryApiTest.cs @@ -79,7 +79,7 @@ public async Task DefaultTagsConfiguration() { Client.Dispose(); - var options = new InfluxDBClientOptions.Builder().Url(InfluxDbUrl) + var options = new InfluxDBClientOptions.Builder() .LoadConfig() .Url(InfluxDbUrl) .AuthenticateToken(_token) diff --git a/Client/InfluxDBClientOptions.cs b/Client/InfluxDBClientOptions.cs index a07324e02..4bac976ca 100644 --- a/Client/InfluxDBClientOptions.cs +++ b/Client/InfluxDBClientOptions.cs @@ -248,20 +248,30 @@ public Builder AddDefaultTag(string tagName, string expression) /// /// Configure Builder via App.config. /// + /// Name of configuration section. Useful for tests. /// - internal Builder LoadConfig() + internal Builder LoadConfig(string sectionName = "influx2") { - var config = (Influx2) ConfigurationManager.GetSection("influx2"); + var config = (Influx2) ConfigurationManager.GetSection(sectionName); + if (config == null) + { + const string message = "The configuration doesn't contains a 'influx2' section. " + + "The minimal configuration should contains an url of InfluxDB. " + + "For more details see: " + + "https://github.com/influxdata/influxdb-client-csharp/blob/master/Client/README.md#client-configuration-file"; + + throw new ConfigurationErrorsException(message); + } - var url = config?.Url; - var org = config?.Org; - var bucket = config?.Bucket; - var token = config?.Token; - var logLevel = config?.LogLevel; - var timeout = config?.Timeout; - var readWriteTimeout = config?.ReadWriteTimeout; + var url = config.Url; + var org = config.Org; + var bucket = config.Bucket; + var token = config.Token; + var logLevel = config.LogLevel; + var timeout = config.Timeout; + var readWriteTimeout = config.ReadWriteTimeout; - var tags = config?.Tags; + var tags = config.Tags; if (tags != null) { foreach (Influx2.TagElement o in tags)