public void CanHandleInvalidCachedServerConfig() { using (var dir = new IsolatedStorageDirectory(DEFAULT_STORE)) { dir.WriteFile(CONFIG_FILENAME, "sadf<sdf>"); Assert.True(dir.FileExists(CONFIG_FILENAME)); var client = new ExceptionlessClient(); ClientConfiguration config = ClientConfiguration.Create(client); // file should get deleted if it's invalid Assert.False(dir.FileExists(CONFIG_FILENAME)); Assert.NotNull(config); Assert.True(config.ContainsKey("AttributeOnly")); Assert.Equal(config["AttributeOnly"], "Attribute"); Assert.True(config.ContainsKey("UserNamespaces")); Assert.Equal(config["UserNamespaces"], "Exceptionless,FromConfig"); Assert.True(config.ContainsKey("ConfigAndAttribute")); Assert.Equal(config["ConfigAndAttribute"], "Config"); Assert.True(config.ContainsKey("AppConfigOnly")); Assert.Equal(config["AppConfigOnly"], "Config"); } }
public void CanEnableLoggingFromConfig() { var client = new ExceptionlessClient(); ClientConfiguration config = ClientConfiguration.Create(client); string logPath = config.LogPath; Assert.NotNull(config); Assert.True(config.EnableLogging); //Assert.Equal(logPath, config.LogPath); // TODO: Should this even be set to a value?? It's Isolated storage? Assert.NotNull(client.Log); Assert.NotNull(client); Assert.Equal(typeof(SafeExceptionlessLog), client.Log.GetType()); client.ProcessQueue(); client.Shutdown(); var dir = new IsolatedStorageDirectory(DEFAULT_STORE); Assert.True(dir.FileExists(logPath)); string content = dir.ReadFileAsString(logPath); Assert.True(content.Length > 10); }
private void DeleteConfig(string storeId = DEFAULT_STORE) { using (var dir = new IsolatedStorageDirectory(storeId)) { if (dir.FileExists(CONFIG_FILENAME)) { dir.DeleteFile(CONFIG_FILENAME); } } }
public void CreateNewConfiguration() { DeleteConfig(); var client = new ExceptionlessClient(); LocalConfigurationDictionary localConfiguration = LocalConfigurationDictionary.Create(DEFAULT_STORE, client); Assert.NotNull(localConfiguration); Assert.False(localConfiguration.IsDirty); Assert.NotEqual(Guid.Empty, localConfiguration.InstallIdentifier); using (var store = new IsolatedStorageDirectory(DEFAULT_STORE)) { Assert.True(store.FileExists(CONFIG_FILENAME)); Console.WriteLine(store.ReadFileAsString(CONFIG_FILENAME)); } }
internal static LocalConfigurationDictionary Create(string storeId, IExceptionlessLogAccessor logAccessor) { var localStorage = new LocalConfigurationDictionary { LogAccessor = logAccessor, StoreId = storeId, CurrentConfigurationVersion = 0, NextConfigurationUpdate = DateTime.MinValue }; try { using (new SingleGlobalInstance(String.Concat(storeId, FileName).GetHashCode().ToString(), 500)) { // retry loop for (int retry = 0; retry < 2; retry++) { using (var dir = new IsolatedStorageDirectory(storeId)) { try { if (!dir.FileExists(FileName)) { break; } var config = dir.ReadFile <LocalConfigurationDictionary>(FileName); foreach (string key in config.Keys) { localStorage[key] = config[key]; } localStorage.IsDirty = false; break; } catch (Exception ex) { // File is being used by another process or thread or the file does not exist. logAccessor.Log.FormattedError(typeof(LocalConfigurationDictionary), ex, "Unable to read data from local storage: {0}", ex.Message); Thread.Sleep(50); } } // using stream } // retry // TODO: Why are we doing this even if the configuration couldn't be read or didn't exist?? localStorage.LoadDefaults(); localStorage.Save(); return(localStorage); } // lock } catch (Exception ex) { logAccessor.Log.Error(ex, "An error occurred while saving local configuration"); localStorage.LoadDefaults(); return(localStorage); } }
public void CreateNewConfiguration() { DeleteConfig(); var client = new ExceptionlessClient(); LocalConfigurationDictionary localConfiguration = LocalConfigurationDictionary.Create(DEFAULT_STORE, client); Assert.NotNull(localConfiguration); Assert.False(localConfiguration.IsDirty); Assert.NotEqual(Guid.Empty, localConfiguration.InstallIdentifier); using (var store = new IsolatedStorageDirectory(DEFAULT_STORE)) { Assert.True(store.FileExists(CONFIG_FILENAME)); Console.WriteLine(store.ReadFileAsString(CONFIG_FILENAME)); } }
public void MultiThreadedSaveLocalConfiguration() { DeleteConfig(); var client = new ExceptionlessClient(); Parallel.For(0, 200, i => { Exception exception = Record.Exception(() => { LocalConfigurationDictionary localConfiguration = LocalConfigurationDictionary.Create(DEFAULT_STORE, client); Assert.NotNull(localConfiguration); localConfiguration.IsDirty = true; localConfiguration["ExpireTokenDate"] = DateTime.Now.AddMinutes(i).ToString(); localConfiguration.StartCount++; Task.Factory.StartNew(() => localConfiguration["ExpireTokenDate"] = DateTime.Now.AddMinutes(i + 1).ToString()); localConfiguration.Save(); Assert.NotNull(LocalConfigurationDictionary.Create(DEFAULT_STORE, client)); localConfiguration.IsDirty = true; localConfiguration["ExpireTokenDate"] = DateTime.Now.AddMinutes(i).ToString(); Task.Factory.StartNew(() => localConfiguration.Remove("ExpireTokenDate")); localConfiguration.Save(); Assert.NotNull(LocalConfigurationDictionary.Create(DEFAULT_STORE, client)); localConfiguration.StartCount++; localConfiguration.IsDirty = true; Assert.True(localConfiguration.Save(), "Saved"); Assert.NotNull(LocalConfigurationDictionary.Create(DEFAULT_STORE, client)); }); Assert.Null(exception); }); using (var store = new IsolatedStorageDirectory(DEFAULT_STORE)) { Console.WriteLine(store.GetFullPath(CONFIG_FILENAME)); Assert.True(store.FileExists(CONFIG_FILENAME)); Console.WriteLine(store.ReadFileAsString(CONFIG_FILENAME)); } }
public void CanEnableLoggingFromConfig() { var client = new ExceptionlessClient(); ClientConfiguration config = ClientConfiguration.Create(client); string logPath = config.LogPath; Assert.NotNull(config); Assert.True(config.EnableLogging); //Assert.Equal(logPath, config.LogPath); // TODO: Should this even be set to a value?? It's Isolated storage? Assert.NotNull(client.Log); Assert.NotNull(client); Assert.Equal(typeof(SafeExceptionlessLog), client.Log.GetType()); client.ProcessQueue(); client.Shutdown(); var dir = new IsolatedStorageDirectory(DEFAULT_STORE); Assert.True(dir.FileExists(logPath)); string content = dir.ReadFileAsString(logPath); Assert.True(content.Length > 10); }
private static void ReadSavedConfiguration(ClientConfiguration configuration, IExceptionlessLogAccessor logAccessor) { try { for (int retry = 0; retry < 2; retry++) { using (var dir = new IsolatedStorageDirectory(configuration.StoreId)) { try { if (!dir.FileExists(ClientConfiguration.CachedServerConfigFile)) { return; } var savedConfig = dir.ReadFile <Dictionary <string, string> >(ClientConfiguration.CachedServerConfigFile); if (savedConfig == null) { return; } foreach (string key in savedConfig.Keys) { configuration[key] = savedConfig[key]; } return; } catch (JsonReaderException) { // try deleting the invalid config file so we don't keep trying to read it. try { dir.DeleteFile(ClientConfiguration.CachedServerConfigFile); } catch {} } catch (Exception ex) { // File is being used by another process or thread or the file does not exist. logAccessor.Log.FormattedError(typeof(ClientConfigurationReader), ex, "Error while reading settings from the configuration file: {0}", ex.Message); Thread.Sleep(50); } } // storage } // retry } catch (Exception ex) { logAccessor.Log.FormattedError(typeof(ClientConfigurationReader), ex, "Error while reading settings from the configuration file: {0}", ex.Message); } }
private static void ReadSavedConfiguration(ClientConfiguration configuration, IExceptionlessLogAccessor logAccessor) { try { for (int retry = 0; retry < 2; retry++) { using (var dir = new IsolatedStorageDirectory(configuration.StoreId)) { try { if (!dir.FileExists(ClientConfiguration.CachedServerConfigFile)) return; var savedConfig = dir.ReadFile<Dictionary<string, string>>(ClientConfiguration.CachedServerConfigFile); if (savedConfig == null) return; foreach (string key in savedConfig.Keys) configuration[key] = savedConfig[key]; return; } catch (JsonReaderException) { // try deleting the invalid config file so we don't keep trying to read it. try { dir.DeleteFile(ClientConfiguration.CachedServerConfigFile); } catch {} } catch (Exception ex) { // File is being used by another process or thread or the file does not exist. logAccessor.Log.FormattedError(typeof(ClientConfigurationReader), ex, "Error while reading settings from the configuration file: {0}", ex.Message); Thread.Sleep(50); } } // storage } // retry } catch (Exception ex) { logAccessor.Log.FormattedError(typeof(ClientConfigurationReader), ex, "Error while reading settings from the configuration file: {0}", ex.Message); } }
public void MultiThreadedSaveLocalConfiguration() { DeleteConfig(); var client = new ExceptionlessClient(); Parallel.For(0, 200, i => { Exception exception = Record.Exception(() => { LocalConfigurationDictionary localConfiguration = LocalConfigurationDictionary.Create(DEFAULT_STORE, client); Assert.NotNull(localConfiguration); localConfiguration.IsDirty = true; localConfiguration["ExpireTokenDate"] = DateTime.Now.AddMinutes(i).ToString(); localConfiguration.StartCount++; Task.Factory.StartNew(() => localConfiguration["ExpireTokenDate"] = DateTime.Now.AddMinutes(i + 1).ToString()); localConfiguration.Save(); Assert.NotNull(LocalConfigurationDictionary.Create(DEFAULT_STORE, client)); localConfiguration.IsDirty = true; localConfiguration["ExpireTokenDate"] = DateTime.Now.AddMinutes(i).ToString(); Task.Factory.StartNew(() => localConfiguration.Remove("ExpireTokenDate")); localConfiguration.Save(); Assert.NotNull(LocalConfigurationDictionary.Create(DEFAULT_STORE, client)); localConfiguration.StartCount++; localConfiguration.IsDirty = true; Assert.True(localConfiguration.Save(), "Saved"); Assert.NotNull(LocalConfigurationDictionary.Create(DEFAULT_STORE, client)); }); Assert.Null(exception); }); using (var store = new IsolatedStorageDirectory(DEFAULT_STORE)) { Console.WriteLine(store.GetFullPath(CONFIG_FILENAME)); Assert.True(store.FileExists(CONFIG_FILENAME)); Console.WriteLine(store.ReadFileAsString(CONFIG_FILENAME)); } }
private void DeleteConfig(string storeId = DEFAULT_STORE) { using (var dir = new IsolatedStorageDirectory(storeId)) { if (dir.FileExists(CONFIG_FILENAME)) dir.DeleteFile(CONFIG_FILENAME); } }
protected override bool LogExists(string path = LOG_FILE) { return(_directory.FileExists(path)); }
public void CanHandleInvalidCachedServerConfig() { using (var dir = new IsolatedStorageDirectory(DEFAULT_STORE)) { dir.WriteFile(CONFIG_FILENAME, "sadf<sdf>"); Assert.True(dir.FileExists(CONFIG_FILENAME)); var client = new ExceptionlessClient(); ClientConfiguration config = ClientConfiguration.Create(client); // file should get deleted if it's invalid Assert.False(dir.FileExists(CONFIG_FILENAME)); Assert.NotNull(config); Assert.True(config.ContainsKey("AttributeOnly")); Assert.Equal(config["AttributeOnly"], "Attribute"); Assert.True(config.ContainsKey("UserNamespaces")); Assert.Equal(config["UserNamespaces"], "Exceptionless,FromConfig"); Assert.True(config.ContainsKey("ConfigAndAttribute")); Assert.Equal(config["ConfigAndAttribute"], "Config"); Assert.True(config.ContainsKey("AppConfigOnly")); Assert.Equal(config["AppConfigOnly"], "Config"); } }