def setUp(self):
        self.api = API()
        logging.basicConfig(level=logging.DEBUG)
        self.name = 'TEST_' + TestUtils.random_string(6)
        self.display_name = 'green'
        self.display_name_short = 'blue'
        self.description = 'magenta'
        self.default_aggregate = aggregates.SUM
        self.default_resolution = 60000
        self.unit = units.DURATION
        self.type = 'FOOBAR'
        self.is_disabled = False
        self.metric = Metric(name=self.name,
                             display_name=self.display_name,
                             display_name_short=self.display_name_short,
                             description=self.description,
                             default_aggregate=self.default_aggregate,
                             default_resolution=self.default_resolution,
                             unit=self.unit,
                             _type=self.type,
                             is_disabled=self.is_disabled)

        self.api.metric_create_batch([self.metric])

        logging.basicConfig(level=logging.INFO)
    def setUp(self):
        self.api = API()
        logging.basicConfig(level=logging.DEBUG)
        self.name = "TEST_" + TestUtils.random_string(6)
        self.display_name = "green"
        self.display_name_short = "blue"
        self.description = "magenta"
        self.default_aggregate = aggregates.SUM
        self.default_resolution = 60000
        self.unit = units.DURATION
        self.type = "FOOBAR"
        self.is_disabled = False
        self.metric = Metric(
            name=self.name,
            display_name=self.display_name,
            display_name_short=self.display_name_short,
            description=self.description,
            default_aggregate=self.default_aggregate,
            default_resolution=self.default_resolution,
            unit=self.unit,
            _type=self.type,
            is_disabled=self.is_disabled,
        )

        self.api.metric_create_batch([self.metric])

        logging.basicConfig(level=logging.INFO)
    def test_metric_list_to_json(self):
        l = [Metric(name="ONE"), Metric(name="TWO")]
        self.maxDiff = None
        s = [
            '[{"defaultAggregate": "avg", "defaultResolutionMS": 1000, "description": "", "displayName": "ONE",',
            ' "displayNameShort": "ONE", "isDisabled": false, "name": "ONE",',
            ' "unit": "number"},',
            ' {"defaultAggregate": "avg", "defaultResolutionMS": 1000, "description": "", "displayName": "TWO",',
            ' "displayNameShort": "TWO", "isDisabled": false, "name": "TWO",',
            ' "unit": "number"}]'
        ]
        expected = "".join(s)

        data = json.dumps(l,
                          sort_keys=True,
                          default=tspapi.metric.serialize_instance)
        self.assertEqual(expected, data)
    def test_minimal_constructor(self):
        name = 'FOO'
        m = Metric(name=name)

        self.assertEqual(name, m.name)
        self.assertEqual(name, m.display_name)
        self.assertEqual(name, m.display_name_short)
        self.assertEqual('', m.description)
        self.assertEqual(m.default_aggregate, aggregates.AVG)
        self.assertEqual(m.default_resolution, 1000)
        self.assertEqual(m.unit, units.NUMBER)
        self.assertIsNone(m.type)
 def test_metric_instance_empty_name(self):
     """
     Ensure that creating a metric with an empty name throws a
     ValueError exception
     :return:
     """
     try:
         m = Metric()
         print(m)
         self.assertTrue(False)
     except ValueError:
         pass
 def test_metric_to_json(self):
     m = Metric(name="TEST")
     data = json.dumps(m,
                       sort_keys=True,
                       default=tspapi.metric.serialize_instance)
     s = [
         '{"defaultAggregate": "avg", "defaultResolutionMS": 1000, "description": "",',
         ' "displayName": "TEST", "displayNameShort": "TEST", "isDisabled": false, "name": "TEST",',
         ' "unit": "number"}'
     ]
     expected = "".join(s)
     self.assertEqual(expected, data)
    def test_metric_create_one_batch(self):
        name = 'TEST_CREATE_BATCH_ONE_FOOBAR' + TestUtils.random_string(6)
        display_name = "BATCH" + TestUtils.random_string(6)
        display_name_short = "BATCH" + TestUtils.random_string(3)
        description = TestUtils.random_string(32)
        default_aggregate = aggregates.SUM
        default_resolution = random.randrange(1000, 60000)
        unit = units.PERCENT
        _type = 'FOO'
        is_disabled = True

        metric1 = Metric(name=name,
                         display_name=display_name,
                         display_name_short=display_name_short,
                         description=description,
                         default_aggregate=default_aggregate,
                         default_resolution=default_resolution,
                         unit=unit,
                         _type=_type,
                         is_disabled=is_disabled)

        metrics = self.api.metric_create_batch([metric1])
        self.assertEqual(len(metrics), 1)

        m = metrics[0]
        self.assertEqual(name, m.name)
        self.assertEqual(display_name, m.display_name)
        self.assertEqual(display_name_short, m.display_name_short)
        self.assertEqual(description, m.description)
        self.assertEqual(default_aggregate.upper(), m.default_aggregate)
        self.assertEqual(default_resolution, m.default_resolution)
        self.assertEqual(unit, m.unit)
        self.assertEqual(_type, m.type)
        self.assertEqual(is_disabled, m.is_disabled)

        self.api.metric_delete(name)
class MetricTest(TestCase):
    def setUp(self):
        self.api = API()
        logging.basicConfig(level=logging.DEBUG)
        self.name = "TEST_" + TestUtils.random_string(6)
        self.display_name = "green"
        self.display_name_short = "blue"
        self.description = "magenta"
        self.default_aggregate = aggregates.SUM
        self.default_resolution = 60000
        self.unit = units.DURATION
        self.type = "FOOBAR"
        self.is_disabled = False
        self.metric = Metric(
            name=self.name,
            display_name=self.display_name,
            display_name_short=self.display_name_short,
            description=self.description,
            default_aggregate=self.default_aggregate,
            default_resolution=self.default_resolution,
            unit=self.unit,
            _type=self.type,
            is_disabled=self.is_disabled,
        )

        self.api.metric_create_batch([self.metric])

        logging.basicConfig(level=logging.INFO)

    def tearDown(self):
        self.api.metric_delete(self.metric.name)

    def test_minimal_constructor(self):
        name = "FOO"
        m = Metric(name=name)

        self.assertEqual(name, m.name)
        self.assertEqual(name, m.display_name)
        self.assertEqual(name, m.display_name_short)
        self.assertEqual("", m.description)
        self.assertEqual(m.default_aggregate, aggregates.AVG)
        self.assertEqual(m.default_resolution, 1000)
        self.assertEqual(m.unit, units.NUMBER)
        self.assertIsNone(m.type)

    def test_constructor_arguments(self):
        self.assertEqual(self.name, self.metric.name)
        self.assertEqual(self.display_name, self.metric.display_name)
        self.assertEqual(self.display_name_short, self.metric.display_name_short)
        self.assertEqual(self.description, self.metric.description)
        self.assertEqual(self.default_aggregate, self.metric.default_aggregate)
        self.assertEqual(self.default_resolution, self.metric.default_resolution)
        self.assertEqual(self.unit, self.metric.unit)
        self.assertEqual(self.type, self.metric.type)
        self.assertEqual(self.is_disabled, self.metric.is_disabled)

    def test_representation_string(self):
        """
        Test the output of the __repr__ method
        :param self:
        :return:
        """
        expected = [
            "Metric(name='{0}', display_name='green', display_name_short='blue',".format(self.metric.name),
            " description='magenta', default_aggregate='sum', default_resolution=60000,",
            " unit='duration', _type='FOOBAR', is_disabled='False')",
        ]
        self.assertEqual("".join(expected), self.metric.__repr__())

    def test_metric_to_json(self):
        m = Metric(name="TEST")
        data = json.dumps(m, sort_keys=True, default=tspapi.metric.serialize_instance)
        s = [
            '{"defaultAggregate": "avg", "defaultResolutionMS": 1000, "description": "",',
            ' "displayName": "TEST", "displayNameShort": "TEST", "isDisabled": false, "name": "TEST",',
            ' "unit": "number"}',
        ]
        expected = "".join(s)
        self.assertEqual(expected, data)

    def test_metric_list_to_json(self):
        l = [Metric(name="ONE"), Metric(name="TWO")]
        self.maxDiff = None
        s = [
            '[{"defaultAggregate": "avg", "defaultResolutionMS": 1000, "description": "", "displayName": "ONE",',
            ' "displayNameShort": "ONE", "isDisabled": false, "name": "ONE",',
            ' "unit": "number"},',
            ' {"defaultAggregate": "avg", "defaultResolutionMS": 1000, "description": "", "displayName": "TWO",',
            ' "displayNameShort": "TWO", "isDisabled": false, "name": "TWO",',
            ' "unit": "number"}]',
        ]
        expected = "".join(s)

        data = json.dumps(l, sort_keys=True, default=tspapi.metric.serialize_instance)
        self.assertEqual(expected, data)

    def test_metric_instance_empty_name(self):
        """
        Ensure that creating a metric with an empty name throws a
        ValueError exception
        :return:
        """
        try:
            m = Metric()
            print(m)
            self.assertTrue(False)
        except ValueError:
            pass

    def test_metric_empty_name(self):
        """
        Ensure that trying to call the create metric API with an empty name
        throws a ValueError exception
        :return:
        """
        try:
            self.api.metric_create()
            self.assertTrue(False)
        except ValueError:
            pass

    def test_metric_create(self):
        name = "TEST_CREATE_FOOBAR" + TestUtils.random_string(6)
        display_name = "TEST_METRIC_CREATE" + TestUtils.random_string(6)
        display_name_short = "TEST_METRIC" + TestUtils.random_string(6)
        description = TestUtils.random_string(32)
        default_aggregate = aggregates.AVG
        default_resolution = 60000
        unit = units.DURATION
        _type = "FOO"
        is_disabled = True
        metric = self.api.metric_create(
            name=name,
            display_name=display_name,
            display_name_short=display_name_short,
            description=description,
            default_aggregate=default_aggregate,
            default_resolution=default_resolution,
            unit=unit,
            _type=_type,
            is_disabled=is_disabled,
        )
        self.assertEqual(name, metric.name)
        self.assertEqual(display_name, metric.display_name)
        self.assertEqual(display_name_short, metric.display_name_short)
        self.assertEqual(description, metric.description)
        self.assertEqual(default_aggregate.upper(), metric.default_aggregate)
        self.assertEqual(default_resolution, metric.default_resolution)
        self.assertEqual(unit, metric.unit)
        self.assertEqual(_type, metric.type)
        self.assertEqual(is_disabled, metric.is_disabled)

    def test_metric_create_one_batch(self):
        name = "TEST_CREATE_BATCH_ONE_FOOBAR" + TestUtils.random_string(6)
        display_name = "BATCH" + TestUtils.random_string(6)
        display_name_short = "BATCH" + TestUtils.random_string(3)
        description = TestUtils.random_string(32)
        default_aggregate = aggregates.SUM
        default_resolution = random.randrange(1000, 60000)
        unit = units.PERCENT
        _type = "FOO"
        is_disabled = True

        metric1 = Metric(
            name=name,
            display_name=display_name,
            display_name_short=display_name_short,
            description=description,
            default_aggregate=default_aggregate,
            default_resolution=default_resolution,
            unit=unit,
            _type=_type,
            is_disabled=is_disabled,
        )

        metrics = self.api.metric_create_batch([metric1])
        self.assertEqual(len(metrics), 1)

        m = metrics[0]
        self.assertEqual(name, m.name)
        self.assertEqual(display_name, m.display_name)
        self.assertEqual(display_name_short, m.display_name_short)
        self.assertEqual(description, m.description)
        self.assertEqual(default_aggregate.upper(), m.default_aggregate)
        self.assertEqual(default_resolution, m.default_resolution)
        self.assertEqual(unit, m.unit)
        self.assertEqual(_type, m.type)
        self.assertEqual(is_disabled, m.is_disabled)

        self.api.metric_delete(name)

    def test_metric_large_display_name(self):
        """
        Test to see that we can handle a display name up to 1K characters
        :return:
        """
        try:
            name = "TEST_CREATE" + TestUtils.random_string(6)
            display_name = TestUtils.random_string(1024 * 1024)
            metric = self.api.metric_create(name=name, display_name=display_name)
            self.assertTrue(True)
        except HTTPResponseError as e:
            self.assertEqual(requests.codes.request_entity_too_large, e.status_code)

    def test_metric_large_short_display_name(self):
        """
        Test on the limit of the short display name
        :return:
        """
        try:
            name = "TEST_CREATE" + TestUtils.random_string(6)
            display_name_short = TestUtils.random_string(1024 * 1024)
            metric = self.api.metric_create(name=name, display_name_short=display_name_short)
            self.assertTrue(True)
        except HTTPResponseError as e:
            self.assertEqual(requests.codes.request_entity_too_large, e.status_code)

    def test_metric_bad_aggregate(self):
        try:
            name = "TEST_CREATE" + TestUtils.random_string(6)
            display_name = TestUtils.random_string(32)
            metric = self.api.metric_create(name=name, display_name=display_name, default_aggregate="foo")
            self.assertTrue(False)
        except HTTPResponseError as e:
            self.assertEqual(requests.codes.unprocessable_entity, e.status_code)

    def test_metric_bad_unit(self):
        try:
            name = "TEST_CREATE" + TestUtils.random_string(6)
            display_name = TestUtils.random_string(32)
            metric = self.api.metric_create(name=name, display_name=display_name, unit="foo")
            self.assertTrue(False)
        except HTTPResponseError as e:
            self.assertEqual(requests.codes.unprocessable_entity, e.status_code)

    def test_metric_create_multiple_batch(self):
        name1 = "TEST_CREATE_BATCH_ONE_FOOBAR" + TestUtils.random_string(6)
        name2 = "TEST_CREATE_BATCH_TWO_FOOBAR" + TestUtils.random_string(6)
        name3 = "TEST_CREATE_BATCH_THREE_FOOBAR" + TestUtils.random_string(6)
        name4 = "TEST_CREATE_BATCH_FOUR_FOOBAR" + TestUtils.random_string(6)

        display_name1 = "TEST_DISPLAY_NAME" + TestUtils.random_string(6)
        display_name2 = "TEST_DISPLAY_NAME" + TestUtils.random_string(6)
        display_name3 = "TEST_DISPLAY_NAME" + TestUtils.random_string(6)
        display_name4 = "TEST_DISPLAY_NAME" + TestUtils.random_string(6)

        display_name_short1 = "TEST_SHORT" + TestUtils.random_string(10)
        display_name_short2 = "TEST_SHORT" + TestUtils.random_string(10)
        display_name_short3 = "TEST_SHORT" + TestUtils.random_string(10)
        display_name_short4 = "TEST_SHORT" + TestUtils.random_string(10)

        description1 = TestUtils.random_string(32)
        description2 = TestUtils.random_string(32)
        description3 = TestUtils.random_string(32)
        description4 = TestUtils.random_string(32)

        default_aggregate1 = aggregates.AVG
        default_aggregate2 = aggregates.MIN
        default_aggregate3 = aggregates.MAX
        default_aggregate4 = aggregates.SUM

        default_resolution1 = random.randrange(1000, 60000)
        default_resolution2 = random.randrange(1000, 60000)
        default_resolution3 = random.randrange(1000, 60000)
        default_resolution4 = random.randrange(1000, 60000)

        unit1 = units.BYTECOUNT
        unit2 = units.DURATION
        unit3 = units.NUMBER
        unit4 = units.PERCENT

        is_disabled1 = True
        is_disabled2 = False
        is_disabled3 = True
        is_disabled4 = False

        _type1 = TestUtils.random_string(6)
        _type2 = TestUtils.random_string(6)
        _type3 = TestUtils.random_string(6)
        _type4 = TestUtils.random_string(6)

        new_metrics = [
            Metric(
                name=name1,
                display_name=display_name1,
                display_name_short=display_name_short1,
                description=description1,
                default_aggregate=default_aggregate1,
                default_resolution=default_resolution1,
                unit=unit1,
                _type=_type1,
                is_disabled=is_disabled1,
            ),
            Metric(
                name=name2,
                display_name=display_name2,
                display_name_short=display_name_short2,
                description=description2,
                default_aggregate=default_aggregate2,
                default_resolution=default_resolution2,
                unit=unit2,
                _type=_type2,
                is_disabled=is_disabled2,
            ),
            Metric(
                name=name3,
                display_name=display_name3,
                display_name_short=display_name_short3,
                description=description3,
                default_aggregate=default_aggregate3,
                default_resolution=default_resolution3,
                unit=unit3,
                _type=_type3,
                is_disabled=is_disabled3,
            ),
            Metric(
                name=name4,
                display_name=display_name4,
                display_name_short=display_name_short4,
                description=description4,
                default_aggregate=default_aggregate4,
                default_resolution=default_resolution4,
                unit=unit4,
                _type=_type4,
                is_disabled=is_disabled4,
            ),
        ]

        metrics = self.api.metric_create_batch(new_metrics)

        self.assertEqual(4, len(metrics))

    def test_metric_create_batch_from_file(self):
        self.api.metric_create_batch(path="tests/unit/tspapi/metric_batch.json")
        self.api.metric_delete("TEST_MY_COOL_METRIC_31")
        self.api.metric_delete("TEST_MY_COOL_METRIC_32")

    def test_metric_get(self):
        metrics = self.api.metric_get()
        self.assertIsNotNone(metrics)

    def test_metric_delete(self):
        name = "TEST_DELETE_FOOBAR" + TestUtils.random_string(6)
        self.api.metric_create(name=name)
        self.api.metric_delete(name)

    def test_metric_delete_no_name(self):
        try:
            self.api.metric_delete()
            self.assertTrue(False)
        except ValueError:
            pass

    def test_metric_delete_name_does_not_exist(self):
        try:
            self.api.metric_delete(TestUtils.random_string(10))
        except HTTPResponseError as e:
            self.assertEqual(requests.codes.unprocessable_entity, e.status_code)

    def test_metric_update(self):
        name = "TEST_UPDATE_" + TestUtils.random_string(6)
        display_name = TestUtils.random_string(8)
        display_name_short = TestUtils.random_string(16)
        description = TestUtils.random_string(16)
        default_aggregate = aggregates.SUM
        default_resolution = 60000
        unit = units.PERCENT
        is_disabled = False
        _type = "DEVICE"
        self.api.metric_create(
            name=name,
            display_name=display_name,
            display_name_short=display_name_short,
            description=description,
            default_aggregate=default_aggregate,
            default_resolution=default_resolution,
            unit=unit,
            is_disabled=is_disabled,
            _type=_type,
        )

        display_name = TestUtils.random_string(8)
        display_name_short = TestUtils.random_string(16)
        description = TestUtils.random_string(16)
        default_aggregate = aggregates.MAX
        default_resolution = 30000
        unit = units.DURATION
        is_disabled = True
        _type = "HOST"
        metric = self.api.metric_update(
            name=name,
            display_name=display_name,
            display_name_short=display_name_short,
            description=description,
            default_aggregate=default_aggregate,
            default_resolution=default_resolution,
            unit=unit,
            is_disabled=is_disabled,
            _type=_type,
        )

        self.assertEqual(name, metric.name)
        self.assertEqual(display_name, metric.display_name)
        self.assertEqual(display_name_short, metric.display_name_short)
        self.assertEqual(description, metric.description)
        self.assertEqual(default_aggregate.upper(), metric.default_aggregate)
        self.assertEqual(default_resolution, metric.default_resolution)
        self.assertEqual(unit, metric.unit)
        self.assertEqual(_type, metric.type)
        self.assertEqual(is_disabled, metric.is_disabled)

        self.api.metric_delete(name)

    def test_metric_batch_update(self):
        pass
class MetricTest(TestCase):
    def setUp(self):
        self.api = API()
        logging.basicConfig(level=logging.DEBUG)
        self.name = 'TEST_' + TestUtils.random_string(6)
        self.display_name = 'green'
        self.display_name_short = 'blue'
        self.description = 'magenta'
        self.default_aggregate = aggregates.SUM
        self.default_resolution = 60000
        self.unit = units.DURATION
        self.type = 'FOOBAR'
        self.is_disabled = False
        self.metric = Metric(name=self.name,
                             display_name=self.display_name,
                             display_name_short=self.display_name_short,
                             description=self.description,
                             default_aggregate=self.default_aggregate,
                             default_resolution=self.default_resolution,
                             unit=self.unit,
                             _type=self.type,
                             is_disabled=self.is_disabled)

        self.api.metric_create_batch([self.metric])

        logging.basicConfig(level=logging.INFO)

    def tearDown(self):
        self.api.metric_delete(self.metric.name)

    def test_minimal_constructor(self):
        name = 'FOO'
        m = Metric(name=name)

        self.assertEqual(name, m.name)
        self.assertEqual(name, m.display_name)
        self.assertEqual(name, m.display_name_short)
        self.assertEqual('', m.description)
        self.assertEqual(m.default_aggregate, aggregates.AVG)
        self.assertEqual(m.default_resolution, 1000)
        self.assertEqual(m.unit, units.NUMBER)
        self.assertIsNone(m.type)

    def test_constructor_arguments(self):
        self.assertEqual(self.name, self.metric.name)
        self.assertEqual(self.display_name, self.metric.display_name)
        self.assertEqual(self.display_name_short,
                         self.metric.display_name_short)
        self.assertEqual(self.description, self.metric.description)
        self.assertEqual(self.default_aggregate, self.metric.default_aggregate)
        self.assertEqual(self.default_resolution,
                         self.metric.default_resolution)
        self.assertEqual(self.unit, self.metric.unit)
        self.assertEqual(self.type, self.metric.type)
        self.assertEqual(self.is_disabled, self.metric.is_disabled)

    def test_representation_string(self):
        """
        Test the output of the __repr__ method
        :param self:
        :return:
        """
        expected = [
            "Metric(name='{0}', display_name='green', display_name_short='blue',"
            .format(self.metric.name),
            " description='magenta', default_aggregate='sum', default_resolution=60000,",
            " unit='duration', _type='FOOBAR', is_disabled='False')"
        ]
        self.assertEqual("".join(expected), self.metric.__repr__())

    def test_metric_to_json(self):
        m = Metric(name="TEST")
        data = json.dumps(m,
                          sort_keys=True,
                          default=tspapi.metric.serialize_instance)
        s = [
            '{"defaultAggregate": "avg", "defaultResolutionMS": 1000, "description": "",',
            ' "displayName": "TEST", "displayNameShort": "TEST", "isDisabled": false, "name": "TEST",',
            ' "unit": "number"}'
        ]
        expected = "".join(s)
        self.assertEqual(expected, data)

    def test_metric_list_to_json(self):
        l = [Metric(name="ONE"), Metric(name="TWO")]
        self.maxDiff = None
        s = [
            '[{"defaultAggregate": "avg", "defaultResolutionMS": 1000, "description": "", "displayName": "ONE",',
            ' "displayNameShort": "ONE", "isDisabled": false, "name": "ONE",',
            ' "unit": "number"},',
            ' {"defaultAggregate": "avg", "defaultResolutionMS": 1000, "description": "", "displayName": "TWO",',
            ' "displayNameShort": "TWO", "isDisabled": false, "name": "TWO",',
            ' "unit": "number"}]'
        ]
        expected = "".join(s)

        data = json.dumps(l,
                          sort_keys=True,
                          default=tspapi.metric.serialize_instance)
        self.assertEqual(expected, data)

    def test_metric_instance_empty_name(self):
        """
        Ensure that creating a metric with an empty name throws a
        ValueError exception
        :return:
        """
        try:
            m = Metric()
            print(m)
            self.assertTrue(False)
        except ValueError:
            pass

    def test_metric_empty_name(self):
        """
        Ensure that trying to call the create metric API with an empty name
        throws a ValueError exception
        :return:
        """
        try:
            self.api.metric_create()
            self.assertTrue(False)
        except ValueError:
            pass

    def test_metric_create(self):
        name = "TEST_CREATE_FOOBAR" + TestUtils.random_string(6)
        display_name = "TEST_METRIC_CREATE" + TestUtils.random_string(6)
        display_name_short = "TEST_METRIC" + TestUtils.random_string(6)
        description = TestUtils.random_string(32)
        default_aggregate = aggregates.AVG
        default_resolution = 60000
        unit = units.DURATION
        _type = 'FOO'
        is_disabled = True
        metric = self.api.metric_create(name=name,
                                        display_name=display_name,
                                        display_name_short=display_name_short,
                                        description=description,
                                        default_aggregate=default_aggregate,
                                        default_resolution=default_resolution,
                                        unit=unit,
                                        _type=_type,
                                        is_disabled=is_disabled)
        self.assertEqual(name, metric.name)
        self.assertEqual(display_name, metric.display_name)
        self.assertEqual(display_name_short, metric.display_name_short)
        self.assertEqual(description, metric.description)
        self.assertEqual(default_aggregate.upper(), metric.default_aggregate)
        self.assertEqual(default_resolution, metric.default_resolution)
        self.assertEqual(unit, metric.unit)
        self.assertEqual(_type, metric.type)
        self.assertEqual(is_disabled, metric.is_disabled)

    def test_metric_create_one_batch(self):
        name = 'TEST_CREATE_BATCH_ONE_FOOBAR' + TestUtils.random_string(6)
        display_name = "BATCH" + TestUtils.random_string(6)
        display_name_short = "BATCH" + TestUtils.random_string(3)
        description = TestUtils.random_string(32)
        default_aggregate = aggregates.SUM
        default_resolution = random.randrange(1000, 60000)
        unit = units.PERCENT
        _type = 'FOO'
        is_disabled = True

        metric1 = Metric(name=name,
                         display_name=display_name,
                         display_name_short=display_name_short,
                         description=description,
                         default_aggregate=default_aggregate,
                         default_resolution=default_resolution,
                         unit=unit,
                         _type=_type,
                         is_disabled=is_disabled)

        metrics = self.api.metric_create_batch([metric1])
        self.assertEqual(len(metrics), 1)

        m = metrics[0]
        self.assertEqual(name, m.name)
        self.assertEqual(display_name, m.display_name)
        self.assertEqual(display_name_short, m.display_name_short)
        self.assertEqual(description, m.description)
        self.assertEqual(default_aggregate.upper(), m.default_aggregate)
        self.assertEqual(default_resolution, m.default_resolution)
        self.assertEqual(unit, m.unit)
        self.assertEqual(_type, m.type)
        self.assertEqual(is_disabled, m.is_disabled)

        self.api.metric_delete(name)

    def test_metric_large_display_name(self):
        """
        Test to see that we can handle a display name up to 1K characters
        :return:
        """
        try:
            name = 'TEST_CREATE' + TestUtils.random_string(6)
            display_name = TestUtils.random_string(1024 * 1024)
            metric = self.api.metric_create(name=name,
                                            display_name=display_name)
            self.assertTrue(True)
        except HTTPResponseError as e:
            self.assertEqual(requests.codes.request_entity_too_large,
                             e.status_code)

    def test_metric_large_short_display_name(self):
        """
        Test on the limit of the short display name
        :return:
        """
        try:
            name = 'TEST_CREATE' + TestUtils.random_string(6)
            display_name_short = TestUtils.random_string(1024 * 1024)
            metric = self.api.metric_create(
                name=name, display_name_short=display_name_short)
            self.assertTrue(True)
        except HTTPResponseError as e:
            self.assertEqual(requests.codes.request_entity_too_large,
                             e.status_code)

    def test_metric_bad_aggregate(self):
        try:
            name = 'TEST_CREATE' + TestUtils.random_string(6)
            display_name = TestUtils.random_string(32)
            metric = self.api.metric_create(name=name,
                                            display_name=display_name,
                                            default_aggregate='foo')
            self.assertTrue(False)
        except HTTPResponseError as e:
            self.assertEqual(requests.codes.unprocessable_entity,
                             e.status_code)

    def test_metric_bad_unit(self):
        try:
            name = 'TEST_CREATE' + TestUtils.random_string(6)
            display_name = TestUtils.random_string(32)
            metric = self.api.metric_create(name=name,
                                            display_name=display_name,
                                            unit='foo')
            self.assertTrue(False)
        except HTTPResponseError as e:
            self.assertEqual(requests.codes.unprocessable_entity,
                             e.status_code)

    def test_metric_create_multiple_batch(self):
        name1 = 'TEST_CREATE_BATCH_ONE_FOOBAR' + TestUtils.random_string(6)
        name2 = 'TEST_CREATE_BATCH_TWO_FOOBAR' + TestUtils.random_string(6)
        name3 = 'TEST_CREATE_BATCH_THREE_FOOBAR' + TestUtils.random_string(6)
        name4 = 'TEST_CREATE_BATCH_FOUR_FOOBAR' + TestUtils.random_string(6)

        display_name1 = 'TEST_DISPLAY_NAME' + TestUtils.random_string(6)
        display_name2 = 'TEST_DISPLAY_NAME' + TestUtils.random_string(6)
        display_name3 = 'TEST_DISPLAY_NAME' + TestUtils.random_string(6)
        display_name4 = 'TEST_DISPLAY_NAME' + TestUtils.random_string(6)

        display_name_short1 = 'TEST_SHORT' + TestUtils.random_string(10)
        display_name_short2 = 'TEST_SHORT' + TestUtils.random_string(10)
        display_name_short3 = 'TEST_SHORT' + TestUtils.random_string(10)
        display_name_short4 = 'TEST_SHORT' + TestUtils.random_string(10)

        description1 = TestUtils.random_string(32)
        description2 = TestUtils.random_string(32)
        description3 = TestUtils.random_string(32)
        description4 = TestUtils.random_string(32)

        default_aggregate1 = aggregates.AVG
        default_aggregate2 = aggregates.MIN
        default_aggregate3 = aggregates.MAX
        default_aggregate4 = aggregates.SUM

        default_resolution1 = random.randrange(1000, 60000)
        default_resolution2 = random.randrange(1000, 60000)
        default_resolution3 = random.randrange(1000, 60000)
        default_resolution4 = random.randrange(1000, 60000)

        unit1 = units.BYTECOUNT
        unit2 = units.DURATION
        unit3 = units.NUMBER
        unit4 = units.PERCENT

        is_disabled1 = True
        is_disabled2 = False
        is_disabled3 = True
        is_disabled4 = False

        _type1 = TestUtils.random_string(6)
        _type2 = TestUtils.random_string(6)
        _type3 = TestUtils.random_string(6)
        _type4 = TestUtils.random_string(6)

        new_metrics = [
            Metric(name=name1,
                   display_name=display_name1,
                   display_name_short=display_name_short1,
                   description=description1,
                   default_aggregate=default_aggregate1,
                   default_resolution=default_resolution1,
                   unit=unit1,
                   _type=_type1,
                   is_disabled=is_disabled1),
            Metric(name=name2,
                   display_name=display_name2,
                   display_name_short=display_name_short2,
                   description=description2,
                   default_aggregate=default_aggregate2,
                   default_resolution=default_resolution2,
                   unit=unit2,
                   _type=_type2,
                   is_disabled=is_disabled2),
            Metric(name=name3,
                   display_name=display_name3,
                   display_name_short=display_name_short3,
                   description=description3,
                   default_aggregate=default_aggregate3,
                   default_resolution=default_resolution3,
                   unit=unit3,
                   _type=_type3,
                   is_disabled=is_disabled3),
            Metric(name=name4,
                   display_name=display_name4,
                   display_name_short=display_name_short4,
                   description=description4,
                   default_aggregate=default_aggregate4,
                   default_resolution=default_resolution4,
                   unit=unit4,
                   _type=_type4,
                   is_disabled=is_disabled4)
        ]

        metrics = self.api.metric_create_batch(new_metrics)

        self.assertEqual(4, len(metrics))

    def test_metric_create_batch_from_file(self):
        self.api.metric_create_batch(
            path="tests/unit/tspapi/metric_batch.json")
        self.api.metric_delete('TEST_MY_COOL_METRIC_31')
        self.api.metric_delete('TEST_MY_COOL_METRIC_32')

    def test_metric_get(self):
        metrics = self.api.metric_get()
        self.assertIsNotNone(metrics)

    def test_metric_delete(self):
        name = 'TEST_DELETE_FOOBAR' + TestUtils.random_string(6)
        self.api.metric_create(name=name)
        self.api.metric_delete(name)

    def test_metric_delete_no_name(self):
        try:
            self.api.metric_delete()
            self.assertTrue(False)
        except ValueError:
            pass

    def test_metric_delete_name_does_not_exist(self):
        try:
            self.api.metric_delete(TestUtils.random_string(10))
        except HTTPResponseError as e:
            self.assertEqual(requests.codes.unprocessable_entity,
                             e.status_code)

    def test_metric_update(self):
        name = 'TEST_UPDATE_' + TestUtils.random_string(6)
        display_name = TestUtils.random_string(8)
        display_name_short = TestUtils.random_string(16)
        description = TestUtils.random_string(16)
        default_aggregate = aggregates.SUM
        default_resolution = 60000
        unit = units.PERCENT
        is_disabled = False
        _type = 'DEVICE'
        self.api.metric_create(name=name,
                               display_name=display_name,
                               display_name_short=display_name_short,
                               description=description,
                               default_aggregate=default_aggregate,
                               default_resolution=default_resolution,
                               unit=unit,
                               is_disabled=is_disabled,
                               _type=_type)

        display_name = TestUtils.random_string(8)
        display_name_short = TestUtils.random_string(16)
        description = TestUtils.random_string(16)
        default_aggregate = aggregates.MAX
        default_resolution = 30000
        unit = units.DURATION
        is_disabled = True
        _type = 'HOST'
        metric = self.api.metric_update(name=name,
                                        display_name=display_name,
                                        display_name_short=display_name_short,
                                        description=description,
                                        default_aggregate=default_aggregate,
                                        default_resolution=default_resolution,
                                        unit=unit,
                                        is_disabled=is_disabled,
                                        _type=_type)

        self.assertEqual(name, metric.name)
        self.assertEqual(display_name, metric.display_name)
        self.assertEqual(display_name_short, metric.display_name_short)
        self.assertEqual(description, metric.description)
        self.assertEqual(default_aggregate.upper(), metric.default_aggregate)
        self.assertEqual(default_resolution, metric.default_resolution)
        self.assertEqual(unit, metric.unit)
        self.assertEqual(_type, metric.type)
        self.assertEqual(is_disabled, metric.is_disabled)

        self.api.metric_delete(name)

    def test_metric_batch_update(self):
        pass
    def test_metric_create_multiple_batch(self):
        name1 = 'TEST_CREATE_BATCH_ONE_FOOBAR' + TestUtils.random_string(6)
        name2 = 'TEST_CREATE_BATCH_TWO_FOOBAR' + TestUtils.random_string(6)
        name3 = 'TEST_CREATE_BATCH_THREE_FOOBAR' + TestUtils.random_string(6)
        name4 = 'TEST_CREATE_BATCH_FOUR_FOOBAR' + TestUtils.random_string(6)

        display_name1 = 'TEST_DISPLAY_NAME' + TestUtils.random_string(6)
        display_name2 = 'TEST_DISPLAY_NAME' + TestUtils.random_string(6)
        display_name3 = 'TEST_DISPLAY_NAME' + TestUtils.random_string(6)
        display_name4 = 'TEST_DISPLAY_NAME' + TestUtils.random_string(6)

        display_name_short1 = 'TEST_SHORT' + TestUtils.random_string(10)
        display_name_short2 = 'TEST_SHORT' + TestUtils.random_string(10)
        display_name_short3 = 'TEST_SHORT' + TestUtils.random_string(10)
        display_name_short4 = 'TEST_SHORT' + TestUtils.random_string(10)

        description1 = TestUtils.random_string(32)
        description2 = TestUtils.random_string(32)
        description3 = TestUtils.random_string(32)
        description4 = TestUtils.random_string(32)

        default_aggregate1 = aggregates.AVG
        default_aggregate2 = aggregates.MIN
        default_aggregate3 = aggregates.MAX
        default_aggregate4 = aggregates.SUM

        default_resolution1 = random.randrange(1000, 60000)
        default_resolution2 = random.randrange(1000, 60000)
        default_resolution3 = random.randrange(1000, 60000)
        default_resolution4 = random.randrange(1000, 60000)

        unit1 = units.BYTECOUNT
        unit2 = units.DURATION
        unit3 = units.NUMBER
        unit4 = units.PERCENT

        is_disabled1 = True
        is_disabled2 = False
        is_disabled3 = True
        is_disabled4 = False

        _type1 = TestUtils.random_string(6)
        _type2 = TestUtils.random_string(6)
        _type3 = TestUtils.random_string(6)
        _type4 = TestUtils.random_string(6)

        new_metrics = [
            Metric(name=name1,
                   display_name=display_name1,
                   display_name_short=display_name_short1,
                   description=description1,
                   default_aggregate=default_aggregate1,
                   default_resolution=default_resolution1,
                   unit=unit1,
                   _type=_type1,
                   is_disabled=is_disabled1),
            Metric(name=name2,
                   display_name=display_name2,
                   display_name_short=display_name_short2,
                   description=description2,
                   default_aggregate=default_aggregate2,
                   default_resolution=default_resolution2,
                   unit=unit2,
                   _type=_type2,
                   is_disabled=is_disabled2),
            Metric(name=name3,
                   display_name=display_name3,
                   display_name_short=display_name_short3,
                   description=description3,
                   default_aggregate=default_aggregate3,
                   default_resolution=default_resolution3,
                   unit=unit3,
                   _type=_type3,
                   is_disabled=is_disabled3),
            Metric(name=name4,
                   display_name=display_name4,
                   display_name_short=display_name_short4,
                   description=description4,
                   default_aggregate=default_aggregate4,
                   default_resolution=default_resolution4,
                   unit=unit4,
                   _type=_type4,
                   is_disabled=is_disabled4)
        ]

        metrics = self.api.metric_create_batch(new_metrics)

        self.assertEqual(4, len(metrics))