public void cannot_launch_already_started_machine()
        {
            CloudInfrastructure cloud = new CloudInfrastructure();

            cloud.CreateMachine("machine1", "Linux", "50gb", "8gb");
            cloud.StartMachine("machine1");
            Assert.AreEqual("machine1:running", cloud.ListMachines());

            cloud.StartMachine("machine1"); // will throw the exception
        }
        public void Create_machines()
        {
            CloudInfrastructure cloud = new CloudInfrastructure();

            // create a new machine with 4 parameters : name, operating system, disk size, memory.
            cloud.CreateMachine("machine1", "Linux", "50gb", "8gb");
            cloud.CreateMachine("machine2", "Windows", "20gb", "4gb");

            // Remember, all machines are inactive by default.
            Assert.AreEqual("machine1:Inactive||machine2:Inactive", cloud.ListMachines());

            cloud.StartMachine("machine1"); // start the machine "machine1"
            Assert.AreEqual("machine1:running||machine2:Inactive", cloud.ListMachines());

            cloud.StartMachine("machine2");
            cloud.StopMachine("machine1"); // stop machine "machine1"
            Assert.AreEqual("machine1:stopped||machine2:running", cloud.ListMachines());
        }
        public void can_check_aggregated_data_for_all_machines_and_stores()
        {
            CloudInfrastructure cloud = new CloudInfrastructure();

            cloud.CreateMachine("machine1", "Linux", "50gb", "8gb");
            cloud.CreateMachine("machine2", "Windows", "20gb", "4gb");
            Assert.AreEqual("machine1:Inactive||machine2:Inactive", cloud.ListMachines());

            // globalUsedDisk method should return the used disk of all machines and stores existing in the cloud
            // for now 2 machines exists, with 50gb and 20gb disk sizes = 70gb
            Assert.AreEqual(70, cloud.GlobalUsedDisk(), 0.00001);

            // machines are inactive, no memory is used
            Assert.AreEqual(0, cloud.GlobalUsedMemory(), 0.00001);

            cloud.StartMachine("machine1");
            Assert.AreEqual(70, cloud.GlobalUsedDisk(), 0.00001);
            Assert.AreEqual(8, cloud.GlobalUsedMemory(), 0.00001);

            cloud.StartMachine("machine2");
            Assert.AreEqual(70, cloud.GlobalUsedDisk(), 0.00001);
            Assert.AreEqual(12, cloud.GlobalUsedMemory(), 0.00001);

            cloud.CreateStore("myImages");
            cloud.UploadDocument("myImages", "picture.jpeg");

            // 2 machines and 1 documents now exists in the cloud
            Assert.AreEqual(70.100, cloud.GlobalUsedDisk(), 0.00001);
            Assert.AreEqual(12, cloud.GlobalUsedMemory(), 0.00001);

            cloud.UploadDocument("myImages", "profile.png");
            Assert.AreEqual(70.200, cloud.GlobalUsedDisk(), 0.00001);
            Assert.AreEqual(12, cloud.GlobalUsedMemory(), 0.00001);

            cloud.StopMachine("machine1");

            Assert.AreEqual(70.200, cloud.GlobalUsedDisk(), 0.00001);
            Assert.AreEqual(4, cloud.GlobalUsedMemory(), 0.00001);

            cloud.EmptyStore("myImages");
            Assert.AreEqual(70, cloud.GlobalUsedDisk(), 0.00001);
            Assert.AreEqual(4, cloud.GlobalUsedMemory(), 0.00001);
        }
        public void Can_check_used_disk_and_ram_per_machine()
        {
            CloudInfrastructure cloud = new CloudInfrastructure();

            cloud.CreateMachine("machine1", "Linux", "50gb", "8gb");
            Assert.AreEqual("machine1:Inactive", cloud.ListMachines());

            Assert.AreEqual(0, cloud.UsedMemoryMachine("machine1"), 0.00001); // Only running machines consume memory
            Assert.AreEqual(50, cloud.UsedDiskMachine("machine1"), 0.00001);  // the disk is always consumed

            cloud.StartMachine("machine1");
            Assert.AreEqual(8, cloud.UsedMemoryMachine("machine1"), 0.00001); // All the machine memory is used as it is now running
            Assert.AreEqual(50, cloud.UsedDiskMachine("machine1"), 0.00001);

            cloud.StopMachine("machine1");
            // The memory will be released as the machine has been stopped
            Assert.AreEqual(0, cloud.UsedMemoryMachine("machine1"), 0.00001);
            Assert.AreEqual(50, cloud.UsedDiskMachine("machine1"), 0.00001);
        }