Skip to content
Snippets Groups Projects
run.sh 23.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • tpylak's avatar
    tpylak committed
    #!/bin/sh
    # author: Tomasz Pylak, 2007-09-27
    # Implementation assumptions:
    # - the current directory after calling a function does not change
    
    
    # ----------------------------- configuration
    
    TIME_TO_COMPLETE=60 # time (in seconds) needed by the whole pipeline to process everything
    
    SVN_PATHS="/opt/local/bin /usr/bin"
    LSOF_PATHS="/usr/sbin"
    
    TRUE=1
    FALSE=0
    
    tpylak's avatar
    tpylak committed
    
    # all paths are relative to the template directory
    TEMPLATE=templates
    
    ribeaudc's avatar
    ribeaudc committed
    TARGETS=targets
    
    ribeaudc's avatar
    ribeaudc committed
    WORK=$TARGETS/playground
    INSTALL=$TARGETS/install
    
    tpylak's avatar
    tpylak committed
    
    
    LIMS_SERVER_NAME=openBIS-server
    
    tpylak's avatar
    tpylak committed
    LIMS_SERVER=$WORK/$LIMS_SERVER_NAME
    
    LIMS_CLIENT_NAME=openBIS-client
    
    tpylak's avatar
    tpylak committed
    LIMS_CLIENT=$WORK/$LIMS_CLIENT_NAME
    
    DATA=$WORK/data
    ERR_LOG=$WORK/all_err_log.txt
    
    
    # ---- global state
    TEST_FAILED=false # working variable, if true then some tests failed
    
    
    # --------------------------- build distributions from sources
    
    tpylak's avatar
    tpylak committed
    
    
    function get_env_path {
        echo $PATH | tr ":" " "
    }
    
    
    ribeaudc's avatar
    ribeaudc committed
    # looks for a specified file in environment paths and paths given as a parameter (space separated)
    
    function locate_file {
        local file=$1
        shift
        local additional_paths=$@
        for dir in `get_env_path` $additional_paths; do 
    	local full_path=$dir/$file
    	if [ -f $full_path ]; then
        	    echo $full_path;
    	    return
    	fi 
        done
    }
    
    function run_svn {
        `locate_file svn $SVN_PATHS` $@
    }
    
    
    tpylak's avatar
    tpylak committed
    function build_zips {
    
        build_etl=$1
        build_dmv=$2
        build_lims=$3
        use_local_source=$4
    
        if [ $build_etl == "true" -o $build_dmv == "true" -o $build_lims == "true" ]; then
            mkdir -p $INSTALL
    	if [ "$use_local_source" = "true" ]; then
        	    build_zips_from_local $build_etl $build_dmv $build_lims
            else
    	    build_zips_from_svn $build_etl $build_dmv $build_lims
    	fi
        else
    	echo "No components to build were specified (--help explains how to do this)."
    	echo "Build process skipped."
        fi
        assert_file_exists_or_die "$INSTALL/openBIS-server*.zip"
        assert_file_exists_or_die "$INSTALL/openBIS-client*.zip"
        assert_file_exists_or_die "$INSTALL/etlserver*.zip"
        assert_file_exists_or_die "$INSTALL/datamover*.zip"
    
    }
    
    function build_zips_from_local {
        build_etl=$1
        build_dmv=$2
        build_lims=$3
    
        build_components build_local $build_etl $build_dmv $build_lims
    }
    
    function build_local {
        local PROJECT_NAME=$1
        $LOCAL_PROJECTS/$PROJECT_NAME/build/antrun.sh
        mv $LOCAL_PROJECTS/$PROJECT_NAME/targets/dist/*.zip $INSTALL
    }
    
    function build_components {
        build_cmd=$1
        build_etl=$2
        build_dmv=$3
        build_lims=$4
    
        if [ $build_etl == "true" ]; then
    	rm -f $INSTALL/etlserver*.zip
            $build_cmd etlserver
        fi
        if [ $build_dmv == "true" ]; then
    	rm -f $INSTALL/datamover*.zip
    	$build_cmd datamover
        fi
        if [ $build_lims == "true" ]; then
    	rm -f $INSTALL/openBIS-server*.zip
    	rm -f $INSTALL/openBIS-client*.zip
            $build_cmd lims_webclient
        fi
    }
    
    
    tpylak's avatar
    tpylak committed
    function build_remote {
        local RSC=$1
        local PROJECT_NAME=$2
        
        cd $RSC
        ./build.sh $PROJECT_NAME
        cd ..
    }
    
    
    function build_zips_from_svn {
        build_etl=$1
        build_dmv=$2
        build_lims=$3
    
    
    tpylak's avatar
    tpylak committed
        RSC=build_resources
        rm -fr $RSC
    
        run_svn checkout svn+ssh://source.systemsx.ch/repos/cisd/build_resources/trunk $RSC
    
    tpylak's avatar
    tpylak committed
        build_components "build_remote $RSC" $build_etl $build_dmv $build_lims
    
    tpylak's avatar
    tpylak committed
        mv $RSC/*.zip $INSTALL
        rm -fr $RSC 
    }
    
    
    # -------------------------- installation
    
    
    tpylak's avatar
    tpylak committed
    function clean_svn {
        local DIR=$1
        for file in `find $DIR -name ".svn"`; do 
    	rm -fr $file; 
        done
    }
    
    
    tpylak's avatar
    tpylak committed
    function copy_templates {
        local template_dir=$1
    
    tpylak's avatar
    tpylak committed
        cp -fR $TEMPLATE/$template_dir $WORK
        clean_svn $WORK/$template_dir
    
    tpylak's avatar
    tpylak committed
    function prepare {
        src=$1
        dest=$2
    
    tpylak's avatar
    tpylak committed
        cp -R $WORK/$src $WORK/$dest
    
    tpylak's avatar
    tpylak committed
        copy_templates $dest
    
    tpylak's avatar
    tpylak committed
    }
    
    function unpack { # from ZIPS to BUILD
    
    tpylak's avatar
    tpylak committed
        unzip -d $WORK $INSTALL/$file_pattern*
    }
    
    function remove_unpacked {
        rm -fR $WORK/$1
    }
    
    
    function run_lsof {
        `locate_file lsof $LSOF_PATHS` $@
    }
    
    
    tpylak's avatar
    tpylak committed
    function check_server_port {
    
        run_lsof -i -n -P | grep 8443
    
    tpylak's avatar
    tpylak committed
    }
    
    function wait_for_server {
        echo -n "Server starting"
        i=0; 
        while [ "`check_server_port`" == "" -a $i -lt 5 ]; do 
    	sleep 2; 
    	echo -n "."; 
    	let i=$i+1; 
        done
        if [ "`check_server_port`" == "" ]; then
    	report_error "Server could not be started!"
    	exit 1
        else
    	echo "...[Done]"
        fi
    }
    
    function install_lims_server {
    
    tpylak's avatar
    tpylak committed
        local install_lims=$1
    
        if [ $install_lims == "true" ]; then
            rm -fr $LIMS_SERVER
    	copy_templates $LIMS_SERVER_NAME
    
    tpylak's avatar
    tpylak committed
        
    
    tpylak's avatar
    tpylak committed
            unzip -d $LIMS_SERVER $INSTALL/openBIS-server*.zip
    	$LIMS_SERVER/openBIS-server/install.sh $PWD/$LIMS_SERVER $LIMS_SERVER/service.properties $LIMS_SERVER/roles.conf
    	wait_for_server
        else
            copy_templates $LIMS_SERVER_NAME
            restart_lims
        fi
    
    tpylak's avatar
    tpylak committed
    }
    
    
    function startup_lims_server {
        call_in_dir bin/startup.sh $LIMS_SERVER/apache-tomcat
        wait_for_server
    }
    
    function shutdown_lims_server {
        if [ "`check_server_port`" != "" ]; then
            $LIMS_SERVER/apache-tomcat/bin/shutdown.sh
        fi
    }
    
    function register_cell_plates {
    
        assert_dir_exists_or_die $LIMS_CLIENT
    
    tpylak's avatar
    tpylak committed
        call_in_dir load-lims-data.sh $LIMS_CLIENT
    }
    
    function install_lims_client {
    
    tpylak's avatar
    tpylak committed
        local install_lims=$1
    
        if [ $install_lims == "true" ]; then
            rm -fr $WORK/$LIMS_CLIENT_NAME
    	unpack openBIS-client
        fi
    
    tpylak's avatar
    tpylak committed
        cp -fR $TEMPLATE/$LIMS_CLIENT_NAME $WORK
    }
    
    # unpack everything, override default configuration with test configuation	
    function install_etls {
    
    tpylak's avatar
    tpylak committed
        local install_etl=$1
        if [ $install_etl == "true" ]; then
            unpack etlserver
    	prepare etlserver etlserver-all
    	remove_unpacked etlserver
        else
    	copy_templates etlserver-all    
        fi
    
    tpylak's avatar
    tpylak committed
    }
    
    function install_datamovers {
    
    tpylak's avatar
    tpylak committed
        local install_dmv=$1
        if [ $install_dmv == "true" ]; then
            unpack datamover
    	prepare datamover datamover-raw
    
            prepare datamover datamover-analysis
    
    tpylak's avatar
    tpylak committed
    	remove_unpacked datamover
    	cp -fR $TEMPLATE/dummy-img-analyser $WORK
        else 
    	copy_templates datamover-raw
    
    	copy_templates datamover-analysis
    
    tpylak's avatar
    tpylak committed
        fi
    
    tpylak's avatar
    tpylak committed
    }
    
    function restart_lims {
    
        assert_dir_exists_or_die $LIMS_SERVER
    
    tpylak's avatar
    tpylak committed
        shutdown_lims_server
        sleep 1
        startup_lims_server
        sleep 4
    
    tpylak's avatar
    tpylak committed
        local install_etl=$1
        local install_dmv=$2
        local install_lims=$3
    
    tpylak's avatar
    tpylak committed
        install_etls $install_etl
        install_datamovers $install_dmv
        install_lims_client $install_lims
        install_lims_server	$install_lims
    
    
    tpylak's avatar
    tpylak committed
        register_cell_plates
    }
    
    
    tpylak's avatar
    tpylak committed
    # ----------------------------- general
    
    # calls $cmd script, changing directory to $dir
    function call_in_dir {
        cmd=$1
        dir=$2
        
        prev=$PWD
        cd $dir
        sh $cmd
        cd $prev
    }
    
    function is_empty_dir {
        dir=$1
        if [ "`ls $dir`" = "" ]; then
    	return 1;
        else
    	return 0;
        fi
    }
    
    # ----------------------------- assertions
    
    
    function init_log {
        rm -fr $ERR_LOG
    }
    
    
    tpylak's avatar
    tpylak committed
    function report_error {
        local msg=$@
    
    
        echo [ERROR] $msg | tee -a $ERR_LOG >&2
    
    tpylak's avatar
    tpylak committed
        TEST_FAILED="true"
    }
    
    function exit_if_assertion_failed {
        if [ "$TEST_FAILED" = "true" ]; then
    	report_error Test failed.
    	exit 1;
        else
    	echo [OK] Test was successful!
        fi
    }
    
    
    function assert_file_exists {
        local file=$1
        if [ ! -f "$file" ]; then
    	report_error File $file does not exist!  
    
    felmer's avatar
    felmer committed
        else
    	echo [OK] File $file exists
    
    felmer's avatar
    felmer committed
    function assert_same_inode {
        local file1=$1
        local file2=$2
        
        if [ $file1 -ef $file2 ]; then
            echo [OK] $file1 and $file2 have the same inode number.
        else
            report_error "$file1 and $file2 do not have the same inode number."
        fi
    }
    
    
    tpylak's avatar
    tpylak committed
    function assert_dir_exists {
        local DIR=$1
        if [ ! -d "$DIR" ]; then
    
    	report_error Directory $DIR does not exist!  
    
    tpylak's avatar
    tpylak committed
        else
    
    	echo [OK] Directory $DIR exists
    
    tpylak's avatar
    tpylak committed
        fi
    }
    
    
    tpylak's avatar
    tpylak committed
        local MSG=$@
    
    tpylak's avatar
    tpylak committed
    # remember to pass the parameter in quote marks
    
    function assert_file_exists_or_die {
        local F="$1"
    
    tpylak's avatar
    tpylak committed
        local files_num=`ls -1 $F 2> /dev/null | wc -l`
        if [ $files_num -gt 1 ]; then
    	fatal_error "One file expected for pattern $F, but more found: " $F
        else 
    	if [ ! -f $F ]; then
    	    fatal_error "No file matching pattern $F exists"
    	fi
    
        fi
    }
    
    function assert_dir_exists_or_die {
        local DIR=$1
        if [ ! -d $DIR ]; then
    	fatal_error "Directory $DIR does not exist!"
        fi
    }
    
    
    tpylak's avatar
    tpylak committed
    function assert_dir_empty {
        dir=$1
        is_empty_dir $dir
        empty=$?
        if [ $empty == 0 ]; then
    	report_error Directory \'$dir\' should be empty!
        fi
    }
    
    
    function assert_same_content {
        local expected_file=$1
        local actual_file=$2
        cmd="diff --exclude=\.svn -r $expected_file $actual_file"
        supress=`eval $cmd`
        is_different=$?
        if [ $is_different == 1 ]; then
            report_error "Different content in $expected_file (marked by '<') and $actual_file (marked by '>')"
            eval $cmd
    
    felmer's avatar
    felmer committed
        else
            echo "[OK] Same content in $expected_file and $actual_file"
    
    felmer's avatar
    felmer committed
        local message=$1
    
    felmer's avatar
    felmer committed
        local expected_text=$2
        local actual_text=$3
    
        if [ "$expected_text" != "$actual_text" ]; then
    
    felmer's avatar
    felmer committed
            report_error "$message: expected: <$expected_text> but was: <$actual_text>"
    
        fi
    }
    
    function assert_equals_as_in_file {
        local expected_text=$1
        local file_with_actual_text=$2
        
        assert_file_exists $file_with_actual_text
    
    felmer's avatar
    felmer committed
        assert_equals "Content of file $file_with_actual_text" "$expected_text" "`cat $file_with_actual_text`"
    
    tpylak's avatar
    tpylak committed
    
    function assert_pattern_present {
      local file=$1
      local occurences=$2
      local pattern=$3
    
    
      assert_file_exists $file
    
    tpylak's avatar
    tpylak committed
      echo Matched lines: 
      cat $file | grep "$pattern"  
      local lines=`cat $file | grep "$pattern" | wc -l`
      if [ $lines != $occurences ]; then
    	report_error $lines instead of $occurences occurences of pattern $pattern found!
      else
    	echo [OK] $occurences occurences of pattern $pattern found
      fi 
    }
    
    # ----------------------- Test data
    
    
    function generate_test_data {
        echo Generate incoming data
        local DIR=$DATA/in-raw
    
        
        # drop an identifyable valid data set
        copy_test_data 3VCP1 $DIR
        sleep 30
        
        # drop 3VCP1 twice which should yield an error (same external data set code)
    
        copy_test_data 3VCP1 $DIR
    
        
        # drop an identifyable invalid data set (wrong image name, missing plate)
    
        copy_test_data 3VCP3 $DIR
    
        
        # drop an identifyable invalid data set (missing TIFF folder)
    
        copy_test_data 3VCP4 $DIR
    
        
        # drop an unidentifyable data set
    
        copy_test_data UnknownPlate $DIR
    
    felmer's avatar
    felmer committed
        sleep 30
    
    felmer's avatar
    felmer committed
        
    
        # drop 3VCP1 again but this time it is a valid data set
    
    felmer's avatar
    felmer committed
        copy_test_data 3VCP3 $DATA
        mv $DATA/3VCP3/TIFF/blabla_3VCP1_K13_8_w460.tif  $DATA/3VCP3/TIFF/blabla_3VCP3_K13_8_w460.tif
    
    felmer's avatar
    felmer committed
        echo image for well M03 > $DATA/3VCP3/TIFF/blabla_3VCP3_M03_2_w350.tif
    
    felmer's avatar
    felmer committed
        mv $DATA/3VCP3 $DIR 
    
    tpylak's avatar
    tpylak committed
    }
    
    
    tpylak's avatar
    tpylak committed
        local NAME=$1
        local DIR=$2
    
    tpylak's avatar
    tpylak committed
        cp -RPp $TEST_DATA/$NAME $DIR
    
    tpylak's avatar
    tpylak committed
    }
    
    
    # ----------------------- Launching 
    
    
    function chmod_exec {
        for file in $@; do
            if [ -f $file ]; then
    	    chmod u+x $file
    	fi
        done 
    }
    
    
    tpylak's avatar
    tpylak committed
    function switch_sth {
        switch_on=$1 # on/off
        dir=$WORK/$2
        cmd_start=$3
        cmd_stop=$4
    
        report_error=$5
    
        chmod_exec $dir/$cmd_start
        chmod_exec $dir/$cmd_stop
    
    tpylak's avatar
    tpylak committed
    
        if [ "$switch_on" == "on" ]; then
    	echo "Launching $dir..."
    	rm -fr $dir/log/*
    
    	call_in_dir "$cmd_start" $dir
    
    tpylak's avatar
    tpylak committed
        else
    	echo "Stopping $dir, displaying errors from the log"
    	if [ "`cat $dir/log/* | grep ERROR | tee -a $ERR_LOG`" != "" ]; then
    
    tpylak's avatar
    tpylak committed
    	    if [ $report_error -eq $TRUE ]; then
    
    	        report_error $dir reported errors.
    
    felmer's avatar
    felmer committed
    	        cat $dir/log/* | grep ERROR >&2    
    
    tpylak's avatar
    tpylak committed
    	fi
    
    	call_in_dir "$cmd_stop" $dir
    
    tpylak's avatar
    tpylak committed
        fi
    }
    
    
    tpylak's avatar
    tpylak committed
    function switch_etl {
    
        switch_sth $1 $2 etlserver.sh shutdown.sh $FALSE
    
    tpylak's avatar
    tpylak committed
    }
    
    function switch_dmv {
    
        switch_sth $1 $2 "datamover.sh start" "datamover.sh stop" $TRUE
    
    tpylak's avatar
    tpylak committed
    }
    
    function switch_processing_pipeline {
        new_state=$1
    
        switch_etl $new_state etlserver-all
    
        switch_dmv $new_state datamover-analysis
    
        switch_sth $new_state dummy-img-analyser start.sh stop.sh $TRUE
    
    tpylak's avatar
    tpylak committed
        switch_dmv $new_state datamover-raw
    }
    
    
    function launch_tests {
        switch_processing_pipeline "on"
        sleep 4
    
        generate_test_data
    
        sleep $TIME_TO_COMPLETE
    
    tpylak's avatar
    tpylak committed
    
        switch_processing_pipeline "off"
    }
    
    
    function assert_correct_experiment_info {
        echo ==== assert correct experiment info ====
    
    tpylak's avatar
    tpylak committed
        local res=$WORK/client-result.txt
        call_in_dir check-results.sh $LIMS_CLIENT/ > $res
    
        assert_pattern_present $res 1 "Processing instruction for procedure type 'DATA_ACQUISITION'"
        assert_pattern_present $res 1 "Path: processing-dir"
        assert_pattern_present $res 1 "Description: Processing parameters from file .*processing-parameters.txt"
    
    felmer's avatar
    felmer committed
        assert_pattern_present $res 2 ".*NEMO.*EXP1.*IMAGE\/.*3VCP[[:digit:]].*microX.*3VCP[[:digit:]]" 
    
    felmer's avatar
    felmer committed
        assert_pattern_present $res 5 ".*NEMO.*EXP1.*IMAGE_ANALYSIS_DATA.*3VCP[[:digit:]].*microX.*3VCP[[:digit:]]" 
    
    tpylak's avatar
    tpylak committed
    
    
    }
    
    function assert_empty_in_out_folders {
        echo ==== assert empty in/out folders ====
    
    tpylak's avatar
    tpylak committed
        assert_dir_empty $DATA/in-raw
    
        assert_dir_empty $DATA/in-analysis
        assert_dir_empty $DATA/out-analysis
        assert_dir_empty $DATA/analysis-copy
    
    }
    
    function assert_correct_content_of_processing_dir {
        echo ==== assert correct content of processing-dir ====
    
        local data_set=$DATA/processing-dir/microX-3VCP1_microX_200801011213_3VCP1
    
    felmer's avatar
    felmer committed
        assert_same_content $TEST_DATA/3VCP1 $data_set
    
        assert_same_content $TEMPLATE/openBIS-client/testdata/register-experiments/processing-parameters.txt \
                            $DATA/processing-dir/processing-parameters-from-openbis
    
        local bds_container=$DATA/main-store/Group_CISD/Project_NEMO/Experiment_EXP1/ObservableType_HCS_IMAGE/Barcode_3VCP1/1/microX_200801011213_3VCP1
    
    felmer's avatar
    felmer committed
        local data_set2=$bds_container/data/original/microX_200801011213_3VCP1
        assert_same_inode $data_set/TIFF/blabla_3VCP1_K13_8_w460.tif $data_set2/TIFF/blabla_3VCP1_K13_8_w460.tif
        assert_same_inode $data_set/TIFF/blabla_3VCP1_M03_2_w530.tif $data_set2/TIFF/blabla_3VCP1_M03_2_w530.tif
    
    tpylak's avatar
    tpylak committed
    }
    
    
    function assert_correct_content_of_plate_3VCP1_in_store {
        local cell_plate=3VCP1
        echo ==== assert correct content of plate 3VCP1 in store ====
        
    
        local main_dir=$DATA/main-store/Group_CISD/Project_NEMO/Experiment_EXP1
    
        local raw_data_dir=$main_dir/ObservableType_HCS_IMAGE/Barcode_3VCP1/1
    
        assert_dir_exists $raw_data_dir
        local raw_data_set=$raw_data_dir/microX_200801011213_3VCP1
        assert_dir_exists $raw_data_set
        
    
    felmer's avatar
    felmer committed
        echo == check data structure version
        assert_equals_as_in_file 1 $raw_data_set/version/major
    
    felmer's avatar
    felmer committed
        assert_equals_as_in_file 0 $raw_data_set/version/minor
    
        echo == check annotations
        local annotations_dir="$raw_data_set/annotations"
        assert_dir_exists "$annotations_dir"
        assert_equals_as_in_file 460 $annotations_dir/channel1/wavelength
        assert_equals_as_in_file 530 $annotations_dir/channel2/wavelength
        
        echo == check original data
        local original_data_set=$raw_data_set/data/original/microX_200801011213_3VCP1
        assert_dir_exists $original_data_set
        assert_same_content $TEST_DATA/3VCP1 $original_data_set
        
        echo == check standard data
        local standard_dir=$raw_data_set/data/standard
        assert_dir_exists $standard_dir
    
    felmer's avatar
    felmer committed
        assert_same_inode $original_data_set/TIFF/blabla_3VCP1_K13_8_w460.tif \
                          $standard_dir/channel1/row11/column13/row3_column2.tiff
        assert_same_inode $original_data_set/TIFF/blabla_3VCP1_M03_2_w530.tif \
                          $standard_dir/channel2/row13/column3/row1_column2.tiff
    
    felmer's avatar
    felmer committed
                            
        echo == check metadata
        local metadata_dir=$raw_data_set/metadata
        assert_dir_exists $metadata_dir
    
    felmer's avatar
    felmer committed
        assert_equals_as_in_file 3V $metadata_dir/experiment_identifier/group_code
        assert_equals_as_in_file NEMO $metadata_dir/experiment_identifier/project_code
        assert_equals_as_in_file EXP1 $metadata_dir/experiment_identifier/experiment_code
    
    ribeaudc's avatar
    ribeaudc committed
        assert_file_exists $metadata_dir/experiment_registration_timestamp
    
    felmer's avatar
    felmer committed
        assert_file_exists $metadata_dir/experiment_registrator/email
        assert_file_exists $metadata_dir/experiment_registrator/first_name
        assert_file_exists $metadata_dir/experiment_registrator/last_name
    
    ribeaudc's avatar
    ribeaudc committed
        assert_equals_as_in_file HCS_IMAGE $metadata_dir/format/code
    
    felmer's avatar
    felmer committed
        assert_equals_as_in_file 1 $metadata_dir/format/version/major
        assert_equals_as_in_file 0 $metadata_dir/format/version/minor
        assert_pattern_present $metadata_dir/md5sum/original 1 ".* microX_200801011213_3VCP1/log.txt"
        assert_pattern_present $metadata_dir/md5sum/original 1 ".* microX_200801011213_3VCP1/TIFF/blabla_3VCP1_K13_8_w460.tif"
        assert_pattern_present $metadata_dir/md5sum/original 1 ".* microX_200801011213_3VCP1/TIFF/blabla_3VCP1_M03_2_w530.tif"
        assert_pattern_present $metadata_dir/md5sum/original 1 ".* microX_200801011213_3VCP1/TIFF/readme-not.txt"
    
    ribeaudc's avatar
    ribeaudc committed
        assert_equals_as_in_file 3VCP1 $metadata_dir/sample/code
        assert_equals_as_in_file 'CELL_PLATE' $metadata_dir/sample/type_code
        assert_equals_as_in_file 'Screening Plate' $metadata_dir/sample/type_description
    
        assert_file_exists $metadata_dir/standard_original_mapping
        
        echo == check format parameters
        local parameters_dir=$metadata_dir/parameters
        assert_dir_exists $parameters_dir
        assert_equals_as_in_file true $parameters_dir/contains_original_data
        assert_equals_as_in_file 2 $parameters_dir/number_of_channels
        assert_equals_as_in_file 24 $parameters_dir/plate_geometry/columns
        assert_equals_as_in_file 16 $parameters_dir/plate_geometry/rows
        assert_equals_as_in_file 3 $parameters_dir/well_geometry/columns
        assert_equals_as_in_file 3 $parameters_dir/well_geometry/rows
    
    }
    
    function assert_correct_content_of_invalid_plate_in_store {
        local cell_plate=$1
    
        echo ==== assert correct content of invalid plate $cell_plate in store ====
    
        local error_dir=$DATA/main-store/Group_CISD/error/ObservableType_HCS_IMAGE
    
    felmer's avatar
    felmer committed
        local data_set=$error_dir/microX_200801011213_$cell_plate
        assert_same_content $TEST_DATA/$cell_plate $data_set
        assert_file_exists $data_set.exception
    
        assert_dir_empty $DATA/main-store/Group_CISD/Project_NEMO/Experiment_EXP1/ObservableType_HCS_IMAGE/Barcode_$cell_plate
    
    }
        
    function assert_correct_content_of_image_analysis_data {
        local cell_plate=$1
        
    
        echo ====  check image analysis data for cell plate $cell_plate ====
    
        local img_analysis=$DATA/main-store/Group_CISD/Project_NEMO/Experiment_EXP1/ObservableType_HCS_IMAGE_ANALYSIS_DATA/Barcode_$cell_plate/1
    
        assert_dir_exists $img_analysis
        assert_same_content $TEST_DATA/$cell_plate $img_analysis/microX_200801011213_$cell_plate
    }
    
    function assert_correct_content_of_unidentified_plate_in_store {
        local cell_plate=$1
        echo ==== assert correct content of unidentified plate $cell_plate in store ====
        
    
        local unidentified_dir=$DATA/main-store/Group_CISD/unidentified
    
        assert_dir_exists $unidentified_dir
    
        assert_same_content $TEST_DATA/$cell_plate $unidentified_dir/ObservableType_HCS_IMAGE/microX_200801011213_$cell_plate
        assert_same_content $TEST_DATA/$cell_plate $unidentified_dir/ObservableType_HCS_IMAGE_ANALYSIS_DATA/microX_200801011213_$cell_plate
    
    function assert_correct_dataset_content_in_database {
        local dataset_id=$1
        local pattern=$2
    
        local dataset=`psql -U postgres -d lims_integration_test \
    
           -c "select d.id, pt.code as procedure_type, d.code, d.is_placeholder, r.data_id_parent, \
                      d.data_producer_code, d.production_timestamp \
               from data as d left join data_set_relationships as r on r.data_id_child = d.id, 
                    procedures as p join procedure_types as pt on pt.id = p.pcty_id 
               where p.id = d.proc_id_produced_by and d.id = $dataset_id"  \
    
    felmer's avatar
    felmer committed
           | awk '/ +[0-9]+/' \
           | awk '{gsub(/ /,"");print}' \
           | awk '{gsub(/\|/,";");print}'`
        local lines=`echo "$dataset" | grep "$pattern" | wc -l`
    
        if [ $lines == 0 ]; then
            report_error dataset does not match pattern $pattern: $dataset
        fi 
    }
        
    
    function assert_correct_content {
        assert_correct_experiment_info
        assert_empty_in_out_folders
    
    felmer's avatar
    felmer committed
        assert_dir_exists $DATA/out-raw/microX_200801011213_3VCP1/TIFF
    
        assert_pattern_present $DATA/out-raw/.faulty_paths 1 ".*data/out-raw/.MARKER_is_finished_microX_200801011213_3VCP1" 
    
        assert_correct_content_of_processing_dir
        assert_correct_content_of_plate_3VCP1_in_store
        assert_correct_content_of_invalid_plate_in_store 3VCP4
        assert_correct_content_of_image_analysis_data 3VCP1
        assert_correct_content_of_image_analysis_data 3VCP3
        assert_correct_content_of_image_analysis_data 3VCP4
        assert_correct_content_of_unidentified_plate_in_store UnknownPlate
    
        assert_correct_dataset_content_in_database 1 "1;DATA_ACQUISITION;MICROX-3VCP1;f;;microX;2008-01-01.*"
    
    felmer's avatar
    felmer committed
        assert_correct_dataset_content_in_database 2 "2;IMAGE_ANALYSIS;20[0-9]*-2;f;1;;"
    
    felmer's avatar
    felmer committed
        assert_correct_dataset_content_in_database 3 "3;IMAGE_ANALYSIS;20[0-9]*-3;f;1;;"
        assert_correct_dataset_content_in_database 4 "4;IMAGE_ANALYSIS;20[0-9]*-4;f;5;;"
        assert_correct_dataset_content_in_database 5 "5;DATA_ACQUISITION;MICROX-3VCP3;f;;microX;2008-01-01.*"
        assert_correct_dataset_content_in_database 6 "6;IMAGE_ANALYSIS;20[0-9]*-6;f;7;;"
        assert_correct_dataset_content_in_database 7 "7;UNKNOWN;MICROX-3VCP4;t;;;"
        assert_correct_dataset_content_in_database 8 "8;IMAGE_ANALYSIS;20[0-9]*-8;f;5;;"
    
    tpylak's avatar
    tpylak committed
    function integration_tests {
    
        install_etl=$1
        install_dmv=$2
        install_lims=$3
        use_local_source=$4
        
    
        init_log
    
        build_zips $install_etl $install_dmv $install_lims $use_local_source
    
        
        # prepare empty incoming data
        rm -fr $DATA
        cp -R $TEMPLATE/data $WORK
        clean_svn $DATA
    
    
        install $install_etl $install_dmv $install_lims
    
    tpylak's avatar
    tpylak committed
        launch_tests
    
    tpylak's avatar
    tpylak committed
        shutdown_lims_server
        exit_if_assertion_failed
    }
    
    function clean_after_tests {
    
    tpylak's avatar
    tpylak committed
        echo "Cleaning $INSTALL..."
    
    tpylak's avatar
    tpylak committed
        rm -fr $INSTALL
    
    tpylak's avatar
    tpylak committed
        echo "Cleaning $WORK..."
    
    tpylak's avatar
    tpylak committed
        rm -fr $WORK
    }
    
    
    function print_help {
        echo "Usage: $0 [ (--etl | --lims | --dmv)* | --all [ --local-source ]]"
        echo "	--etl, --lims, --dmv	build chosen components only"
        echo "	--all 			build all components"
        echo "	--local-source		use local source code during building process instead of downloading it from svn"  
    
        echo "	--assert-content	only checks content"
    
        echo "	--clean			clean and exit"
        echo "	--help			displays this help"
        echo "If no option is given, integration tests will be restarted without building anything."
        echo "Examples:"
        echo "- Rebuild everything, fetch sources from svn:"
        echo "	$0 --all"
        echo "- Use lims server and client installation from previous tests, rebuild etl server and datamover using local source:"
        echo "	$0 --etl --dmv --local-source"
        echo "- Rebuild etl server only fetching sources from svn:"
        echo "	$0 --etl"
    }
    
    
    tpylak's avatar
    tpylak committed
    # -- MAIN ------------ 
    
    tpylak's avatar
    tpylak committed
        clean_after_tests
    else
    
        install_etl=false
        install_dmv=false
        install_lims=false
        use_local_source=false
        while [ ! "$1" = "" ]; do
    	case "$1" in
    	    '-e'|'--etl')
    	        install_etl=true
    		;;
    	    '-d'|'--dmv')
    		install_dmv=true
    		;;
    	    '-l'|'--lims')
    		install_lims=true
    		;;
    	    '-a'|'--all')
    	        install_etl=true
    		install_dmv=true
    		install_lims=true
    		;;
    	    '--local-source')
    		use_local_source=true
    		;;			
    	    '--help')
    		print_help
    		exit 0
    		;;
    
                '--assert-content')
                    assert_correct_content
                    exit 0
                    ;;
    
    	    *)
    		echo "Illegal option $1."
    		print_help
    		exit 1
    		;;
             esac
    	 shift
        done
        integration_tests $install_etl $install_dmv $install_lims $use_local_source
    
    tpylak's avatar
    tpylak committed
    fi