static void GenerateServiceOperationsFromAssembly() { string fileName = @"EAPI.dll"; Assembly assembly = Assembly.LoadFrom(fileName); ServiceContractDataResolver.ServiceContractDataResolver dcr = new ServiceContractDataResolver.ServiceContractDataResolver(assembly, new Dictionary <string, XmlDictionaryString>()); var client = assembly.GetType("Shubert.EApiWS.EAPIClient"); var methods = client.GetRuntimeMethods(); using (SqlConnection sqlConn = new SqlConnection("Data Source=LAPTOP-DHCHDQG6\\SQLEXPRESS;Initial Catalog=TestAutomation;Integrated Security=True")) { //Open the database. sqlConn.Open(); var result = false; using (var sqlCmd = new SqlCommand()) { } sqlConn.Close(); } //Filter out async methods, untestable methods and special cases. foreach (MethodInfo m in methods) { //Skip async operations. if (m.Name.Contains("SignOn") || m.Name.Contains("SignOff") || m.Name.Contains("StartNewSession") || m.Name.Contains("Ping") || m.Name.Contains("EndSession")) { continue; } if (m.DeclaringType.Name != "EAPIClient") { continue; } if (m.ReturnType == typeof(IAsyncResult)) { continue; } if (m.ReturnType.BaseType.Name == "Task") { continue; } Console.WriteLine("Generating method {0}, return type {1}", m.Name, m.ReturnType.Name); //AddTestMethodTypeToTable(m, sqlCmd, sqlConn); ParameterInfo[] parameterInfo = m.GetParameters(); foreach (ParameterInfo p in parameterInfo) { if (p.Name == "Toke" || p.Name == "token" || p.Name == "Token") { continue; } var RunTimeMethods = p.ParameterType.GetRuntimeMethods(); var RunTimeProperties = p.ParameterType.GetRuntimeProperties(); Type t = assembly.GetType(p.ParameterType.FullName); dcr.serialize(t); foreach (PropertyInfo fi in RunTimeProperties) { Console.WriteLine("... {0}", fi.Name); } } /*foreach (var returnField in m.ReturnType.GetRuntimeProperties()) * { * Console.WriteLine("<<< {0}", returnField.Name); * }*/ foreach (var returnProp in m.ReturnType.GetRuntimeProperties()) { Console.WriteLine("<<< {0}", returnProp.Name); Console.WriteLine("\t*** {0}", returnProp.GetMethod.ReturnParameter); if (returnProp.GetMethod.ReturnParameter.ParameterType.IsArray) { foreach (var responseDataProperty in returnProp.GetMethod.ReturnParameter.ParameterType.GetElementType().GetRuntimeProperties()) { Console.WriteLine("\t\t``` {0}", responseDataProperty.Name); } } else { foreach (var responseDataProperty in returnProp.GetMethod.ReturnParameter.ParameterType.GetRuntimeProperties()) { Console.WriteLine("\t\t``` {0}", responseDataProperty.Name); } } } } }
static void GenerateServiceOperationsFromEndpoint() { System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 | System.Net.SecurityProtocolType.Tls11; System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding(); binding.OpenTimeout = new TimeSpan(0, 5, 0); binding.CloseTimeout = new TimeSpan(0, 5, 0); binding.SendTimeout = new TimeSpan(0, 5, 0); binding.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport; binding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.None; binding.MaxBufferSize = 64000000; binding.MaxReceivedMessageSize = 64000000; System.ServiceModel.EndpointAddress EndPoint = new System.ServiceModel.EndpointAddress("https://geapi.dqtelecharge.com/EAPI.svc"); EAPIClient client = new EAPIClient(binding, EndPoint); string fileName = @"EAPI.dll"; Assembly assembly = Assembly.LoadFrom(fileName); ServiceContractDataResolver.ServiceContractDataResolver dcr = new ServiceContractDataResolver.ServiceContractDataResolver(assembly, new Dictionary <string, XmlDictionaryString>()); MethodInfo[] testMethods = client.GetType().GetMethods(); try { using (SqlConnection sqlConn = new SqlConnection("Data Source=LAPTOP-DHCHDQG6\\SQLEXPRESS;Initial Catalog=TestAutomation;Integrated Security=True")) { //Open the database. sqlConn.Open(); var result = false; using (var sqlCmd = new SqlCommand()) { foreach (MethodInfo m in testMethods) { //Skip async operations. if (m.Name.Contains("SignOn") || m.Name.Contains("SignOff") || m.Name.Contains("StartNewSession") || m.Name.Contains("Ping") || m.Name.Contains("EndSession")) { continue; } if (m.DeclaringType.Name != "EAPIClient") { continue; } if (m.ReturnType == typeof(IAsyncResult)) { continue; } if (m.ReturnType.BaseType.Name == "Task") { continue; } /*if (m.Name.Contains("OfferDetails")) * Debugger.Break();*/ Console.WriteLine("Generating method {0}, return type {1}", m.Name, m.ReturnType.Name); //Run the stored procedures. sqlCmd.Connection = sqlConn; sqlCmd.CommandType = CommandType.StoredProcedure; //Methods sqlCmd.CommandText = "ag_application_method_ins"; sqlCmd.Parameters.Clear(); sqlCmd.Parameters.Add(new SqlParameter("application_id", SqlDbType.Int) { Value = 1 }); sqlCmd.Parameters.Add(new SqlParameter("application_version_id", SqlDbType.Int) { Value = 1 }); sqlCmd.Parameters.Add(new SqlParameter("method_name", SqlDbType.VarChar) { Value = m.Name }); sqlCmd.Parameters.Add(new SqlParameter("return_type", SqlDbType.VarChar) { Value = m.ReturnType.Name }); int application_method_id = (int)sqlCmd.ExecuteScalar(); //Return type fields. try { using (var sqlRespParmCmd = new SqlCommand()) { foreach (var returnProp in m.ReturnType.GetRuntimeProperties()) { List <PropertyInfo> dataProperty = new List <PropertyInfo>(); Console.WriteLine("<<< {0}", returnProp.Name); Console.WriteLine("\t*** {0}", returnProp.GetMethod.ReturnParameter); sqlRespParmCmd.Parameters.Clear(); /*if (returnProp.Name == "OfferDescription") * Debugger.Break();*/ //TODO:This is where would store types in the database. so application_response_parametername, application_response_type if (returnProp.GetMethod.ReturnParameter.ParameterType.IsArray) { sqlRespParmCmd.Parameters.Add(new SqlParameter("is_container", SqlDbType.Int) { Value = 1 }); foreach (var returnDataProperty in returnProp.GetMethod.ReturnParameter.ParameterType.GetElementType().GetRuntimeProperties()) { Console.WriteLine("\t\t``` {0}", returnDataProperty.Name); dataProperty.Add(returnDataProperty); } } else { sqlRespParmCmd.Parameters.Add(new SqlParameter("is_container", SqlDbType.Int) { Value = 0 }); /*foreach (var returnDataProperty in returnProp.GetMethod.ReturnParameter.ParameterType.GetRuntimeProperties()) * { * Console.WriteLine("\t\t``` {0}", returnDataProperty.Name); * dataProperty.Add(returnDataProperty); * }*/ } sqlRespParmCmd.Connection = sqlConn; sqlRespParmCmd.CommandType = CommandType.StoredProcedure; sqlRespParmCmd.CommandText = "ag_application_method_response_parameters_ins"; sqlRespParmCmd.Parameters.Add(new SqlParameter("application_method_id", SqlDbType.Int) { Value = application_method_id }); sqlRespParmCmd.Parameters.Add(new SqlParameter("application_method_response_parameter_name", SqlDbType.VarChar) { Value = returnProp.Name }); sqlRespParmCmd.Parameters.Add(new SqlParameter("position", SqlDbType.Int) { Value = 0 }); int application_method_response_id = (int)sqlRespParmCmd.ExecuteScalar(); foreach (var property in dataProperty) { AddResponseDataTypeToTable(application_method_response_id, property, sqlCmd, sqlConn); } } } } catch (SqlException ex) { Debugger.Log(1, "SQL", ex.Message); Console.WriteLine(ex.Message); } //Operation input parameters. using (var sqlParmCmd = new SqlCommand()) { sqlParmCmd.Connection = sqlConn; sqlParmCmd.CommandType = CommandType.StoredProcedure; ParameterInfo[] parameterInfo = m.GetParameters(); sqlParmCmd.CommandText = "ag_application_method_parameters_ins"; /*if (m.Name == "Contacts") * Debugger.Break();*/ /* * For each method skip the token parameter info. * This type might have a different name for different APIs so there * should be a credentials table that has the names of the methods and types * that should be skipped. */ foreach (ParameterInfo p in parameterInfo) { if (p.Name == "Toke" || p.Name == "token" || p.Name == "Token") { continue; } sqlParmCmd.Parameters.Clear(); var RunTimeMethods = p.ParameterType.GetRuntimeMethods(); var RunTimeProperties = p.ParameterType.GetRuntimeProperties(); foreach (PropertyInfo fi in RunTimeProperties) { /*if (fi.PropertyType.FullName.Contains("SQLTestAdapter.EAPIServiceReference.InquireINQUIRE")) * { * Debugger.Break(); * }*/ sqlParmCmd.Parameters.Clear(); Console.WriteLine("... {0}", fi.Name); sqlParmCmd.Parameters.Add(new SqlParameter("application_method_id", SqlDbType.Int) { Value = application_method_id }); sqlParmCmd.Parameters.Add(new SqlParameter("application_method_name", SqlDbType.VarChar) { Value = m.Name }); sqlParmCmd.Parameters.Add(new SqlParameter("application_method_parameter_name", SqlDbType.VarChar) { Value = fi.Name }); sqlParmCmd.Parameters.Add(new SqlParameter("application_method_parameter_type", SqlDbType.VarChar) { Value = fi.PropertyType.FullName }); sqlParmCmd.Parameters.Add(new SqlParameter("position", SqlDbType.Int) { Value = p.Position }); /* * Here is how to serialize a struct! * object serializedType = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(fi.PropertyType.GetElementType()); * json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(serializedType); * */ /* * Serialize method parameter types for testing the service with actual data. * Values to be input via a UI. */ //TODO: DEBUG: //Just fudge for this test. //Type t = assembly.GetType(p.ParameterType.FullName); Type t = assembly.GetType("Shubert.EApiWS." + p.ParameterType.Name); var xml = dcr.serialize(t); sqlParmCmd.Parameters.Add(new SqlParameter("value", SqlDbType.NVarChar) { Value = xml }); result = sqlParmCmd.ExecuteNonQuery() > 0; } } } } //XmlSerializer serializer = new XmlSerializer(typeof(Dictionary<string, XmlDictionaryString)); var typeDictionary = dcr.GetTypeDictionary(); foreach (KeyValuePair <string, XmlDictionaryString> entry in typeDictionary) { //Debugger.Break(); String query = "INSERT INTO application_filter_type_dictionary (application_id, application_version_id, type) VALUES (@application_id, @application_version_id, @type)"; using (SqlCommand command = new SqlCommand(query, sqlConn)) { command.Parameters.AddWithValue("@application_id", 1); command.Parameters.AddWithValue("@application_version_id", 1); command.Parameters.AddWithValue("@type", entry.Value.ToString()); var ret = command.ExecuteNonQuery(); // Check Error if (ret < 0) { Console.WriteLine("Error inserting data into Database!"); } } } //TextWriter tw = new StreamWriter("."); //serializer.Serialize(tw, typeDictionary); //Console.WriteLine("{0}", tw.ToString()); } sqlConn.Close(); } } catch (SqlException ex) { Debugger.Break(); Debugger.Log(1, "SQL", ex.Message); Console.WriteLine(ex.Message); } }//GeneratefromEndPoint