// Web content test
// written by Bernard Stepien
// bernard.stepien@sympatico.ca
// Note: the three test case examples are and adaptation in TCCN-3
// of the three examples drawn from the following paper:
//Rigorous and Automatic Testing of Web Applications
//Xiaoping Jia and Hongming Liu
//School of Computer Science, Telecommunication and Information Systems
///DePaul University
//Chicago, Illinois, USA
//email: fxjia, jordang@cs.depaul.edu
module dePaul_web_content_test
{
const integer maxDepth := 3;
type record of charstring HrefListType;
type record hyperlink_response_type
{
charstring status,
HrefListType hrefList
}
template charstring main_page_web_url := "file:web_page_1.html";
template hyperlink_response_type hyperlink_response :=
{
status := "HTTP/1.1 200 OK",
hrefList := ?
}
//template charstring program_page_web_url := "http://www.cs.depaul.edu/program";
template charstring program_page_web_url := "file:depaul_main_page.html";
template charstring testhref_page_web_url := "http://jordan.cs.depaul.edu/webtest/testhref.htm";
type record content_response_type
{
charstring status,
charstring content
}
template content_response_type content_response_pred :=
{
status := "HTTP/1.1 200 OK",
content := pattern "*
*"
}
template content_response_type content_response_quan_pred :=
{
status := "HTTP/1.1 200 OK",
//content := pattern "*
***********************/
testcase Link_Check_TC() runs on MTCType system SystemType {
var integer depth;
//var hyperlink_response_type theHyperlink_response;
var verdicttype theOverallVerdict;
map(mtc:web_port, system:system_web_port);
theOverallVerdict := CheckChildLink(main_page_web_url, 1);
setverdict(theOverallVerdict);
}
function CheckChildLink(charstring theURLLink, integer theDepth) runs on MTCType return verdicttype {
var hyperlink_response_type theHyperlink_response;
var charstring theBadResponse;
var verdicttype theFinalVerdict := pass;
var verdicttype oneVerdict;
log("testing link: " & theURLLink);
web_port.send(theURLLink);
alt
{
[] web_port.receive(hyperlink_response) -> value theHyperlink_response
{
if(theDepth <= maxDepth)
{
var integer theNewDepth;
var HrefListType theResponseHrefList := theHyperlink_response.hrefList;
var integer numOfLinks := sizeof(theResponseHrefList);
var integer i;
theNewDepth := theDepth + 1;
for(i:=0; i < numOfLinks; i:=i+1)
{
oneVerdict := CheckChildLink(theResponseHrefList[i], theNewDepth);
if(oneVerdict == fail)
{
theFinalVerdict := fail;
}
}
}
}
[] web_port.receive(charstring:?) -> value theBadResponse
{
log("the URL: " & theURLLink & " did not work, response: " & theBadResponse);
theFinalVerdict := fail;
}
}
return theFinalVerdict;
}
// end of example 1
// example 2
/***********************************
this test case check for a particular text or subtexts in the HTML body
****************************************/
testcase Content_check_pred_TC() runs on MTCType system SystemType {
var verdicttype theOverallVerdict;
map(mtc:web_port, system:system_web_port);
theOverallVerdict := CheckContent_pred(program_page_web_url, content_response_pred);
setverdict(theOverallVerdict);
}
// end of example 2
// example 3
/***********************************
this test case performs a look up of returned links for a particular protocol
********************************/
// end of example 3
function CheckContent_pred(charstring theURLLink, content_response_type theContent_response) runs on MTCType return verdicttype {
var charstring theBadResponse;
var verdicttype theFinalVerdict;
log ("in CheckContent_pred sending: " & theURLLink);
web_port.send(theURLLink);
alt
{
[] web_port.receive(theContent_response)
{
theFinalVerdict := pass;
}
[] web_port.receive(charstring:?) -> value theBadResponse
{
log("Bad Response: " & theBadResponse);
theFinalVerdict := fail;
}
}
return theFinalVerdict;
}
testcase Forall_protocol_check_TC(charstring theURLLink, charstring theProtocol) runs on MTCType system SystemType {
var hyperlink_response_type theHyperlink_response;
var charstring theBadResponse;
var boolean all_match;
map(mtc:web_port, system:system_web_port);
web_port.send(theURLLink);
alt
{
[] web_port.receive(hyperlink_response) -> value theHyperlink_response
{
var HrefListType theResponseHrefList := theHyperlink_response.hrefList;
var integer numOfLinks := sizeof(theResponseHrefList);
var integer i;
var integer theLength := lengthof(theProtocol);
all_match := true;
for(i:=0; i < numOfLinks; i:=i+1)
{
//if(substr(theResponseHrefList[i],0,theLength) != theProtocol)
if( match(theResponseHrefList[i], pattern "file:*")) {
all_match := true
}
else {
all_match := false;
log("link: " & theResponseHrefList[i] & " is not of protocol " & theProtocol);
}
}
if(all_match)
{
setverdict(pass);
}
else
{
setverdict(fail);
}
}
[] web_port.receive(charstring:?) -> value theBadResponse
{
log("the URL: " & theURLLink & " did not work, response: " & theBadResponse);
setverdict(fail);
}
}
}
control {
execute(Link_Check_TC());
execute(Content_check_pred_TC());
execute(Forall_protocol_check_TC(main_page_web_url, "file:"))
}
}