/*
 * The MIT License
 *
 * Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package hudson.plugins.ec2.util;

import com.amazonaws.services.ec2.model.BlockDeviceMapping;
import com.amazonaws.services.ec2.model.EbsBlockDevice;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertEquals;

public class DeviceMappingParserTest {

    public void testParserWithAmi() throws Exception {
        List<BlockDeviceMapping> expected = new ArrayList<BlockDeviceMapping>();
        expected.add(new BlockDeviceMapping().withDeviceName("/dev/sdb").withEbs(new EbsBlockDevice().withSnapshotId("snap-7eb96d16")));

        String customDeviceMappings = "/dev/sdb=snap-7eb96d16";
        List<BlockDeviceMapping> actual = DeviceMappingParser.parse(customDeviceMappings);
        assertEquals(expected, actual);
    }

    public void testParserWithTermination() throws Exception {
        List<BlockDeviceMapping> expected = new ArrayList<BlockDeviceMapping>();
        expected.add(new BlockDeviceMapping().withDeviceName("/dev/sdc").withEbs(new EbsBlockDevice().withSnapshotId("snap-7eb96d16").withVolumeSize(80).withDeleteOnTermination(false)));

        String customDeviceMappings = "/dev/sdc=snap-7eb96d16:80:false";
        List<BlockDeviceMapping> actual = DeviceMappingParser.parse(customDeviceMappings);
        assertEquals(expected, actual);
    }

    public void testParserWithIo() throws Exception {
        List<BlockDeviceMapping> expected = new ArrayList<BlockDeviceMapping>();
        expected.add(new BlockDeviceMapping().withDeviceName("/dev/sdc").withEbs(new EbsBlockDevice().withSnapshotId("snap-7eb96d16").withVolumeSize(80).withDeleteOnTermination(false).withVolumeType("io1").withIops(100)));

        String customDeviceMappings = "/dev/sdc=snap-7eb96d16:80:false:io1:100";
        List<BlockDeviceMapping> actual = DeviceMappingParser.parse(customDeviceMappings);
        assertEquals(expected, actual);
    }

    public void testParserWithSize() throws Exception {
        List<BlockDeviceMapping> expected = new ArrayList<BlockDeviceMapping>();
        expected.add(new BlockDeviceMapping().withDeviceName("/dev/sdd").withEbs(new EbsBlockDevice().withVolumeSize(120)));

        String customDeviceMappings = "/dev/sdd=:120";
        List<BlockDeviceMapping> actual = DeviceMappingParser.parse(customDeviceMappings);
        assertEquals(expected, actual);
    }

    public void testParserWithEncrypted() throws Exception {
        List<BlockDeviceMapping> expected = new ArrayList<BlockDeviceMapping>();
        expected.add(new BlockDeviceMapping().withDeviceName("/dev/sdd").withEbs(new EbsBlockDevice().withVolumeSize(120).withEncrypted(true)));

        String customDeviceMappings = "/dev/sdd=:120::::encrypted";
        List<BlockDeviceMapping> actual = DeviceMappingParser.parse(customDeviceMappings);
        assertEquals(expected, actual);
    }

    public void testParserWithMultiple() throws Exception {
        List<BlockDeviceMapping> expected = new ArrayList<BlockDeviceMapping>();
        expected.add(new BlockDeviceMapping().withDeviceName("/dev/sdd").withEbs(new EbsBlockDevice().withVolumeSize(120).withEncrypted(true)));
        expected.add(new BlockDeviceMapping().withDeviceName("/dev/sdc").withEbs(new EbsBlockDevice().withVolumeSize(120)));

        String customDeviceMappings = "/dev/sdd=:120::::encrypted,/dev/sdc=:120";
        List<BlockDeviceMapping> actual = DeviceMappingParser.parse(customDeviceMappings);
        assertEquals(expected, actual);
    }
}

@@ -1351,16 +1351,39 @@
 kDevice;
+%0Aimport org.junit.Test;
 %0A%0Aimport
@@ -1514,16 +1514,26 @@
 Test %7B%0A%0A
+    @Test%0A
     publ
@@ -1559,33 +1559,16 @@
 ithAmi()
- throws Exception
  %7B%0A     
@@ -1620,34 +1620,16 @@
 rayList%3C
-BlockDeviceMapping
 %3E();%0A   
@@ -1957,32 +1957,42 @@
 actual);%0A    %7D%0A%0A
+    @Test%0A
     public void 
@@ -2018,33 +2018,16 @@
 nation()
- throws Exception
  %7B%0A     
@@ -2079,34 +2079,16 @@
 rayList%3C
-BlockDeviceMapping
 %3E();%0A   
@@ -2475,32 +2475,42 @@
 actual);%0A    %7D%0A%0A
+    @Test%0A
     public void 
@@ -2527,33 +2527,16 @@
 WithIo()
- throws Exception
  %7B%0A     
@@ -2588,34 +2588,16 @@
 rayList%3C
-BlockDeviceMapping
 %3E();%0A   
@@ -3028,32 +3028,42 @@
 actual);%0A    %7D%0A%0A
+    @Test%0A
     public void 
@@ -3082,33 +3082,16 @@
 thSize()
- throws Exception
  %7B%0A     
@@ -3143,34 +3143,16 @@
 rayList%3C
-BlockDeviceMapping
 %3E();%0A   
@@ -3459,32 +3459,42 @@
 actual);%0A    %7D%0A%0A
+    @Test%0A
     public void 
@@ -3518,33 +3518,16 @@
 rypted()
- throws Exception
  %7B%0A     
@@ -3579,34 +3579,16 @@
 rayList%3C
-BlockDeviceMapping
 %3E();%0A   
@@ -3932,24 +3932,34 @@
 al);%0A    %7D%0A%0A
+    @Test%0A
     public v
@@ -3990,25 +3990,8 @@
 le()
- throws Exception
  %7B%0A 
@@ -4047,34 +4047,16 @@
 rayList%3C
-BlockDeviceMapping
 %3E();%0A   

Enable device mapping tests