/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

var Ember = require('ember');
var App = require('app');

require('utils/helper');
require('mappers/server_data_mapper');
require('mappers/service_metrics_mapper');

describe('App.serviceMetricsMapper', function () {

  describe('#hbaseMapper', function() {

    it ('Round Average Load', function() {
      var tests = [
        {
          components: [
            {
                ServiceComponentInfo: {
                  AverageLoad: 1.23456789,
                  component_name: "HBASE_MASTER",
                  RegionsInTransition : [ ]
                }
              }
          ],
          e: '1.23'
        },
        {
          components: [
            {
                ServiceComponentInfo: {
                  AverageLoad: 1.00,
                  component_name: "HBASE_MASTER",
                  RegionsInTransition : [ ]
                }
              }
          ],
          e: '1.00'
        },
        {
          components: [
            {
                ServiceComponentInfo: {
                  AverageLoad: 1,
                  component_name: "HBASE_MASTER",
                  RegionsInTransition : [ ]
                }
              }
          ],
          e: '1.00'
        },
        {
          components: [
            {
                ServiceComponentInfo: {
                  AverageLoad: 1.2,
                  component_name: "HBASE_MASTER",
                  RegionsInTransition : [ ]
                }
              }
          ],
          e: '1.20'
        }
      ];
      tests.forEach(function(test) {
        var result = App.serviceMetricsMapper.hbaseMapper(test);
        expect(result.average_load).to.equal(test.e);
      });
    });
  });

  describe('#stormMapper', function() {
    var tests = [
      {
        stackVersionNumber: '2.2',
        message: 'Storm mapper, stack version 2.2',
        expectedValues: {
          total_executors: 28,
          nimbus_uptime: "15m 1s",
          free_slots: 0,
          used_slots: 2,
          total_slots: 2,
          total_tasks: 28,
          topologies: 1
        },
        components: [
          {
            "ServiceComponentInfo" : {
              "component_name" : "STORM_UI_SERVER",
              "service_name" : "STORM"
            },
            "metrics" : {
              "api" : {
                "v1": {
                  "cluster": {
                    "summary": {
                      "executorsTotal": 28.0,
                      "nimbusUptime": "15m 1s",
                      "slotsFree": 0.0,
                      "slotsTotal": 2.0,
                      "slotsUsed": 2.0,
                      "supervisors": 1.0,
                      "tasksTotal": 28.0
                    }
                  },
                  "topology": {
                    "summary": [
                      {
                        "executorsTotal": 21.0,
                        "uptime": "5m 59s",
                        "schedulerInfo": null,
                        "name": "WordCountida8c06640_date2901141",
                        "workersTotal": 2.0,
                        "status": "ACTIVE",
                        "owner": "",
                        "tasksTotal": 21.0,
                        "id": "WordCountida8c06640_date2901141-2-1412195707"
                      }
                    ]
                  }
                }
              }
            }
          }
        ]
      },
      {
        stackVersionNumber: '2.1',
        message: 'Storm mapper, stack version 2.1',
        expectedValues: {
          total_executors: 2,
          nimbus_uptime: "3.96 hours",
          free_slots: 2,
          used_slots: 0,
          total_slots: 2,
          total_tasks: 21,
          topologies: 0
        },
        components: [
          {
            "ServiceComponentInfo" : {
              "component_name" : "STORM_REST_API",
              "service_name" : "STORM"
            },
            "metrics" : {
              "api" : {
                "cluster" : {
                  "summary" : {
                    "executors.total" : 2.0,
                    "nimbus.uptime" : 14250.0,
                    "slots.free" : 2.0,
                    "slots.total" : 2.0,
                    "slots.used" : 0.0,
                    "supervisors" : 1.0,
                    "tasks.total" : 21.0,
                    "topologies" : 0.0
                  }
                }
              }
            }
          }
        ]
      }
    ];

    tests.forEach(function(test) {
      it(test.message, function() {
        sinon.stub(App, 'get', function(key) {
          if (key == 'currentStackVersionNumber') {
            return test.stackVersionNumber;
          }
        });
        var result = App.serviceMetricsMapper.stormMapper(test);
        expect(result).to.include(test.expectedValues);
        App.get.restore();
      });
    });

  });
});
