Wednesday, January 18, 2012

Python - Paramiko - Transport to negotiate SSH2 across the connection

Recently i got a task , where i need to connect to linux box,copy some files and run some shell scripts before i am going to validate my UI using selenium in my windows box.
I felt both are good to use
1. Python - paramiko
2. sshxcute

I want to share w.r.t paramiko,as for #2 , there are good examples available in the same site/page.


import paramiko
import ConfigParser
from config import *
import glob
import os
import md5


global ssh
dir_local = 'c:\paramikoLearn'
dir_remote = "/home/test"
filePattern = "*.txt"
 
def connectTo():
     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     ssh.connect(HOSTNAME, username=USERNAME, password=PASSWORD)

def closeConnection():
    ssh.close();
   

def copy():

# Get paramiko Transport to negotiate SSH2 across the connection  

    try:
        t = ssh.get_transport()
        print "Start client"
     
        if not t.is_authenticated():
            print "Connect Client"
            t.connect(username=USERNAME, password=PASSWORD)
            t.connect
            print "StartClient successful"
        else:
            sftp = t.open_session()
            print "StartClient successful"
       
        sftp = paramiko.SFTPClient.from_transport(t)
       
        # BETTER: use the get() and put() methods
        # for fname in os.listdir(dir_local):
       
        for  fname in glob.glob(dir_local + os.sep + filePattern):
            is_up_to_date = False
            if fname.lower().endswith('txt'):
                local_file = os.path.join(dir_local, fname)
                remote_file = dir_remote + '/' + os.path.basename(fname)
       
                #if remote file exists
                try:
                    if sftp.stat(remote_file):
                        local_file_data = open(local_file, "rb").read()
                        remote_file_data = sftp.open(remote_file).read()
                        md1 = md5.new(local_file_data).digest()
                        md2 = md5.new(remote_file_data).digest()
                        if md1 == md2:
                            is_up_to_date = True
                            print "UNCHANGED:", os.path.basename(fname)
                        else:
                            print "MODIFIED:", os.path.basename(fname),
                except:
                    print "NEW: ", os.path.basename(fname),
       
                if not is_up_to_date:
                    print 'Copying', local_file, 'to ', remote_file
                    sftp.put(local_file, remote_file)
                   
        t.close()
   
    except Exception as e:
        print '*** Caught exception: %s: %s' % (e.__class__, e)
        try:
            t.close()
        except:
            pass
   
def executeShellScript():
   return ssh.exec_command("ls -l")


if __name__ == '__main__':
   
    ssh = paramiko.SSHClient()
    try:
        connectTo()
        output = executeShellScript()
        print output[1].read()
        closeConnection()
       
    except:
        closeConnection()
    ************
In my junit testscript by using RunTime,Process i was able to run the python script and able to complete the task. :)
   

Wednesday, January 4, 2012

How to find the differences between two xml files

When i was struggling with  comparing two xml files by writing lot of Code , i came to know about XMLUnit.
Take a look at this cool code ( copied from http://xmlunit.sourceforge.net/api/overview-summary.html)
XMLUnit provides extensions to the JUnit framework to allow assertions to be made about XML content.

Using XMLUnit

  1. Create a subclass of XMLTestCasesomething like this:
    public class TestSomething extends XMLTestcase {
        // standard JUnit style constructor
        public TestSomething(String name) {
            super(name);
        }
        // standard JUnit style method
        public static TestSuite suite() {
            return new TestSuite(TestSomething.class);
        }
    }
    
  2. Set the global JAXP settings in XMLUnitso that your chosen parser and transformer are used for the tests.
    Note:You can skip this bit if you use the default JAXP settings or you have an Ant task that uses-D JVM options to specify the JAXP settings.
    // set the JAXP factories to use the Xerces parser
        // - declare to throw Exception as if this fails then all the tests will
        // fail, and JUnit copes with these Exceptions for us
        public void setUp() throws Exception {
            XMLUnit.setControlParser(
                "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
            // this next line is strictly not required - if no test parser is
            // explicitly specified then the same factory class will be used for
            // both test and control
            XMLUnit.setTestParser(
                "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
    
            XMLUnit.setSAXParserFactory(
                "org.apache.xerces.jaxp.SAXParserFactoryImpl");
            XMLUnit.setTransformerFactory(
                "org.apache.xalan.processor.TransformerFactoryImpl");
        }
    
  3. Add test methods to make your assertions: theXMLTestCase javadoc lists the available assertion methods and their usage, but here are some examples...
    public void testObjectAsXML() throws Exception {
            String expectedXML = "....";
            String objectAsXML = null;
            //...set up some object here and serialize its state into
            //our test String...
            assertXMLEqual(expectedXML, objectAsXML);
        }
    
        public void testTransformToFormatB() throws Exception {
            String expectedFormatB = "....";
            String formatA = "....";
            String transformXSLT = "....";
            Transform formatAToFormatB = new Transform(formatA, transformXSLT);
            assertXMLEqual(new Diff(expectedFormatB, formatAToFormatB), true);
        }
    
        public void testIsValidAfterTransform() throws Exception {
            String incomingMessage = "....";
            String toSourceSystemXSLT = "....";
            Transform transform = new Transform(incomingMessage, toSourceSystemXSLT);
            assertXMLValid(transform.getResultString());
        }
    
        public void testXpaths() throws Exception {
            String ukCustomerContactPhoneNos = "//customer[@country='UK']/contact/phone";
            String customerExtract1 = "....";
            String customerExtract2 = "....";
            assertXpathsNotEqual(ukCustomerContactPhoneNos, customerExtract1,
                ukCustomerContactPhoneNos, customerExtract2);
        }
    
        public void testXpathValues() throws Exception {
            String firstListItem = "/html/body/div[@id='myList']/h1/ol/li[1]";
            String secondListItem = "/html/body/div[@id='myList']/h1/ol/li[2]";
            String myHtmlPage = "....";
            assertXpathValuesNotEqual(firstListItem, secondListItem, myHtmlPage);
        }
    
        public void testSpecificXpath() throws Exception {
            String todaysTop10 = "count(//single[@topTen='true'])";
            String playlist = "....";
            assertXpathEvaluatesTo("10", todaysTop10, playlist);
    
        }
    

Selenium2 webelement.click is not working in Internet Explorer

There is some issue with few versions of IE (includes OS).
we can use webelement.sendKeys("\n") instead of webelement.click();