|
|
(10 intermediate revisions by 2 users not shown) |
Line 2: |
Line 2: |
| Back to the [[Testopia |Testopia Main Page]] | | Back to the [[Testopia |Testopia Main Page]] |
|
| |
|
| ==What's New!==
| | Testopia XMLRPC is now documented inline. On your local installation this means you can simply run perldoc /path/to/module.pm and view the docs. Or, if you have built the bugzilla documentation, you can find it listed in the doc/html/api/ directory in your installation. |
| {| border=1 cellpadding=4
| |
| | 2006-09-21 ||
| |
| * Added code for <b>SSL (https)</b> access to the Java client (not necessary for Perl client)
| |
| |-
| |
| | 2006-09-20 ||
| |
| * Added code for <b>Basic Authorization</b> to the sample clients
| |
| |-
| |
| |}
| |
|
| |
|
| ==Requirements==
| | Below are links to the documentation on landfill which can be accessed from [http://landfill.bugzilla.org/testopia2/docs/html/api/index.html HERE]: |
| Testopia's XMLRPC relies on Bugzilla's webservice which won't be generally available until Bugzilla 3.0. You will need to download and install the WebService.pm file into your Bugzilla directory and the files found in Bugzilla/WebService. You can get the files from http://lxr.mozilla.org/bugzilla/source/Bugzilla/
| |
|
| |
|
| ==Project Description==
| | *[http://landfill.bugzilla.org/testopia2/docs/html/api/Bugzilla/WebService/Testopia/Build.html Bugzilla::WebService::Testopia::Build] |
| Provide a means for the programmatic creation, modification, and reporting of inherent Bugzilla Testopia objects, such as test plans, test cases, and test runs. Scope will later expand to cover actual bugs and products.
| | *[http://landfill.bugzilla.org/testopia2/docs/html/api/Bugzilla/WebService/Testopia/Environment.html Bugzilla::WebService::Testopia::Environment] |
| | *[http://landfill.bugzilla.org/testopia2/docs/html/api/Bugzilla/WebService/Testopia/Product.html Bugzilla::WebService::Testopia::Product] |
| | *[http://landfill.bugzilla.org/testopia2/docs/html/api/Bugzilla/WebService/Testopia/TestCase.html Bugzilla::WebService::Testopia::TestCase] |
| | *[http://landfill.bugzilla.org/testopia2/docs/html/api/Bugzilla/WebService/Testopia/TestCaseRun.html Bugzilla::WebService::Testopia::TestCaseRun] |
| | *[http://landfill.bugzilla.org/testopia2/docs/html/api/Bugzilla/WebService/Testopia/Testopia.html Bugzilla::WebService::Testopia::Testopia] |
| | *[http://landfill.bugzilla.org/testopia2/docs/html/api/Bugzilla/WebService/Testopia/TestPlan.html Bugzilla::WebService::Testopia::TestPlan] |
| | *[http://landfill.bugzilla.org/testopia2/docs/html/api/Bugzilla/WebService/Testopia/TestRun.html Bugzilla::WebService::Testopia::TestRun] |
|
| |
|
| The API is accessed through XML Remote Procedure Calls (XML-RPC). Bascially, a client creates an XML document and sends it to the Bugzilla server via an HTTP post.
| | Any language with an XMLRPC library can make use of this API. There are several example clients in the [http://landfill.bugzilla.org/testopia2/testopia/contrib/drivers testopia/contrib/drivers] directory . Please note that only the Perl driver (client.pl) is officially supported by the Testopia developers at this time. |
| | |
| An example of an XML request:
| |
| | |
| <?xml version="1.0" encoding="UTF-8"?>
| |
| <methodCall>
| |
| <methodName>TestPlan.get</methodName>
| |
| <params>
| |
| <param>
| |
| <value>
| |
| <int>1</int>
| |
| </value>
| |
| </param>
| |
| </params>
| |
| </methodCall>
| |
| | |
| An exmple of an XML response:
| |
| | |
| <?xml version="1.0" encoding="UTF-8"?>
| |
| <methodResponse>
| |
| <params>
| |
| <param>
| |
| <value>
| |
| <struct>
| |
| <member>
| |
| <name>author</name>
| |
| <value>
| |
| <string>user@company.com</string>
| |
| </value>
| |
| </member>
| |
| <member>
| |
| <name>editor</name>
| |
| <value>
| |
| <string>user@company.com</string>
| |
| </value>
| |
| </member>
| |
| <member>
| |
| <name>name</name>
| |
| <value>
| |
| <string>A Test Plan</string>
| |
| </value>
| |
| </member>
| |
| <member>
| |
| <name>default_product_version</name>
| |
| <value>
| |
| <string>other</string>
| |
| </value>
| |
| </member>
| |
| <member>
| |
| <name>plan_id</name>
| |
| <value>
| |
| <int>1</int>
| |
| </value>
| |
| </member>
| |
| <member>
| |
| <name>product</name>
| |
| <value>
| |
| <string>TestProduct</string>
| |
| </value>
| |
| </member>
| |
| <member>
| |
| <name>creation_date</name>
| |
| <value>
| |
| <string>2006-08-03 13:20:53</string>
| |
| </value>
| |
| </member>
| |
| <member>
| |
| <name>type</name>
| |
| <value>
| |
| <string>Unit</string>
| |
| </value>
| |
| </member>
| |
| <member>
| |
| <name>isactive</name>
| |
| <value>
| |
| <int>1</int>
| |
| </value>
| |
| </member>
| |
| </struct>
| |
| </value>
| |
| </param>
| |
| </params>
| |
| </methodResponse>
| |
| An example of an error response:
| |
| | |
| <?xml version="1.0"?>
| |
| <methodResponse>
| |
| <fault>
| |
| <value>
| |
| <struct>
| |
| <member>
| |
| <name>faultString</name>
| |
| <value>
| |
| <string>Too many parameters.</string>
| |
| </value>
| |
| </member>
| |
| <member>
| |
| <name>faultCode</name>
| |
| <value>
| |
| <int>4</int>
| |
| </value>
| |
| </member>
| |
| </struct>
| |
| </value>
| |
| </fault>
| |
| </methodResponse>
| |
| | |
| ==Getting Started==
| |
| | |
| ===Requirements===
| |
| | |
| The examples for this project use the following libraries:
| |
| | |
| {| border=1 cellpadding=4
| |
| | '''Programming Language''' || '''Software'''
| |
| |-
| |
| | Perl || [http://www.soaplite.com SOAP::Lite]
| |
| |-
| |
| | Java || [http://ws.apache.org/xmlrpc Apache XML-RPC]
| |
| |-
| |
| |}
| |
| | |
| You can, of course, code the XML document via strings or the Document Object Model (DOM) and then maually do a HTTP post, but why?
| |
| | |
| ===Sample Clients===
| |
| | |
| ====Perl====
| |
| | |
| use SOAP::Transport::HTTP; # Need for Basic Authorization subroutine
| |
| | |
| use XMLRPC::Lite; # From the SOAP::Lite Module
| |
|
| |
| my $proxy = XMLRPC::Lite->proxy("http://company.com/bugzilla/tr_xmlrpc.cgi");
| |
|
| |
| # Result is a hash map
| |
| my $soapresult = $proxy->call('TestPlan.get', 1);
| |
|
| |
| # Error checking
| |
| die_on_fault($soapresult);
| |
|
| |
| # Print each key/value pair
| |
| foreach (keys(%$soapresult))
| |
| {
| |
| print "$_: $$soapresult{$_}\n";
| |
| }
| |
|
| |
| # Add the following subroutine to submit a userid/password for basic authorization
| |
| sub SOAP::Transport::HTTP::Client::get_basic_credentials
| |
| {
| |
| return 'userid' => 'password';
| |
| }
| |
|
| |
| sub die_on_fault
| |
| {
| |
| my $soapresult = shift;
| |
|
| |
| if ($soapresult->fault)
| |
| {
| |
| die $soapresult->faultcode . ' ' . $soapresult->faultstring;
| |
| }
| |
| }
| |
| | |
| ====Java====
| |
| | |
| import org.apache.xmlrpc.XmlRpcException;
| |
| import org.apache.xmlrpc.client.XmlRpcClient;
| |
| import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
| |
|
| |
| import java.net.URL;
| |
| import java.util.HashMap;
| |
| import java.util.ArrayList;
| |
|
| |
| // Needed for SSL
| |
| import java.security.cert.X509Certificate;
| |
| import javax.net.ssl.HostnameVerifier;
| |
| import javax.net.ssl.HttpsURLConnection;
| |
| import javax.net.ssl.SSLContext;
| |
| import javax.net.ssl.SSLSession;
| |
| import javax.net.ssl.TrustManager;
| |
| import javax.net.ssl.X509TrustManager;
| |
|
| |
| public class RPCClient
| |
| {
| |
| //
| |
| // Trust All Certificates - Needed for SSL Client
| |
| //
| |
| private static void TrustAllCerts()
| |
| throws java.security.NoSuchAlgorithmException,
| |
| java.security.KeyManagementException
| |
| {
| |
| // Create a trust manager that does not validate certificate chains
| |
|
| |
| TrustManager[] trustAllCerts = new TrustManager[]
| |
| {
| |
| new X509TrustManager()
| |
| {
| |
| public X509Certificate[] getAcceptedIssuers()
| |
| {
| |
| return null;
| |
| }
| |
|
| |
| public void checkClientTrusted(X509Certificate[] certs, String authType)
| |
| {
| |
| // Trust always
| |
| }
| |
|
| |
| public void checkServerTrusted(X509Certificate[] certs, String authType)
| |
| {
| |
| // Trust always
| |
| }
| |
| }
| |
| };
| |
|
| |
| // Install the all-trusting trust manager
| |
| SSLContext sc = SSLContext.getInstance("SSL");
| |
|
| |
| // Create empty HostnameVerifier
| |
| HostnameVerifier hv = new HostnameVerifier()
| |
| {
| |
| public boolean verify(String arg0, SSLSession arg1)
| |
| {
| |
| return true;
| |
| }
| |
| };
| |
|
| |
| sc.init(null, trustAllCerts, new java.security.SecureRandom());
| |
| HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
| |
| HttpsURLConnection.setDefaultHostnameVerifier(hv);
| |
| }
| |
|
| |
| public static void main(String[] args)
| |
| {
| |
| try
| |
| {
| |
| TrustAllCerts();
| |
|
| |
| XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
| |
| config.setServerURL(new URL("http://company.com/bugzilla/tr_xmlrpc.cgi"));
| |
| config.setBasicUserName("userid");
| |
| config.setBasicPassword("password");
| |
|
| |
| XmlRpcClient client = new XmlRpcClient();
| |
| client.setConfig(config);
| |
|
| |
| ArrayList<Object> params = new ArrayList<Object>();
| |
| params.add(1);
| |
|
| |
| HashMap result = (HashMap) client.execute("TestPlan.get", params);
| |
| | | |
| System.out.println(result);
| |
| }
| |
| catch (Exception e)
| |
| {
| |
| e.printStackTrace();
| |
| }
| |
| }
| |
| }
| |
|
| |
| ==API Documentation==
| |
|
| |
| All XML-RPC requests are sent to a single Bugzilla CGI called <i>tr_xmlprc.cgi</i>. Its locations will be based on your specific Bugzilla installation. Normally the CGI will be found at the root URL of Bugzilla, for example, http://company.com/bugzilla/tr_xmlrpc.cgi
| |
|
| |
| ===Objects===
| |
|
| |
| * [[Testopia:Documentation:XMLRPC:TestPlan |TestPlan]]
| |
| * [[Testopia:Documentation:XMLRPC:TestCase |TestCase]]
| |
| * [[Testopia:Documentation:XMLRPC:TestRun |TestRun]]
| |
| * [[Testopia:Documentation:XMLRPC:TestCaseRun |TestCaseRun]]
| |
|
| |
|
| |
| ==FAQ==
| |
|
| |
| # Where can I find more coding examples?
| |
| #* [[Testopia:Documentation:XMLRPC:Code_Examples |Here]].
| |
| # Where can I find the query examples again?
| |
| #* [[Testopia:Documentation:XMLRPC:Query_Examples |Here]].
| |
|
| |
|
| |
| <br>Back to the [[Testopia |Testopia Main Page]] | | <br>Back to the [[Testopia |Testopia Main Page]] |