|  | @@ -25,6 +25,8 @@ import org.elasticsearch.common.Strings;
 | 
	
		
			
				|  |  |  import org.elasticsearch.common.bytes.BytesReference;
 | 
	
		
			
				|  |  |  import org.elasticsearch.common.io.stream.BytesStreamOutput;
 | 
	
		
			
				|  |  |  import org.elasticsearch.common.io.stream.StreamInput;
 | 
	
		
			
				|  |  | +import org.elasticsearch.common.unit.ByteSizeUnit;
 | 
	
		
			
				|  |  | +import org.elasticsearch.common.unit.ByteSizeValue;
 | 
	
		
			
				|  |  |  import org.elasticsearch.common.unit.TimeValue;
 | 
	
		
			
				|  |  |  import org.elasticsearch.common.xcontent.ToXContent;
 | 
	
		
			
				|  |  |  import org.elasticsearch.common.xcontent.XContentBuilder;
 | 
	
	
		
			
				|  | @@ -726,4 +728,20 @@ public class SettingsTests extends ESTestCase {
 | 
	
		
			
				|  |  |          assertThat(actual, equalTo(expected));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    public void testFractionalByteSizeValue() {
 | 
	
		
			
				|  |  | +        final Setting<ByteSizeValue> setting =
 | 
	
		
			
				|  |  | +                Setting.byteSizeSetting("key", ByteSizeValue.parseBytesSizeValue(randomIntBetween(1, 16) + "k", "key"));
 | 
	
		
			
				|  |  | +        final ByteSizeValue expected = new ByteSizeValue(randomNonNegativeLong(), ByteSizeUnit.BYTES);
 | 
	
		
			
				|  |  | +        final Settings settings = Settings.builder().put("key", expected).build();
 | 
	
		
			
				|  |  | +        /*
 | 
	
		
			
				|  |  | +         * Previously we would internally convert the byte size value to a string using a method that tries to be smart about the units
 | 
	
		
			
				|  |  | +         * (e.g., 1024 bytes would be converted to 1kb). However, this had a problem in that, for example, 1536 bytes would be converted to
 | 
	
		
			
				|  |  | +         * 1.5k. Then, 1.5k could not be converted back to a ByteSizeValue because ByteSizeValues do not support fractional components.
 | 
	
		
			
				|  |  | +         * Effectively this test is then asserting that we no longer make this mistake when doing the internal string conversion. Instead,
 | 
	
		
			
				|  |  | +         * we convert to a string using a method that does not lose the original unit.
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        final ByteSizeValue actual = setting.get(settings);
 | 
	
		
			
				|  |  | +        assertThat(actual, equalTo(expected));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }
 |