public void RunTest(String[] args) { if (args.Length < 2) { Console.Error.WriteLine("rdfWebDeploy: Error: 2 Arguments are required in order to use the -test mode"); return; } if (!File.Exists(args[1])) { Console.Error.WriteLine("rdfWebDeploy: Error: Cannot test " + args[1] + " since the file does not exist"); return; } Graph g = new Graph(); try { FileLoader.Load(g, args[1]); } catch (Exception ex) { Console.Error.WriteLine("rdfWebDeploy: Error: Cannot parse the configuration file"); Console.Error.WriteLine("rdfWebDeploy: Error: " + ex.Message); return; } Console.WriteLine("rdfWebDeploy: Opened the configuration file successfully"); Graph vocab = new Graph(); try { vocab.LoadFromEmbeddedResource("VDS.RDF.Configuration.configuration.ttl"); vocab.LoadFromEmbeddedResource("VDS.RDF.Query.FullText.ttl, dotNetRDF.Query.FullText"); } catch (Exception ex) { Console.Error.WriteLine("rdfWebDeploy: Error: Cannot parse the configuration vocabulary"); Console.Error.WriteLine("rdfWebDeploy: Error: " + ex.Message); return; } Console.WriteLine("rdfWebDeploy: Loaded the configuration vocabulary successfully"); Console.WriteLine(); Console.WriteLine("rdfWebDeploy: Tests Started..."); Console.WriteLine(); //Now make some tests against it int warnings = 0, errors = 0; IInMemoryQueryableStore store = new TripleStore(); store.Add(vocab); if (g.BaseUri == null) g.BaseUri = new Uri("dotnetrdf:config"); store.Add(g); Object results; SparqlResultSet rset; //Unknown vocabulary term test Console.WriteLine("rdfWebDeploy: Testing for URIs in the vocabulary namespace which are unknown"); results = store.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + UnknownVocabularyTermsTest); if (results is SparqlResultSet) { rset = (SparqlResultSet)results; foreach (SparqlResult r in rset) { Console.Error.WriteLine("rdfWebDeploy: Error: The configuration file uses the URI '" + r["term"] + "' for a property/type and this does not appear to be a valid term in the Configuration vocabulary"); errors++; } } Console.WriteLine(); #region General dnr:type Tests //Missing dnr:type test Console.WriteLine("rdfWebDeploy: Testing for missing dnr:type properties"); results = g.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + MissingConfigurationTypeTest); if (results is SparqlResultSet) { rset = (SparqlResultSet)results; foreach (SparqlResult r in rset) { Console.Error.WriteLine("rdfWebDeploy: Warning: The Node '" + r["s"].ToString() + "' has an rdf:type but no dnr:type which may be needed by the Configuration Loader"); warnings++; } } Console.WriteLine(); //Invalid dnr:type test Console.WriteLine("rdfWebDeploy: Testing that values given for dnr:type property are literals"); results = g.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + InvalidTypePropertyTest); if (results is SparqlResultSet) { rset = (SparqlResultSet)results; foreach (SparqlResult r in rset) { Console.Error.WriteLine("rdfWebDeploy: Error: The node '" + r["s"].ToString() + "' has a dnr:type of '" + r["type"].ToString() + "' which is not given as a string literal"); errors++; } } Console.WriteLine(); //Multiple dnr:type test Console.WriteLine("rdfWebDeploy: Testing that no object has multiple dnr:type values"); results = g.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + MultipleTypeTest); if (results is SparqlResultSet) { rset = (SparqlResultSet)results; foreach (SparqlResult r in rset) { Console.Error.WriteLine("rdfWebDeploy: Error: The node '" + r["s"].ToString() + "' has multiple dnr:type values which is not valid"); errors++; } } Console.WriteLine(); //Unknown Library Types test Console.WriteLine("rdfWebDeploy: Testing that values given for dnr:type property are valid"); results = g.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + LibraryTypesTest); if (results is SparqlResultSet) { rset = (SparqlResultSet)results; Assembly dotnetrdf = Assembly.GetAssembly(typeof(IGraph)); foreach (SparqlResult r in rset) { String typeName = ((ILiteralNode)r["type"]).Value; Type t = typeName.Contains(",") ? Type.GetType(typeName) : dotnetrdf.GetType(typeName); if (t == null) { Console.Error.WriteLine("rdfWebDeploy: Error: The node '" + r["s"].ToString() + "' has a dnr:type of '" + r["type"].ToString() + "' which does not appear to be a valid type in an available DLL"); errors++; } else { if (typeName.Contains(",")) { String assm = typeName.Substring(typeName.IndexOf(",") + 1); assm = assm.Trim(); switch (assm) { case "dotNetRDF.Data.Sql": Console.Error.WriteLine("rdfWebDeploy: Warning: The node '" + r["s"].ToString() + "' has a dnr:type of '" + r["type"].ToString() + "' which is in the dotNetRDF.Data.Sql library, please ensure you use the -sql option when deploying or if deploying manually include the Data.Sql library and its dependencies"); warnings++; break; case "dotNetRDF.Data.Virtuoso": Console.Error.WriteLine("rdfWebDeploy: Warning: The node '" + r["s"].ToString() + "' has a dnr:type of '" + r["type"].ToString() + "' which is in the dotNetRDF.Data.Virtuoso library, please ensure you use the -virtuoso option when deploying or if deploying manually include the Data.Virtuoso library and its dependencies"); warnings++; break; case "dotNetRDF.Query.FullText": Console.Error.WriteLine("rdfWebDeploy: Warning: The node '" + r["s"].ToString() + "' has a dnr:type of '" + r["type"].ToString() + "' which is in the dotNetRDF.Query.FullText library, please ensure you use the -fulltext option when deploying or if deploying manually include the Query.FullText library and its dependencies"); warnings++; break; default: Console.Error.WriteLine("rdfWebDeploy: Warning: The node '" + r["s"].ToString() + "' has a dnr:type of '" + r["type"].ToString() + "' which is in the " + assm + " library, please ensure that when deploying you manually include this library and any dependencies"); warnings++; break; } } } } } Console.WriteLine(); #endregion #region dnr:HttpHandler Tests including specific dnr:type Tests //Bad Handler URI test Console.WriteLine("rdfWebDeploy: Testing for bad URIs given the rdf:type of dnr:HttpHandler"); results = g.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + BadHandlerUriTest); if (results is SparqlResultSet) { rset = (SparqlResultSet)results; foreach (SparqlResult r in rset) { Console.Error.WriteLine("rdfWebDeploy: Error: The Handler node '" + r["s"].ToString() + "' is not a URI of the form <dotnetrdf:/path> which is required for correct detection of handler configuration"); errors++; } } Console.WriteLine(); //Missing Handler type test Console.WriteLine("rdfWebDeploy: Testing for missing dnr:type for dnr:HttpHandler objects"); results = g.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + MissingHandlerTypeTest); if (results is SparqlResultSet) { rset = (SparqlResultSet)results; foreach (SparqlResult r in rset) { Console.Error.WriteLine("rdfWebDeploy: Error: The Handler node '" + r["s"].ToString() + "' has an rdf:type but no dnr:type which is requiring for automated deployment via this tool"); errors++; } } Console.WriteLine(); //Invalid Handler Type test Console.WriteLine("rdfWebDeploy: Testing that values given for dnr:type for dnr:HttpHandler objects in the VDS.RDF namespace are valid IHttpHandlers"); results = g.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + InvalidHandlerTypeTest); if (results is SparqlResultSet) { rset = (SparqlResultSet)results; Assembly dotnetrdf = Assembly.GetAssembly(typeof(IGraph)); foreach (SparqlResult r in rset) { Type t = dotnetrdf.GetType(((ILiteralNode)r["type"]).Value); if (t != null) { if (!t.GetInterfaces().Any(i => i.Equals(typeof(System.Web.IHttpHandler)))) { Console.Error.WriteLine("rdfWebDeploy: Error: The node '" + r["s"].ToString() + "' has a dnr:type of '" + r["type"].ToString() + "' which does not appear to be a valid IHttpHandler implementation in dotNetRDF"); errors++; } } } } Console.WriteLine(); #endregion #region Property Tests //Range test Console.WriteLine("rdfWebDeploy: Testing for bad ranges for properties"); results = store.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + InvalidRangeTest); if (results is SparqlResultSet) { rset = (SparqlResultSet)results; foreach (SparqlResult r in rset) { SparqlParameterizedString hasValidRange = new SparqlParameterizedString(); hasValidRange.CommandText = RdfWebDeployHelper.NamespacePrefixes + ValidRangeTest; hasValidRange.SetParameter("property", r["property"]); hasValidRange.SetParameter("s", r["s"]); Object temp = store.ExecuteQuery(hasValidRange.ToString()); if (temp is SparqlResultSet) { if (!((SparqlResultSet)temp).Result) { Console.Error.WriteLine("rdfWebDeploy: Error: The Node '" + r["s"].ToString() + "' has a value for the property '" + r["property"].ToString() + "' which is '" + r["obj"].ToString() + "' which does not appear to be valid for the range of this property which is '" + r["range"].ToString() + "'"); errors++; } } } } Console.WriteLine(); //Domain test Console.WriteLine("rdfWebDeploy: Testing for bad domains for properties"); results = store.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + InvalidDomainTest); if (results is SparqlResultSet) { rset = (SparqlResultSet)results; foreach (SparqlResult r in rset) { SparqlParameterizedString hasValidDomain = new SparqlParameterizedString(); hasValidDomain.CommandText = RdfWebDeployHelper.NamespacePrefixes + ValidDomainTest; hasValidDomain.SetParameter("property", r["property"]); hasValidDomain.SetParameter("s", r["s"]); Object temp = store.ExecuteQuery(hasValidDomain.ToString()); if (temp is SparqlResultSet) { if (!((SparqlResultSet)temp).Result) { Console.Error.WriteLine("rdfWebDeploy: Error: The Node '" + r["s"].ToString() + "' has a value for the property '" + r["property"].ToString() + "' and the type given is '" + r["type"].ToString() + "' which does not match the domain of this property which is '" + r["domain"].ToString() + "'"); errors++; } } } } Console.WriteLine(); #endregion #region Clear Text Password Tests Console.WriteLine("rdfWebDeploy: Testing for clear text passwords used with dnr:password property"); results = store.ExecuteQuery(RdfWebDeployHelper.NamespacePrefixes + ClearTextPasswordTest); if (results is SparqlResultSet) { foreach (SparqlResult r in (SparqlResultSet)results) { Console.Error.WriteLine("rdfWebDeploy: Warning: The Node '" + r["s"].ToString() + "' has a value for the dnr:password property specified as a Literal in clear text. It is recommended that you specify any passwords as AppSetting URIs e.g. <appsetting:MyPassword> and then create an AppSetting in the <appSettings> section of your Web.config file to store your password. The Web.config file can then have the <appSettings> section encrypted to help protect your password"); warnings++; } } Console.WriteLine(); #endregion //Show Test Results Console.WriteLine("rdfWedDeploy: Tests Completed - " + warnings + " Warning(s) - " + errors + " Error(s)"); }