diff --git a/os-simulator/.DS_Store b/os-simulator/.DS_Store index ebc51b3142584b9874ae55bc3dbebb8aa97f5b22..0893fd48d718765776876fd0a10d5b98e240e770 100644 Binary files a/os-simulator/.DS_Store and b/os-simulator/.DS_Store differ diff --git a/os-simulator/.classpath b/os-simulator/.classpath index 002ad570e2e589f29101a6f361e1e4c36eac358d..dfce6da246eb3b2edf00a159e99f33f7213c2bb1 100644 --- a/os-simulator/.classpath +++ b/os-simulator/.classpath @@ -34,5 +34,6 @@ <attribute name="maven.pomderived" value="true"/> </attributes> </classpathentry> + <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> <classpathentry kind="output" path="target/classes"/> </classpath> diff --git a/os-simulator/Processes/.DS_Store b/os-simulator/Processes/.DS_Store index 78344d393449df37c49b645fba70c93197292268..8c8652f0ecbbf7364cd95e5eeb0f0c2d9afba426 100644 Binary files a/os-simulator/Processes/.DS_Store and b/os-simulator/Processes/.DS_Store differ diff --git a/os-simulator/Processes/Invalid_Processes/.DS_Store b/os-simulator/Processes/Invalid_Processes/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 Binary files a/os-simulator/Processes/Invalid_Processes/.DS_Store and /dev/null differ diff --git a/os-simulator/Processes/Valid_Processes/.DS_Store b/os-simulator/Processes/Valid_Processes/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 Binary files a/os-simulator/Processes/Valid_Processes/.DS_Store and /dev/null differ diff --git a/os-simulator/Processes/_Tests/FAILED22.txt b/os-simulator/Processes/_Tests/FAILED22.txt new file mode 100644 index 0000000000000000000000000000000000000000..cb733ce0f62df2b4fc9aa3fa41eb7dfa9048aa3b --- /dev/null +++ b/os-simulator/Processes/_Tests/FAILED22.txt @@ -0,0 +1,23 @@ +22 +store a #1 +store b #2 +store a #1 +store b #2 +store a #1 +store b #2 +store a #1 +store b #2 +store a #1 +store b #2 +store a #1 +store b #2 +store a #1 +store b #2 +store a #1 +store b #2 +store a #1 +store b #2 +store a #1 +store b #2 +store b #2 +add c b \ No newline at end of file diff --git a/os-simulator/Processes/_Tests/FAILED3.txt b/os-simulator/Processes/_Tests/FAILED3.txt new file mode 100644 index 0000000000000000000000000000000000000000..b54a735796beb429d3462eade72ac1a79fff6e5b --- /dev/null +++ b/os-simulator/Processes/_Tests/FAILED3.txt @@ -0,0 +1,4 @@ +3 +store a #1 +store b #2 +add c a \ No newline at end of file diff --git a/os-simulator/Processes/_Tests/blocked18_3.txt b/os-simulator/Processes/_Tests/blocked18_3.txt new file mode 100644 index 0000000000000000000000000000000000000000..0605e64b311342e8f9938aba2049081610f8d738 --- /dev/null +++ b/os-simulator/Processes/_Tests/blocked18_3.txt @@ -0,0 +1,19 @@ +18 +store a #1 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +sub c b a +sub c b a +print c printer +print b printer +print a printer \ No newline at end of file diff --git a/os-simulator/Processes/_Tests/blocked2_1.txt b/os-simulator/Processes/_Tests/blocked2_1.txt new file mode 100644 index 0000000000000000000000000000000000000000..20d7ccad427c8cd4057286de0df61d843643f20a --- /dev/null +++ b/os-simulator/Processes/_Tests/blocked2_1.txt @@ -0,0 +1,3 @@ +1 +read a #100 keyboard +print a printer \ No newline at end of file diff --git a/os-simulator/Processes/_Tests/blocked4_1.txt b/os-simulator/Processes/_Tests/blocked4_1.txt new file mode 100644 index 0000000000000000000000000000000000000000..a1013d076303bd35e0a2f007a9be6ec69490af7c --- /dev/null +++ b/os-simulator/Processes/_Tests/blocked4_1.txt @@ -0,0 +1,5 @@ +1 +store a #1 +store b #2 +sub c b a +print c printer \ No newline at end of file diff --git a/os-simulator/Processes/_Tests/blocked6_2.txt b/os-simulator/Processes/_Tests/blocked6_2.txt new file mode 100644 index 0000000000000000000000000000000000000000..8b71b38743d2af10976804d3d4549d2de2ab1f32 --- /dev/null +++ b/os-simulator/Processes/_Tests/blocked6_2.txt @@ -0,0 +1,7 @@ +1 +store a #1 +store b #2 +sub c b a +read d #100 keyboard +sub e a d +display d monitor \ No newline at end of file diff --git a/os-simulator/Processes/_Tests/blockedInvalid6_1.txt b/os-simulator/Processes/_Tests/blockedInvalid6_1.txt new file mode 100644 index 0000000000000000000000000000000000000000..9f6dd6909c5c14c25dd773e81b5a2118aada520f --- /dev/null +++ b/os-simulator/Processes/_Tests/blockedInvalid6_1.txt @@ -0,0 +1,7 @@ +4 +store a #1 +store b #2 +sub c b a +read d #100 invalidDevice +sub e a d +store f #4 \ No newline at end of file diff --git a/os-simulator/Processes/_Tests/terminate14.txt b/os-simulator/Processes/_Tests/terminate14.txt new file mode 100644 index 0000000000000000000000000000000000000000..96dc7e1812d31d4c0dd5c53c24a6937b60c71331 --- /dev/null +++ b/os-simulator/Processes/_Tests/terminate14.txt @@ -0,0 +1,15 @@ +14 +store a #1 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +sub c b a +sub c b a \ No newline at end of file diff --git a/os-simulator/Processes/_Tests/terminate28.txt b/os-simulator/Processes/_Tests/terminate28.txt new file mode 100644 index 0000000000000000000000000000000000000000..ac6597a7b51c6f6b61f07991d5ee691e1a1ad1fb --- /dev/null +++ b/os-simulator/Processes/_Tests/terminate28.txt @@ -0,0 +1,29 @@ +4 +store a #1 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +sub c b a +sub c b a +store a #1 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +sub c b a +sub c b a \ No newline at end of file diff --git a/os-simulator/Processes/_Tests/terminate4.txt b/os-simulator/Processes/_Tests/terminate4.txt new file mode 100644 index 0000000000000000000000000000000000000000..83e064fd937c9323e0240438fd07ffcd4e8d0333 --- /dev/null +++ b/os-simulator/Processes/_Tests/terminate4.txt @@ -0,0 +1,5 @@ +4 +store a #1 +store b #2 +store b #3 +add c a b \ No newline at end of file diff --git a/os-simulator/Processes/_Tests/terminate70.txt b/os-simulator/Processes/_Tests/terminate70.txt new file mode 100644 index 0000000000000000000000000000000000000000..a4fb6d0c9b930f258c4ece84bade2d1b44fc032b --- /dev/null +++ b/os-simulator/Processes/_Tests/terminate70.txt @@ -0,0 +1,71 @@ +4 +store a #1 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +sub c b a +sub c b a +store a #1 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +sub c b a +sub c b a +store a #1 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +sub c b a +sub c b a +store a #1 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +sub c b a +sub c b a +store a #1 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +store b #2 +sub c b a +sub c b a \ No newline at end of file diff --git a/os-simulator/pom.xml b/os-simulator/pom.xml index a4a4147dac7ab8411df32be1d46afb4fe9c42d61..c8a30272b1bea512649b4764f527efc8d94c2b91 100644 --- a/os-simulator/pom.xml +++ b/os-simulator/pom.xml @@ -8,4 +8,14 @@ <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.11</version> + <scope>test</scope> + </dependency> + </dependencies> + </project> \ No newline at end of file diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/IOProcessManager.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/IOProcessManager.java index a3f7906398901b9f81c60c0ad67cc3ca7dcd8b86..b4af56c062e220f8413b0afd0fd892937fa51598 100644 --- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/IOProcessManager.java +++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/IOProcessManager.java @@ -288,5 +288,13 @@ public class IOProcessManager extends Thread { public String getIOReport() { return this.IOReport.toString(); } + + + /** + * @return IOSystem + */ + public JavaIOSystem getIOSystem() { + return this.IOSystem; + } } diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OS.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OS.java index fa76a68ad6c401d155aa252f3d088064a1abb236..abe449f8131be092813748b849781c9d698d71d8 100644 --- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OS.java +++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OS.java @@ -33,15 +33,23 @@ public class OS { /** * Runs process scheduling simulation with processes in OS. */ - public void turnOn() { + public void turnOn(SchedulingAlgorithm algorithm, int quantum) { try { - this.ps.startThreads(); + this.ps.startThreads(algorithm, quantum); } catch(Exception e) { - e.printStackTrace();; + e.printStackTrace(); } } - + + + /** + * Stop running threads. + */ + public void turnOff() { + ps.stopThreads(); + } + /** * @return the globalTime */ diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OSCommandLine.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OSCommandLine.java index 834cf33b1d16ae14e74565f7994e5763e9bdeb96..c89b6c55bbb28b35b88a11845424c0a63eadd99c 100644 --- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OSCommandLine.java +++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/OSCommandLine.java @@ -20,7 +20,7 @@ public class OSCommandLine { */ public static void main(String[] args) { OS os = new OS(); - os.turnOn(); + os.turnOn(SchedulingAlgorithm.FIFO, 5); // Create a stream for input BufferedReader data = null; @@ -92,7 +92,7 @@ public class OSCommandLine { } else if (cmd.equalsIgnoreCase("quit")) { - System.exit(0); + os.turnOff(); } else if (cmd.equalsIgnoreCase("help")) { diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessCreation.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessCreation.java index a22c6ca2457aef28f6ff0d1f79de41c9c8a16a12..28a20e594a86c07fec8ed2e4ed44de0f6ed06efd 100644 --- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessCreation.java +++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessCreation.java @@ -10,6 +10,7 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; +import java.util.NoSuchElementException; import java.util.Scanner; /** @@ -39,6 +40,8 @@ public class ProcessCreation extends Thread { this.jobQueue = jobQueue; this.errorReport = errorReport; this.globalTime = globalTime; + + this.clearFolders(); } @@ -138,6 +141,8 @@ public class ProcessCreation extends Thread { //Ran if no file is found from name in system. catch(IOException e) {} + + catch(NoSuchElementException e) {} } @@ -192,5 +197,33 @@ public class ProcessCreation extends Thread { break; } } + + + /** + * Clears folders in Valid_Processes and Invalid_Processes. + */ + public void clearFolders() { + File folder = new File("Processes/Valid_Processes"); + File[] listOfFiles = folder.listFiles(); + + //Cycles through folder 'Valid_Processes' to look for files. + for(int i = 0; i < listOfFiles.length; i++) { + //If it finds file, delete it. + if(listOfFiles[i].isFile()) { + listOfFiles[i].delete(); + } + } + + folder = new File("Processes/Invalid_Processes"); + listOfFiles = folder.listFiles(); + + //Cycles through folder 'Valid_Processes' to look for files. + for(int i = 0; i < listOfFiles.length; i++) { + //If it finds file, delete it. + if(listOfFiles[i].isFile()) { + listOfFiles[i].delete(); + } + } + } } diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessDispatcher.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessDispatcher.java index 6f63fe3204894d33176c64c8fdf2971a6c92cf11..28f26d7c1768d80c67e336cc975978a8e1d28e2a 100644 --- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessDispatcher.java +++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessDispatcher.java @@ -277,6 +277,7 @@ public class ProcessDispatcher extends Thread { //Non-Preemptive, won't access new process from ready queue if one is already running. if(this.cpuQueue.isEmpty()) { PCB currentProcess = this.readyQueue.get(0); + this.scheduleProcess(currentProcess); } else { diff --git a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessScheduler.java b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessScheduler.java index 7665aa6087d11da94f6783b29bcb631641062549..f74f407abcd591e5bd51e44887b63af04a50c6f7 100644 --- a/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessScheduler.java +++ b/os-simulator/src/main/java/com/com1032/assignment/processscheduler/ProcessScheduler.java @@ -6,6 +6,7 @@ package com.com1032.assignment.processscheduler; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import com.com1032.assignment.IOsystem.*; /** * @author felipedabrantes @@ -56,10 +57,13 @@ public class ProcessScheduler { /** * Starts running the threads needed. * + * @param algorithm + * @param quantum + * * @throws IOException if there is an error accessing hardware file. * @throws IndexOutOfBoundsException if there is an error with hardware file parameters. */ - public void startThreads() throws IndexOutOfBoundsException, IOException { + public void startThreads(SchedulingAlgorithm algorithm, int quantum) throws IndexOutOfBoundsException, IOException { //Thread responsible for creating processes from files. this.pc = new ProcessCreation(this.errorReport, this.os.getGlobalTime(), this.jobQueue); @@ -68,6 +72,9 @@ public class ProcessScheduler { this.processReport, this.algorithm, this.quantum, this.jobQueue, this.readyQueue, this.blockedQueue, this.terminatedQueue, this.cpuQueue); + //Update algorithm + this.setAlgorithm(algorithm, quantum); + //Thread responsible for running processes and simulating CPU. this.cpu = new CPUSimulator(this.errorReport, this.os.getGlobalTime(), this.cpuQueue, this.os.getHardware()); @@ -81,6 +88,13 @@ public class ProcessScheduler { io.start(); } + public void stopThreads() { + pc.stop(); + pd.stop(); + cpu.stop(); + io.stop(); + } + public void setAlgorithm(SchedulingAlgorithm algorithm, int quantum) { this.pd.setAlgorithm(algorithm, quantum); @@ -97,5 +111,9 @@ public class ProcessScheduler { public String getIOReport() { return this.IOReport.toString(); } + + public JavaIOSystem getJavaIOSystem() { + return this.io.getIOSystem(); + } } diff --git a/os-simulator/src/test/java/com/com1032/assignment/AllTests.java b/os-simulator/src/test/java/com/com1032/assignment/AllTests.java new file mode 100644 index 0000000000000000000000000000000000000000..a2c695171f5a30dbfe2f0c0437f8a861cf38163a --- /dev/null +++ b/os-simulator/src/test/java/com/com1032/assignment/AllTests.java @@ -0,0 +1,11 @@ +package com.com1032.assignment; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ IOSystemTest.class, PSAlgorithmsTest.class, PSBlockedTest.class }) +public class AllTests { + +} diff --git a/os-simulator/src/test/java/com/com1032/assignment/IOSystemTest.java b/os-simulator/src/test/java/com/com1032/assignment/IOSystemTest.java new file mode 100644 index 0000000000000000000000000000000000000000..205b875d88f15a8ab9f16ac64f06475799cb1340 --- /dev/null +++ b/os-simulator/src/test/java/com/com1032/assignment/IOSystemTest.java @@ -0,0 +1,94 @@ +/** + * + */ +package com.com1032.assignment; + +import static org.junit.Assert.*; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.Scanner; +import java.util.concurrent.TimeUnit; + +import org.junit.Test; + +import com.com1032.assignment.processscheduler.OS; +import com.com1032.assignment.processscheduler.SchedulingAlgorithm; + +/** + * @author felipedabrantes + * + */ +public class IOSystemTest { + + @Test + public void OutputDeviceTest() throws IOException, InterruptedException { + OS os = new OS(); + + //Start OS with FIFO algorithm.. + os.turnOn(SchedulingAlgorithm.FIFO, 5); + + //Copy files from test. + //File contains a print statement to device printer. + this.copyProcessFile("blocked4_1.txt"); + + //Wait for processes to execute. + TimeUnit.MILLISECONDS.sleep(2000); + + os.turnOff(); + + File file = new File("Peripherals/Buffers/printerBuffer.txt"); + Scanner fileReader = new Scanner(file); + String actualResult = fileReader.nextLine(); + String expectedResult = "1"; + fileReader.close(); + + assertEquals(expectedResult, actualResult); + } + + + @Test + public void InputDeviceTest() throws IOException, InterruptedException { + OS os = new OS(); + + //Start OS with FIFO algorithm.. + os.turnOn(SchedulingAlgorithm.FIFO, 5); + + //Write to keyboard. + String textToAppend = "20"; + BufferedWriter writer = new BufferedWriter(new FileWriter("Peripherals/Buffers/keyboardBuffer.txt", true)); + writer.write(textToAppend); + writer.close(); + + //Copy files from test. + //File contains a print statement to device printer. + this.copyProcessFile("blocked2_1.txt"); + + //Wait for processes to execute. + TimeUnit.MILLISECONDS.sleep(2000); + + os.turnOff(); + + File file = new File("Peripherals/Buffers/printerBuffer.txt"); + Scanner fileReader = new Scanner(file); + String actualResult = fileReader.nextLine(); + String expectedResult = "20"; + fileReader.close(); + + assertEquals(expectedResult, actualResult); + } + + + + public void copyProcessFile(String fileName) throws IOException { + Path testSource = Paths.get("Processes/_Tests/" + fileName); + Path target = Paths.get("Processes/New_Processes/" + fileName); + Files.copy(testSource, target, StandardCopyOption.REPLACE_EXISTING); + } +} diff --git a/os-simulator/src/test/java/com/com1032/assignment/PSAlgorithmsTest.java b/os-simulator/src/test/java/com/com1032/assignment/PSAlgorithmsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..23c9ac4c15502ca731279b6ca652dbc2b1efd290 --- /dev/null +++ b/os-simulator/src/test/java/com/com1032/assignment/PSAlgorithmsTest.java @@ -0,0 +1,227 @@ +/** + * + */ +package com.com1032.assignment; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.concurrent.TimeUnit; + +import org.junit.Test; + +import com.com1032.assignment.processscheduler.OS; +import com.com1032.assignment.processscheduler.SchedulingAlgorithm; + +/** + * @author felipedabrantes + * + */ +public class PSAlgorithmsTest { + + @Test + public void FIFOProcessTest() throws IOException, InterruptedException { + OS os = new OS(); + + //Start OS with FIFO algorithm.. + os.turnOn(SchedulingAlgorithm.FIFO, 5); + + //Copy files from test. + this.copyProcessFile("terminate14.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("terminate70.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("terminate4.txt"); + + TimeUnit.MILLISECONDS.sleep(5000); + + String actualReport = os.getPs().getProcessReport(); + String simpleReport = this.simplifyReport(actualReport); + + os.turnOff(); + + StringBuffer expectedReport = new StringBuffer(); + expectedReport.append("Ready terminate14 NEW false\n"); + expectedReport.append("Schedule terminate14 NEW false\n"); + expectedReport.append("Ready terminate70 NEW false\n"); + expectedReport.append("Ready terminate4 NEW false\n"); + expectedReport.append("Terminated terminate14 TERMINATED false\n"); + expectedReport.append("Schedule terminate70 NEW false\n"); + expectedReport.append("Terminated terminate70 TERMINATED false\n"); + expectedReport.append("Schedule terminate4 NEW false\n"); + expectedReport.append("Terminated terminate4 TERMINATED false\n"); + + assertEquals(expectedReport.toString(), simpleReport); + } + + @Test + public void SPFProcessTest() throws IOException, InterruptedException { + OS os = new OS(); + + //Copy files from test first. + this.copyProcessFile("terminate70.txt"); + + //Start OS with SPF algorithm. + os.turnOn(SchedulingAlgorithm.SPF, 5); + + this.copyProcessFile("terminate14.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("terminate4.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("terminate28.txt"); + + TimeUnit.MILLISECONDS.sleep(7000); + + String actualReport = os.getPs().getProcessReport(); + String simpleReport = this.simplifyReport(actualReport); + + os.turnOff(); + + StringBuffer expectedReport = new StringBuffer(); + expectedReport.append("Ready terminate70 NEW false\n"); + expectedReport.append("Schedule terminate70 NEW false\n"); + expectedReport.append("Ready terminate14 NEW false\n"); + expectedReport.append("Ready terminate4 NEW false\n"); + expectedReport.append("Ready terminate28 NEW false\n"); + expectedReport.append("Terminated terminate70 TERMINATED false\n"); + expectedReport.append("Schedule terminate4 NEW false\n"); + expectedReport.append("Terminated terminate4 TERMINATED false\n"); + expectedReport.append("Schedule terminate14 NEW false\n"); + expectedReport.append("Terminated terminate14 TERMINATED false\n"); + expectedReport.append("Schedule terminate28 NEW false\n"); + expectedReport.append("Terminated terminate28 TERMINATED false\n"); + + assertEquals(expectedReport.toString(), simpleReport); + } + + @Test + public void SRTFProcessTest() throws IOException, InterruptedException { + OS os = new OS(); + + //Start OS with SPF algorithm. + os.turnOn(SchedulingAlgorithm.SRTF, 5); + + //Add files. + this.copyProcessFile("terminate14.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("terminate4.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("terminate28.txt"); + + TimeUnit.MILLISECONDS.sleep(3000); + + String actualReport = os.getPs().getProcessReport(); + String simpleReport = this.simplifyReport(actualReport); + + os.turnOff(); + + StringBuffer expectedReport = new StringBuffer(); + expectedReport.append("Ready terminate14 NEW false\n"); + expectedReport.append("Schedule terminate14 NEW false\n"); + expectedReport.append("Ready terminate4 NEW false\n"); + expectedReport.append("Suspending terminate14 RUNNING false\n"); + expectedReport.append("Schedule terminate4 NEW false\n"); + expectedReport.append("Ready terminate28 NEW false\n"); + expectedReport.append("Terminated terminate4 TERMINATED false\n"); + expectedReport.append("Schedule terminate14 READY false\n"); + expectedReport.append("Terminated terminate14 TERMINATED false\n"); + expectedReport.append("Schedule terminate28 NEW false\n"); + expectedReport.append("Terminated terminate28 TERMINATED false\n"); + + assertEquals(expectedReport.toString(), simpleReport); + } + + @Test + public void RRProcessTest() throws IOException, InterruptedException { + OS os = new OS(); + + //Start OS with SPF algorithm. + os.turnOn(SchedulingAlgorithm.RR, 5); + + //Add files. + this.copyProcessFile("terminate14.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("terminate4.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("terminate28.txt"); + + TimeUnit.MILLISECONDS.sleep(3000); + + String actualReport = os.getPs().getProcessReport(); + String simpleReport = this.simplifyReport(actualReport); + + os.turnOff(); + + StringBuffer expectedReport = new StringBuffer(); + expectedReport.append("Ready terminate14 NEW false\n"); + expectedReport.append("Schedule terminate14 NEW false\n"); + expectedReport.append("Ready terminate4 NEW false\n"); + expectedReport.append("Ready terminate28 NEW false\n"); + expectedReport.append("Suspending terminate14 RUNNING false\n"); + expectedReport.append("Schedule terminate4 NEW false\n"); + expectedReport.append("Terminated terminate4 TERMINATED false\n"); + expectedReport.append("Schedule terminate28 NEW false\n"); + expectedReport.append("Suspending terminate28 RUNNING false\n"); + expectedReport.append("Schedule terminate14 READY false\n"); + expectedReport.append("Suspending terminate14 RUNNING false\n"); + expectedReport.append("Schedule terminate28 READY false\n"); + expectedReport.append("Suspending terminate28 RUNNING false\n"); + expectedReport.append("Schedule terminate14 READY false\n"); + expectedReport.append("Terminated terminate14 TERMINATED false\n"); + expectedReport.append("Schedule terminate28 READY false\n"); + expectedReport.append("Terminated terminate28 TERMINATED false\n"); + + assertEquals(expectedReport.toString(), simpleReport); + } + + + public void copyProcessFile(String fileName) throws IOException { + Path testSource = Paths.get("Processes/_Tests/" + fileName); + Path target = Paths.get("Processes/New_Processes/" + fileName); + Files.copy(testSource, target, StandardCopyOption.REPLACE_EXISTING); + } + + + public String simplifyReport(String report) { + StringBuffer simpleReport = new StringBuffer(); + + String action = null; + String name = null; + String state = null; + boolean failed = false; + + String[] split = report.split("\n"); + + for(String line: split) { + if(!line.equals("")) { + + action = line.split(" ")[1]; + name = line.split(" ")[8]; + + if(line.split(" ")[10].equals("FAILED")) { + failed = true; + state = line.split(" ")[13]; + } + else { + state = line.split(" ")[11]; + } + + simpleReport.append(action + " "); + simpleReport.append(name + " "); + simpleReport.append(state + " "); + simpleReport.append(failed); + simpleReport.append("\n"); + + failed = false; + } + } + + return simpleReport.toString(); + + } + +} diff --git a/os-simulator/src/test/java/com/com1032/assignment/PSBlockedTest.java b/os-simulator/src/test/java/com/com1032/assignment/PSBlockedTest.java new file mode 100644 index 0000000000000000000000000000000000000000..18fc164863235ac4fa8464948760a726c15d5c7f --- /dev/null +++ b/os-simulator/src/test/java/com/com1032/assignment/PSBlockedTest.java @@ -0,0 +1,247 @@ +/** + * + */ +package com.com1032.assignment; + +import static org.junit.Assert.*; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.concurrent.TimeUnit; + +import org.junit.Test; + +import com.com1032.assignment.processscheduler.OS; +import com.com1032.assignment.processscheduler.SchedulingAlgorithm; + +/** + * @author felipedabrantes + * + */ +public class PSBlockedTest { + + @Test + public void FIFOBlockedProcessTest() throws IOException, InterruptedException { + OS os = new OS(); + + //Start OS with FIFO algorithm.. + os.turnOn(SchedulingAlgorithm.FIFO, 5); + + //Copy files from test. + this.copyProcessFile("blocked4_1.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("blocked6_2.txt"); + TimeUnit.MILLISECONDS.sleep(200); + this.copyProcessFile("blocked18_3.txt"); + + //Wait for processes to execute. + TimeUnit.MILLISECONDS.sleep(5000); + + String actualReport = os.getPs().getProcessReport(); + String simpleReport = this.simplifyReport(actualReport); + + os.turnOff(); + + StringBuffer expectedReport = new StringBuffer(); + expectedReport.append("Ready blocked4_1 NEW false\n"); + expectedReport.append("Schedule blocked4_1 NEW false\n"); + expectedReport.append("Ready blocked6_2 NEW false\n"); + expectedReport.append("Blocking blocked4_1 BLOCKED false\n"); + expectedReport.append("Schedule blocked6_2 NEW false\n"); + expectedReport.append("Terminated blocked4_1 TERMINATED false\n"); + expectedReport.append("Ready blocked18_3 NEW false\n"); + expectedReport.append("Blocking blocked6_2 BLOCKED false\n"); + expectedReport.append("Schedule blocked18_3 NEW false\n"); + expectedReport.append("Terminated blocked6_2 TERMINATED true\n"); + expectedReport.append("Blocking blocked18_3 BLOCKED false\n"); + expectedReport.append("Ready blocked18_3 READY false\n"); + expectedReport.append("Schedule blocked18_3 READY false\n"); + expectedReport.append("Blocking blocked18_3 BLOCKED false\n"); + expectedReport.append("Ready blocked18_3 READY false\n"); + expectedReport.append("Schedule blocked18_3 READY false\n"); + expectedReport.append("Blocking blocked18_3 BLOCKED false\n"); + expectedReport.append("Terminated blocked18_3 TERMINATED false\n"); + + assertEquals(expectedReport.toString(), simpleReport); + } + + @Test + public void RRBlockedProcessTest() throws IOException, InterruptedException { + OS os = new OS(); + + //Start OS with FIFO algorithm.. + os.turnOn(SchedulingAlgorithm.FIFO, 5); + + //Copy files from test. + this.copyProcessFile("blocked18_3.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("blocked4_1.txt"); + TimeUnit.MILLISECONDS.sleep(100); + this.copyProcessFile("terminate14.txt"); + + + //Wait for processes to execute. + TimeUnit.MILLISECONDS.sleep(5000); + + String actualReport = os.getPs().getProcessReport(); + String simpleReport = this.simplifyReport(actualReport); + + os.turnOff(); + + StringBuffer expectedReport = new StringBuffer(); + + expectedReport.append("Ready blocked18_3 NEW false\n"); + expectedReport.append("Schedule blocked18_3 NEW false\n"); + expectedReport.append("Ready blocked4_1 NEW false\n"); + expectedReport.append("Ready terminate14 NEW false\n"); + expectedReport.append("Blocking blocked18_3 BLOCKED false\n"); + expectedReport.append("Schedule blocked4_1 NEW false\n"); + expectedReport.append("Ready blocked18_3 READY false\n"); + expectedReport.append("Blocking blocked4_1 BLOCKED false\n"); + expectedReport.append("Schedule terminate14 NEW false\n"); + expectedReport.append("Terminated blocked4_1 TERMINATED false\n"); + expectedReport.append("Terminated terminate14 TERMINATED false\n"); + expectedReport.append("Schedule blocked18_3 READY false\n"); + expectedReport.append("Blocking blocked18_3 BLOCKED false\n"); + expectedReport.append("Ready blocked18_3 READY false\n"); + expectedReport.append("Schedule blocked18_3 READY false\n"); + expectedReport.append("Blocking blocked18_3 BLOCKED false\n"); + expectedReport.append("Terminated blocked18_3 TERMINATED false\n"); + + assertEquals(expectedReport.toString(), simpleReport); + } + + + @Test + public void ErrorBlockedProcessTest() throws IOException, InterruptedException { + OS os = new OS(); + + //Start OS with FIFO algorithm.. + os.turnOn(SchedulingAlgorithm.FIFO, 3); + + //Copy files from test. + //Code has a device not in hardware file. + this.copyProcessFile("blockedInvalid6_1.txt"); + + //Wait for processes to execute. + TimeUnit.MILLISECONDS.sleep(1000); + + String actualProcessReport = os.getPs().getProcessReport(); + String simpleProcessReport = this.simplifyReport(actualProcessReport); + + os.turnOff(); + + + StringBuffer expectedReport = new StringBuffer(); + expectedReport.append("Ready blockedInvalid6_1 NEW false\n"); + expectedReport.append("Schedule blockedInvalid6_1 NEW false\n"); + expectedReport.append("Blocking blockedInvalid6_1 BLOCKED false\n"); + expectedReport.append("Terminated blockedInvalid6_1 TERMINATED true\n"); + + assertEquals(expectedReport.toString(), simpleProcessReport); + } + + + @Test + public void ErrorReportBlockedProcessTest() throws IOException, InterruptedException { + OS os = new OS(); + + //Start OS with FIFO algorithm.. + os.turnOn(SchedulingAlgorithm.FIFO, 3); + + //Copy files from test. + //Code has a device not in hardware file. + this.copyProcessFile("blockedInvalid6_1.txt"); + + //Wait for processes to execute. + TimeUnit.MILLISECONDS.sleep(1000); + + String actualErrorReport = os.getPs().getErrorReport(); + String simpleErrorReport = this.simplifyErrorReport(actualErrorReport); + os.turnOff(); + + StringBuffer expectedReport = new StringBuffer(); + expectedReport.append("3: blockedInvalid6_1 BLOCKED"); + + assertEquals(expectedReport.toString(), simpleErrorReport); + } + + + + public void copyProcessFile(String fileName) throws IOException { + Path testSource = Paths.get("Processes/_Tests/" + fileName); + Path target = Paths.get("Processes/New_Processes/" + fileName); + Files.copy(testSource, target, StandardCopyOption.REPLACE_EXISTING); + } + + + public String simplifyReport(String report) { + StringBuffer simpleReport = new StringBuffer(); + + String action = null; + String name = null; + String state = null; + boolean failed = false; + + String[] split = report.split("\n"); + + for(String line: split) { + if(!line.equals("")) { + + action = line.split(" ")[1]; + name = line.split(" ")[8]; + + if(line.split(" ")[10].equals("FAILED")) { + failed = true; + state = line.split(" ")[13]; + } + else { + state = line.split(" ")[11]; + } + + simpleReport.append(action + " "); + simpleReport.append(name + " "); + simpleReport.append(state + " "); + simpleReport.append(failed); + simpleReport.append("\n"); + + failed = false; + } + } + + return simpleReport.toString(); + + } + + + public String simplifyErrorReport(String report) { + StringBuffer simpleReport = new StringBuffer(); + + String lineNum = null; + String name = null; + String state = null; + + String[] split = report.split("\n"); + + for(String line: split) { + + if(!line.equals("")) { + lineNum = line.split(" ")[5]; + name = line.split(" ")[10]; + state = line.split(" ")[13]; + + simpleReport.append(lineNum + " "); + simpleReport.append(name + " "); + simpleReport.append(state); + + break; + } + } + + return simpleReport.toString(); + + } +}