Skip to content
Snippets Groups Projects
Select Git revision
  • d0886e0f9603c033609d50a8971783b51190f533
  • main default
2 results

tips.md

Blame
  • student_tests.sh 3.64 KiB
    #!/usr/bin/env bats
    
    # File: student_tests.sh
    # Testing the remote shell server implementation
    
    # helper function to start server in background
    setup() {
        # create a test directory and files
        mkdir -p rshell_test
        cd rshell_test
        echo "test content" > testfile.txt
        
        # start server in background with test port
        ../dsh -s -p 5555 &
        SERVER_PID=$!
        sleep 1
    }
    
    # helper function to cleanup after each test
    teardown() {
        # kill server if it's running
        if [ -n "$SERVER_PID" ]; then
            kill $SERVER_PID 2>/dev/null || true
            wait $SERVER_PID 2>/dev/null || true
        fi
        
        # cleanup test directory
        cd ..
        rm -rf rshell_test
    }
    
    @test "test_server_startup" {
        # check if server process is running
        ps -p $SERVER_PID
        [ "$?" -eq 0 ]
    }
    
    # test server file creation
    @test "test_server_file_operations" {
        # create a file through client command
        echo "touch serverfile.txt" | ../dsh -c -p 5555
        
        # verify file exists on server side
        [ -f "serverfile.txt" ]
    }
    
    # test server directory operations
    @test "test_server_directory_operations" {
        # create directory through client
        echo "mkdir testdir" | ../dsh -c -p 5555
        
        # verify directory exists on server side
        [ -d "testdir" ]
        
        # change into directory and create file
        {
            echo "cd testdir"
            echo "touch inside.txt"
        } | ../dsh -c -p 5555
        
        # verify file exists in correct location on server
        [ -f "testdir/inside.txt" ]
    }
    
    # test server file content modification
    @test "test_server_file_modification" {
        # create and write to file through client
        {
            echo "echo 'server content' > server_write.txt"
            echo "exit"
        } | ../dsh -c -p 5555
        
        # verify file content on server side
        [ -f "server_write.txt" ]
        grep -q "server content" "server_write.txt"
    }
    
    # test server pipe operations
    @test "test_server_pipe_operations" {
        # create test files on server side
        echo "line1\nline2\nline3" > input.txt
        
        # use pipe operation through client
        echo "cat input.txt | grep line2 > output.txt" | ../dsh -c -p 5555
        
        # verify result on server side
        [ -f "output.txt" ]
        grep -q "line2" "output.txt"
    }
    
    # test ls command
    @test "test_server_ls" {
        echo "ls > ls.txt" | ../dsh -c -p 5555
        [ -f "ls.txt" ]
        grep -q "testfile.txt" "ls.txt"
    }
    
    # test server stop command
    @test "test_server_stop" {
        # tend stop-server command
        echo "stop-server" | ../dsh -c -p 5555
        
        # wait
        sleep 1
        
        # verify server process is no longer running
        ! ps -p $SERVER_PID
    }
    
    # test server concurrent file access (if extra credit implemented)
    # @test "test_server_concurrent_access" {
    #     # create a test file
    #     echo "initial" > /tmp/rshell_test/concurrent.txt
        
    #     # start two clients modifying the same file
    #     {
    #         echo "echo 'client1' >> concurrent.txt"
    #         echo "exit"
    #     } | ../dsh -c -p 5555 &
        
    #     {
    #         echo "echo 'client2' >> concurrent.txt"
    #         echo "exit"
    #     } | ../dsh -c -p 5555 &
        
    #     # wait for both to complete
    #     wait
        
    #     # verify both writes occurred on server side
    #     grep -q "client1" "/tmp/rshell_test/concurrent.txt"
    #     grep -q "client2" "/tmp/rshell_test/concurrent.txt"
    # }
    
    # test server working directory persistence
    @test "test_server_working_directory" {
        # create nested directories
        mkdir -p dir1/dir2
        
        # change directory and verify through file creation
        {
            echo "cd dir1/dir2"
            echo "pwd > pwd.txt"
        } | ../dsh -c -p 5555
        
        # verify pwd.txt exists in correct directory on server
        [ -f "dir1/dir2/pwd.txt" ]
        grep -q "dir2" "dir1/dir2/pwd.txt"
    }