|  | @@ -23,6 +23,7 @@ from compose.config.environment import Environment
 | 
	
		
			
				|  |  |  from compose.config.errors import ConfigurationError
 | 
	
		
			
				|  |  |  from compose.config.errors import VERSION_EXPLANATION
 | 
	
		
			
				|  |  |  from compose.config.serialize import denormalize_service_dict
 | 
	
		
			
				|  |  | +from compose.config.serialize import serialize_ns_time_value
 | 
	
		
			
				|  |  |  from compose.config.types import VolumeSpec
 | 
	
		
			
				|  |  |  from compose.const import IS_WINDOWS_PLATFORM
 | 
	
		
			
				|  |  |  from compose.utils import nanoseconds_from_time_seconds
 | 
	
	
		
			
				|  | @@ -1713,6 +1714,40 @@ class ConfigTest(unittest.TestCase):
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    def test_merge_depends_on_no_override(self):
 | 
	
		
			
				|  |  | +        base = {
 | 
	
		
			
				|  |  | +            'image': 'busybox',
 | 
	
		
			
				|  |  | +            'depends_on': {
 | 
	
		
			
				|  |  | +                'app1': {'condition': 'service_started'},
 | 
	
		
			
				|  |  | +                'app2': {'condition': 'service_healthy'}
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        override = {}
 | 
	
		
			
				|  |  | +        actual = config.merge_service_dicts(base, override, V2_1)
 | 
	
		
			
				|  |  | +        assert actual == base
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def test_merge_depends_on_mixed_syntax(self):
 | 
	
		
			
				|  |  | +        base = {
 | 
	
		
			
				|  |  | +            'image': 'busybox',
 | 
	
		
			
				|  |  | +            'depends_on': {
 | 
	
		
			
				|  |  | +                'app1': {'condition': 'service_started'},
 | 
	
		
			
				|  |  | +                'app2': {'condition': 'service_healthy'}
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        override = {
 | 
	
		
			
				|  |  | +            'depends_on': ['app3']
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        actual = config.merge_service_dicts(base, override, V2_1)
 | 
	
		
			
				|  |  | +        assert actual == {
 | 
	
		
			
				|  |  | +            'image': 'busybox',
 | 
	
		
			
				|  |  | +            'depends_on': {
 | 
	
		
			
				|  |  | +                'app1': {'condition': 'service_started'},
 | 
	
		
			
				|  |  | +                'app2': {'condition': 'service_healthy'},
 | 
	
		
			
				|  |  | +                'app3': {'condition': 'service_started'}
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      def test_external_volume_config(self):
 | 
	
		
			
				|  |  |          config_details = build_config_details({
 | 
	
		
			
				|  |  |              'version': '2',
 | 
	
	
		
			
				|  | @@ -3300,3 +3335,38 @@ class SerializeTest(unittest.TestCase):
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          assert denormalize_service_dict(service_dict, V2_1) == service_dict
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def test_serialize_time(self):
 | 
	
		
			
				|  |  | +        data = {
 | 
	
		
			
				|  |  | +            9: '9ns',
 | 
	
		
			
				|  |  | +            9000: '9us',
 | 
	
		
			
				|  |  | +            9000000: '9ms',
 | 
	
		
			
				|  |  | +            90000000: '90ms',
 | 
	
		
			
				|  |  | +            900000000: '900ms',
 | 
	
		
			
				|  |  | +            999999999: '999999999ns',
 | 
	
		
			
				|  |  | +            1000000000: '1s',
 | 
	
		
			
				|  |  | +            60000000000: '1m',
 | 
	
		
			
				|  |  | +            60000000001: '60000000001ns',
 | 
	
		
			
				|  |  | +            9000000000000: '150m',
 | 
	
		
			
				|  |  | +            90000000000000: '25h',
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        for k, v in data.items():
 | 
	
		
			
				|  |  | +            assert serialize_ns_time_value(k) == v
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def test_denormalize_healthcheck(self):
 | 
	
		
			
				|  |  | +        service_dict = {
 | 
	
		
			
				|  |  | +            'image': 'test',
 | 
	
		
			
				|  |  | +            'healthcheck': {
 | 
	
		
			
				|  |  | +                'test': 'exit 1',
 | 
	
		
			
				|  |  | +                'interval': '1m40s',
 | 
	
		
			
				|  |  | +                'timeout': '30s',
 | 
	
		
			
				|  |  | +                'retries': 5
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        processed_service = config.process_service(config.ServiceConfig(
 | 
	
		
			
				|  |  | +            '.', 'test', 'test', service_dict
 | 
	
		
			
				|  |  | +        ))
 | 
	
		
			
				|  |  | +        denormalized_service = denormalize_service_dict(processed_service, V2_1)
 | 
	
		
			
				|  |  | +        assert denormalized_service['healthcheck']['interval'] == '100s'
 | 
	
		
			
				|  |  | +        assert denormalized_service['healthcheck']['timeout'] == '30s'
 |