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)