For more information on OAUTH2 refer this presentation.
Authorization Grant types :
There are 4 Authorization grant types in OAuth.
How is this interpreted in APIM?
* Authorization code
* Implicit
* Resource owner password credentials
* Client credentials
(Resource : WSO2 OAuth 2.0 The Path to Heaven from Hell presentation)
In the following types Resource owner does not grant the authorization.
* Resource owner password credentials
* Client credentials
There for Step B and C (Authorization grant) will be omitted when there is a high degree of trust between client and resource owner. So the user will be able to receive the access token without the Authorization grant.
But Authorization grant is being used during the other 2 types which are,
* Authorization code
* Implicit.
If you use CURL or Advance rest cient, this step will not be visible since the authorization server must return a 302 redirection back to the client with an Location header pointing to the URL of user consent page. So you have to use an app which will return 302 redirection.
That is whay when we use a command like below, we just get the access token at once.
E.g.,
curl -v -k -X POST -H "Authorization: Basic MmdTYmc5NlBIc3hQcWZHT2lZWW1oSm9va2k4YTo0bEREM2M3TmNSWWZtaEZDZGlhVVdoQ3NEbE1h" -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" -d "grant_type=password&username=admin&password=admin" http://localhost:8280/token/
This is explained in [1] and [2]
[1] http://charithaka.blogspot.com/2013/07/oauth-20-grant-types-with-wso2-api.html
[2] http://charithaka.blogspot.com/2013/07/oauth-20-grant-types-with-wso2-api_16.html
Thursday, February 20, 2014
Thursday, January 30, 2014
Writing a simple Integration BPEL test case for WSO2 BPS
I assume the user has an idea about WSO2 BPS product. You can refer more information on :
http://wso2.com/products/business-process-server/
http://wso2.com/products/business-process-server/
Following are the steps to write a simple test case for a simple bpel process.
As an example adder.process.zip is being used to write a test case.
In this example assign activity of BPEL will be used. 2 values will be added and the input will be the result.
Since this is a Basic bpel activity, we will be including our test case inside,
../integration/org.wso2.bps.bpel.taftests/
/home/../turing/products/bps/3.2.0/modules/integration/org.wso2.bps.bpel.taftests/src/test/java/org/wso2/carbon/bps/bpelactivities/BPELBasicActivitiesTest.java
Steps :
1. First of all we should include our artifact inside the
/home/../turing/products/bps/3.2.0/modules/integration/org.wso2.bps.bpel.taftests/src/test/resources/artifacts/bpel folder.
2. Since its a Basic activity test case, I will be adding it under BPELBasicActivitiesTest.java in /home/../turing/products/bps/3.2.0/modules/integration/org.wso2.bps.bpel.taftests/src/test/java/org/wso2/carbon/bps/bpelactivities/BPELBasicActivitiesTest.java
3.
6. You can undeploy the uploaded zip file,
public class BPELBasicActivitiesTest extends BPSMasterTest {
//Extends the Test class
private static final Log log = LogFactory.getLog(BPELBasicActivitiesTest.class);
//Logs
BpelPackageManagementClient bpelPackageManagementClient;
RequestSender requestSender;
public void setEnvironment() throws LoginAuthenticationExceptionException, RemoteException {
init();
bpelPackageManagementClient = new BpelPackageManagementClient(backEndUrl, sessionCookie);
//Pass the Service endpoint and session cookie
requestSender = new RequestSender();
}
Above section will be available already since there were already written test cases.
(I assume it was being explained during the automation training. )
4. To set the environment with AdderProcess.zip we should provide the name of it to upload.
@BeforeClass(alwaysRun = true)
public void deployArtifact()
throws Exception {
setEnvironment();
uploadBpelForTest("AdderProcess");
}
5. Following is the added test case.
@Test(groups = {"wso2.bps", "wso2.bps.bpelactivities"}, description = "Adder Process case")
public void adderProcess() throws InterruptedException, RemoteException, PackageManagementException, MalformedURLException, XMLStreamException {
String payLoad = " <p:AdderProcessRequest xmlns:p=\"http://wso2.org/wso2con/2011/sample/adder\">\n" +
" <!--Exactly 1 occurrence--><p:a>1</p:a>\n" +
" <!--Exactly 1 occurrence--><p:b>2</p:b> " +
" </p:AdderProcessRequest>";
String operation = "process";
String serviceName = "AdderProcessService";
String expectedResult = "3";
requestSender.assertRequest(backEndUrl + serviceName, operation, payLoad,
1, expectedResult, true);
}
6. You can undeploy the uploaded zip file,
@AfterClass(alwaysRun = true)
public void removeArtifacts()
throws PackageManagementException, InterruptedException, RemoteException,
LogoutAuthenticationExceptionException {
bpelPackageManagementClient.undeployBPEL("AdderProcess");
this.authenticatorClient.logOut();
}
}
Explanation :
1. public void adderProcess() throws InterruptedException, RemoteException, PackageManagementException, MalformedURLException, XMLStreamException {
This above is the method written for adderProcess()
2.
String payLoad = " <p:AdderProcessRequest xmlns:p=\"http://wso2.org/wso2con/2011/sample/adder\">\n" +
" <!--Exactly 1 occurrence--><p:a>1</p:a>\n" +
" <!--Exactly 1 occurrence--><p:b>2</p:b> " +
" </p:AdderProcessRequest>";
String operation = "process";
String serviceName = "AdderProcessService";
String expectedResult = "3";
Above is the variable assignment.
payLoad is what we get from try it tool when you deploy the adderProcess in a BPS distribution.
operation can be checked by the wsdl of adderProcess when you deploy it in a BPS distribution. E.g., <operation name="process">
serviceName this can also be checked by the wsdl of adderProcess when you deploy it in a BPS distribution. E.g., <service name="AdderProcessService">
3. requestSender.assertRequest(backEndUrl + serviceName, operation, payLoad,
1, expectedResult, true);
The above is the request to be sent and assertRequest method is called.
Definition would be :
public void assertRequest(java.lang.String eprUrl, java.lang.String operation, java.lang.String payload, int numberOfInstances, java.lang.String expectedException, boolean twoWay) throws javax.xml.stream.XMLStreamException, org.apache.axis2.AxisFault { }
backEndUrl : This is the BPS backend URL
How to resolve WSO2 platform build failures come due to package does not exist
You can follow the steps on building Carbon by the link below :
http://docs.wso2.org/display/Carbon420/Building+from+Source
Following blog post is for the users who have fair knowledge in programming. Intended users will be Quality Assurance Engineers.
How to Isolate :
1. First of all, to isolate the problems you face, it is better to start building according to the modules defined in the pom.xml.
E.g.,
Open the pom.xml in ../platform/branches/turing/ product-releases/chunk-07
You will see the modules defined like below.
<modules>
<module>dependencies</module>
<module>service-stubs</module>
<module>components</module>
<module>platform-integration/ test-automation-framework</ module>
<module>features</module>
<module>products</module>
<module>platform-integration/ platform-automated-test-suite< /module>
</modules>
[ERROR] Failed to execute goal org.apache.maven.plugins: maven-compiler-plugin:2.3.2: compile (default-compile) on project sample-utils: Compilation failure: Compilation failure:
[ERROR] /home/ushani/Downloads/ Automation_TC/24_Jan_2014/ turing/products/bps/3.2.0/ modules/samples/product/ sample-utils/src/main/java/ org/wso2/bps/samples/util/ PasswordEncryptUtil.java:[23, 31] package org.apache.axiom.om.util does not exist
[ERROR] /home/ushani/Downloads/ Automation_TC/24_Jan_2014/ turing/products/bps/3.2.0/ modules/samples/product/ sample-utils/src/main/java/ org/wso2/bps/samples/util/ PasswordEncryptUtil.java:[58, 66] package org.bouncycastle.jce.provider does not exist
[ERROR] /home/ushani/Downloads/ Automation_TC/24_Jan_2014/ turing/products/bps/3.2.0/ modules/samples/product/ sample-utils/src/main/java/ org/wso2/bps/samples/util/ PasswordEncryptUtil.java:[84, 35] cannot find symbol
[ERROR] symbol : variable Base64
[ERROR] location: class org.wso2.bps.samples.util. PasswordEncryptUtil
[ERROR] -> [Help 1]
[ERROR] Failed to execute goal org.wso2.maven:carbon-p2- plugin:1.5.3:p2-repo-gen
(3-p2-repo-generation) on project wso2-bps-profile-gen: Error occured
when processing the Feature Artifact: org.wso2.bps:org.wso2.bps. samples.utils.feature:3.2.0: ERROR: Failure to find org.wso2.bps:org.wso2.bps. samples.utils.feature:zip:3.2. 0 in http://maven.wso2.org/nexus/ content/groups/wso2-public/
was cached in the local repository, resolution will not be reattempted
until the update interval of wso2-nexus has elapsed or updates are
forced
[ERROR]
/home/ushani/Downloads/ Automation_TC/24_Jan_2014/ turing/products/bps/3.2.0/ modules/samples/product/ sample-utils/pom.xml.
http://docs.wso2.org/display/Carbon420/Building+from+Source
Following blog post is for the users who have fair knowledge in programming. Intended users will be Quality Assurance Engineers.
How to Isolate :
1. First of all, to isolate the problems you face, it is better to start building according to the modules defined in the pom.xml.
E.g.,
Open the pom.xml in ../platform/branches/turing/
You will see the modules defined like below.
<modules>
<module>dependencies</module>
<module>service-stubs</module>
<module>components</module>
<module>platform-integration/
<module>features</module>
<module>products</module>
<module>platform-integration/
</modules>
Build one by one by the following command.
mvn clean install --fail-at-end fail-at-end will be used to continue the all modules bulding eventhough there is a build failure.
mvn clean install --fail-at-end fail-at-end will be used to continue the all modules bulding eventhough there is a build failure.
2. Imagine when you are building products you get an error like below.
[ERROR] Failed to execute goal org.apache.maven.plugins:
[ERROR] /home/ushani/Downloads/
[ERROR] /home/ushani/Downloads/
[ERROR] /home/ushani/Downloads/
[ERROR] symbol : variable Base64
[ERROR] location: class org.wso2.bps.samples.util.
[ERROR] -> [Help 1]
[ERROR] Failed to execute goal org.wso2.maven:carbon-p2-
[ERROR]
Identify the error, the affected place and the reason :
3. If you look at it properly, you see the error is in PasswordEncryptUtil.java class.
4. So the best thing is open the project in idea. from sample-utils/src/main/java/ org/wso2/bps/samples onwards.
5. you will see the class name with a red curly underline since there is an error in the class.
6. Go to the class and check what is wrong in it. As per the above error, issue was with the symbol
variable Base64
7. In the code the following line was in red, exposing it as an error.
String encodedString = Base64.encode(encryptedText);
String encodedString = Base64.encode(encryptedText);
8. Also there was another curly line in red mentioning the following import hasnt been done correctly.
import org.apache.axiom.om.util. Base64;
import org.apache.axiom.om.util.
Solutions :
Solution 1.
a. Either you can check in you .m2 , which is also known as the maven repository in your machine.
.m2
is a repository that is created in every one of your machine, if you
have installed maven properly. Whenever you need any dependencies, it
will automatically download in to your maven repository.
You can see your maven repo at the following place :
/home/<username>/.m2
/home/<username>/.m2
b. Go to .m2 and follow the import path correctly in the file location.
E.g.,
You should have a folder called axiom in the following file location.
/home/ushani/.m2/repository/ org/apache
/home/ushani/.m2/repository/
c.
if you don't have a folder that means the issue is because it hasn't
been downloaded properly. You can get it from someone else's .m2 repo
and replace you one or can check from which location it has been taken.
Sometimes axiom folder can be refereed from a different location.
if so you will have to provide the dependency manually in you pom.xml located in the related module.
E.g., I had the issue in sample-utils. So I will refer the pom.xml in that module.
/home/ushani/Downloads/
According to this the correct axiom is inside,
path : /home/ushani/.m2/repository/org/apache/ws/commons/axiom
Add the following dependency according to the correct location.
<dependency>
<groupId>org.apache.ws. commons.axiom</groupId>
<artifactId>axiom-api</ artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.apache.ws. commons.axiom</groupId>
<artifactId>axiom-impl</ artifactId>
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.apache.ws.
<artifactId>axiom-api</
<version>1.2.8</version>
</dependency>
<dependency>
<groupId>org.apache.ws.
<artifactId>axiom-impl</
<version>1.2.8</version>
</dependency>
Solution 2:
1.
Go near the issue underlined in red colour and get the your curosr top
of it and the help comes in the left corner of your code editor window.
It will give you suggestions.
If there is a
missing maven dependency it will ask whether to add. You have to click
that suggestion and provide the correct path which will come
automatically.
By this it will solve the problem and that dependency will be added in to your pom.xml automatically.
Wednesday, December 18, 2013
How to install Open JDK in Ubuntu
You can refer http://openjdk.java.net/
to know what is Open JDK. In this I will be installing Open jdk version 1.7.0_25
- You can download your referred version from http://www.oracle.com/technetwork/java/javase/downloads/index.html
- Once you download, uncompress the file using following
command
sudo tar -xvf jdk-7u25-<version>.tar.gz
JDK 7 package is extracted into /jdk1.7.0_25 directory.
- It is better to move the JDK 7 directory to /usr/lib via
following commands
sudo mv jdk1.7.0_25/ /usr/lib/jvm/jdk1.7.0_25
- Then run the following commands :
sudo update-alternatives --install “/usr/bin/javac” “javac” “/usr/lib/jvm/jdk1.7.0_25/bin/javac” 1
sudo update-alternatives --install “/usr/bin/javaws” “javaws” “/usr/lib/jvm/jdk1.7.0_25/bin/javaws” 1
- Then configure for the open jdk
For Java :
sudo update-alternatives --config java
This will output the following
There are 5 choices for the
alternative java (providing /usr/bin/java).
Selection Path
Priority Status
------------------------------------------------------------
0
/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 auto mode
1
/opt/java/jdk1.7.0_25/bin/java 1 manual
mode
2
/opt/java/jre1.7.0_25/bin/java 1 manual
mode
3
/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 manual
mode
* 4
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1051 manual
mode
5
/usr/lib/jvm/jdk1.7.0_25/bin/java 1 manual
mode
You have to
Press enter to keep
the current choice[*], or type selection number. In here I will be
entering * since I need the 4th option.
- For Javac :
sudo update-alternatives --config javac
This will output the following
There are 3 choices for the
alternative javac (providing /usr/bin/javac).
Selection Path
Priority Status
------------------------------------------------------------
0
/usr/lib/jvm/java-6-openjdk-amd64/bin/javac 1061 auto mode
1
/usr/lib/jvm/java-6-openjdk-amd64/bin/javac 1061 manual mode
* 2
/usr/lib/jvm/java-7-openjdk-amd64/bin/javac 1051 manual mode
3
/usr/lib/jvm/jdk1.7.0_25/bin/javac 1 manual mode
You have to
Press enter to keep
the current choice[*], or type selection number. In here I will be
entering * since I need the 2nd option.
- For Javaws :
sudo update-alternatives --config javaws
This will output the following
There are 3 choices for the
alternative javaws (providing /usr/bin/javaws).
Selection Path
Priority Status
------------------------------------------------------------
0
/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/javaws 1061 auto
mode
1
/usr/lib/jvm/java-6-openjdk-amd64/jre/bin/javaws 1061 manual
mode
* 2
/usr/lib/jvm/java-7-openjdk-amd64/jre/bin/javaws 1060 manual
mode
3
/usr/lib/jvm/jdk1.7.0_25/bin/javaws 1 manual
mode
You have to
Press enter to keep
the current choice[*], or type selection number. In here I will be
entering * since I need the 2nd option.
- Now you can check the java version
java -version
This will output the following if
the installation is successful :
java version "1.7.0_25"
OpenJDK Runtime Environment (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)
- Also you have to set JAVA_HOME in .bashrc.
Run the following command and open the .bashrc and give the correct path.
gedit ~/.bashrc
Add the following to the end of the file.
export JAVA_HOME=/usr/lib/jvm/java-1.7.0_25export PATH=$PATH:$JAVA_HOME/bin - Source the bash profile.
source ~/.bashrc
Sunday, November 3, 2013
How to Test JWT caching in WSO2 API Manager
How to Test JWT caching in API Manager
Before get in to this post
(http://ushanib.blogspot.com/2013/03/how-to-test-values-in-oauth2-token.html)
should be referred to know the steps to enable JWT token.
When you enable JWT token in a
distributed set up you should enable it in publisher node and the key
manager node.
This is enabled in publisher node because to change the API template accordingly.
Enable in keymanager node : To cache it in keymanager
This is enabled in publisher node because to change the API template accordingly.
Enable in keymanager node : To cache it in keymanager
But when you enable caching you will
have to enable it only in the key manager node.
Steps:
=====
- First you need to enable JWT token as explained in this post.
- To enable Caching you need to set “true” in the following parameter in the api-manager.xml in <AM_Home>/repository/conf.<EnableJWTCache>true</EnableJWTCache>
To Test :
======
- First without the caching enabled you can vie the results as explained in the post mentioned.
- Then to go to your My Application page as given in the below screenshot and edit the application name that you have subscribed to. E.g., In the above mentioned post, subscription is done to DefaultApplication. You can change the name of it as app1.
- Then send a API call request and follow the steps 11 to 15 as given in this post.
- You will see the changed app name fter decoding the encoded value as follows :
"http://wso2.org/claims/applicationname":"app1"
- Now enable the JWT caching as given in step 2 above and edit the app name as app2 and perform the above step 3 again.
Observation :
==========
- Once you decode, you will be able to see the application name as app1 still since the JWT caching is enabled and the app name will be taken from the cache.
- But if you disable JWT caching and do the same steps you will be able to see the changed app name.
- If you have enabled key manager or gateway caching with JWT caching still it will show you the cached app name. But if the JWT caching is disabled and gateway or key manager caching is enabled, you should not be able to see the app name changes since the JWT caching is disabled.
Thursday, September 5, 2013
WSO2 Governance Registry (GREG) Check-in Client
The Check-in Client is a tool used to replicate the
resources tree in the Governance Registry into your file-system or to a
dump file. Much like a version control system like Subversion (SVN), you can
do checkout, check-in and update operations using this tool.
To read more, check this link. http://docs.wso2.org/display/Governance451/Check-in+Client
This feature can be used in 2 ways.
1. Super Admin users.
2. Tenant users.
Role -Admin - Super Admin
==================
1. To checkout via admin, use the following command in bin.
sh checkin-client.sh co https://localhost:9443/registry/ -u admin -p admin
2. It will create a folder called _system.
3. To checkin a file you create inside governance, use the following steps.
First to create a file, go in to governance inside _system and,
vi readme_admin
It will create a file named readme_admin.
4. To add it to the repository, (you have to run checkin-client from the bin)
sh ../../checkin-client.sh add readme_admin https://localhost:9443/registry/ -u admin -p admin
or
sh ../../checkin-client.sh add readme_admin -u admin -p admin
5. To check the status,
sh ../../checkin-client.sh status
6. To commit the file,
sh ../../checkin-client.sh ci -u admin -p admin
For a different tenant/ Tenant User
======================
E.g., Tenant is created as ushani.com
A role inside ushani.com - ushaniR
users inside ushaniR - ushani/pwrd-ushani, ushani1/pwrd-ushani1
1. To checkout via a tenant, use the following command in bin.
sh checkin-client.sh co https://localhost:9443/t/ushani.com/registry -u ushani1 -p ushani1
2. To add a file in to repository,
sh ../../checkin-client.sh add readme_ushani1
3. To commit.,
sh ../../checkin-client.sh ci -u ushani1 -p ushani1
To read more, check this link. http://docs.wso2.org/display/Governance451/Check-in+Client
This feature can be used in 2 ways.
1. Super Admin users.
2. Tenant users.
Role -Admin - Super Admin
==================
1. To checkout via admin, use the following command in bin.
sh checkin-client.sh co https://localhost:9443/registry/ -u admin -p admin
2. It will create a folder called _system.
3. To checkin a file you create inside governance, use the following steps.
First to create a file, go in to governance inside _system and,
vi readme_admin
It will create a file named readme_admin.
4. To add it to the repository, (you have to run checkin-client from the bin)
sh ../../checkin-client.sh add readme_admin https://localhost:9443/registry/ -u admin -p admin
or
sh ../../checkin-client.sh add readme_admin -u admin -p admin
5. To check the status,
sh ../../checkin-client.sh status
6. To commit the file,
sh ../../checkin-client.sh ci -u admin -p admin
For a different tenant/ Tenant User
======================
E.g., Tenant is created as ushani.com
A role inside ushani.com - ushaniR
users inside ushaniR - ushani/pwrd-ushani, ushani1/pwrd-ushani1
1. To checkout via a tenant, use the following command in bin.
sh checkin-client.sh co https://localhost:9443/t/ushani.com/registry -u ushani1 -p ushani1
2. To add a file in to repository,
sh ../../checkin-client.sh add readme_ushani1
3. To commit.,
sh ../../checkin-client.sh ci -u ushani1 -p ushani1
Labels:
Check-in Client,
Governance Regisrty,
GREG,
WSO2
Tuesday, August 13, 2013
How to test Compression (gzip encoding) in WSO2 App Server server side response/During the deployment time.
1. First make sure echo service is deployed in your AS pack which you are going to test. (This will be available by deafult)
2. Then give the echo service wsdl as the endpoint and create a soap project. E.g., http://192.168.94.1:9763/services/echo?wsdl
3. Then Go to <AS_HOME>/repository/conf/tomcat and edit the catalina-server.xml.
4. Use the document http://tomcat.apache.org/tomcat-7.0-doc/config/http.html as reference.
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml,text/javascript,application/x-javascript,application/javascript,application/xml,text/css,application/xslt+xml,text/xsl,image/gif,image/jpg,image/jpeg"
If you want to disable gzip encoding, make compression="off". By default this will be on.
You have to provide the correct MimeType of your request. E.g., text/xml
5. Now start the AS server.
6. Open a tcp mon and open a port listening to 9764 and target point as 9763. Host name will be the host address of your AS, which is echo service is available. E.g., localhost/127.0.0.1
7. Go to SOAP Project created and open the echoString request editor.
8. Change the endpoint as it goes to the listen port we set in tcpmon.
http://192.168.94.1:9764/services/echo.echoHttpSoap11Endpoint/
9. Now send a request, (You can change this request by editing the "in" value as the string will be more than or lesser than compressionMinSize value and test more how these properties will work)
Request:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:echo="http://echo.services.core.carbon.wso2.org">
<soapenv:Header/>
<soapenv:Body>
<echo:echoString>
<!--Optional:-->
<in>abc</in>
</echo:echoString>
</soapenv:Body>
</soapenv:Envelope>
Response:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:echoStringResponse xmlns:ns="http://echo.services.core.carbon.wso2.org">
<return>abc</return>
</ns:echoStringResponse>
</soapenv:Body>
</soapenv:Envelope>
10. Now test the response headers via tcpmon or via soap raw values.
You should see the request and response headers as follows:
Request Header :
POST /services/echo.echoHttpSoap11Endpoint/ HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: multipart/related; type="text/xml"; start="<rootpart@soapui.org>"; boundary="----=_Part_0_1020577184.1376370045484"
SOAPAction: "urn:echoString"
MIME-Version: 1.0
Content-Length: 703
Host: 127.0.0.1:9764
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Response Header :
HTTP/1.1 200 OK
Content-Type: text/xml;charset=UTF-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Tue, 13 Aug 2013 05:00:45 GMT
Server: WSO2 Carbon Server
a
�
Note : You can test other parameters as well by using this sample
Subscribe to:
Posts (Atom)

