def setUp(self):
        self.server = CounterServer((DEFAULT_HOST, DEFAULT_PORT),
                                    CounterRequestHandler)

        # we've to use threading here otherwise the test script will freeze
        # until we stop it using Ctrl-C.
        self.server_thread = threading.Thread(target=self.server.serve_forever)
        self.server_thread.setDaemon(True)
        self.server_thread.start()
    def setUp(self):
        self.server = CounterServer((DEFAULT_HOST, DEFAULT_PORT), CounterRequestHandler)

        # we've to use threading here otherwise the test script will freeze
        # until we stop it using Ctrl-C.
        self.server_thread = threading.Thread(target=self.server.serve_forever)
        self.server_thread.setDaemon(True)
        self.server_thread.start()
class CounterServerTest(unittest.TestCase):
    """Default test class against all commands. For better performance, use the
    nosetests -vv or nt -vv command."""
    def setUp(self):
        self.server = CounterServer((DEFAULT_HOST, DEFAULT_PORT),
                                    CounterRequestHandler)

        # we've to use threading here otherwise the test script will freeze
        # until we stop it using Ctrl-C.
        self.server_thread = threading.Thread(target=self.server.serve_forever)
        self.server_thread.setDaemon(True)
        self.server_thread.start()

    def tearDown(self):
        os.remove(DEFAULT_FILE)
        self.server.shutdown()
        self.server.server_close()

    def _create_client(self):
        """Create multiple client instances."""

        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect((DEFAULT_HOST, DEFAULT_PORT))
        return client

    def _send_request_command(self, command, *args):
        """Common code to send a request command."""

        client = self._create_client()
        client.send(command)
        result = client.recv(1024)
        client.close()
        return result

    def test_bad_request(self):
        """Test unsupported or missing command."""

        result = self._send_request_command('HELLO')
        self.assertEqual('400 Bad Request\n', result)

    def test_create_counter(self):
        """Test CREATE_COUNTER command."""

        result = self._send_request_command('CREATE_COUNTER foobar')
        self.assertEqual('200 Ok\n', result)

    def test_create_counter_without_label(self):
        """Test CREATE_COUNTER command without label."""

        result = self._send_request_command('CREATE_COUNTER')
        self.assertEqual('401 Bad Request: Missing label\n', result)

    def test_create_duplicate_counter(self):
        """Test CREATE_COUNTER command with duplicate label."""

        self.test_create_counter()
        result = self._send_request_command('CREATE_COUNTER foobar')
        self.assertEqual('402 Bad Request: Duplicate label\n', result)

    def test_increment_counter_missing_label(self):
        """Test INCREMENT_COUNTER command with missing label."""

        result = self._send_request_command('INCREMENT_COUNTER')
        self.assertEqual('401 Bad Request: Missing label\n', result)

    def test_increment_counter_unknown_label(self):
        """Test INCREMENT_COUNTER command with unknown label."""

        result = self._send_request_command('INCREMENT_COUNTER barfoo')
        self.assertEqual('403 Bad Request: Label not found\n', result)

    def test_increment_counter_and_counter_values(self):
        """Test INCREMENT_COUNTER and GET_COUNTER_VALUES commands."""

        result = self._send_request_command('CREATE_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        result = self._send_request_command('INCREMENT_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        result = self._send_request_command('GET_COUNTER_VALUES nose')
        self.assertEqual('200 Ok 1\n', result)

    def test_increment_counter_multiple_times_within_minute(self):
        """Test INCREMENT_COUNTER commands multiple times within minute."""

        result = self._send_request_command('CREATE_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        max = 5
        for i in range(0, max):
            result = self._send_request_command('INCREMENT_COUNTER nose')
            self.assertEqual('200 Ok\n', result)

        result = self._send_request_command('GET_COUNTER_VALUES nose')
        self.assertEqual('200 Ok %d\n' % max, result)

    def test_get_counter_values_within_date_range(self):
        """Test GET_COUNTER_VALUES within date range."""

        result = self._send_request_command('CREATE_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        start_dt = datetime.datetime.now().replace(
            second=0).strftime('%Y-%m-%d/%H:%M:%S')
        max = 2
        for i in range(0, max):
            time.sleep(i * 60)
            result = self._send_request_command('INCREMENT_COUNTER nose')
            self.assertEqual('200 Ok\n', result)

        end_dt = datetime.datetime.now().replace(
            second=0).strftime('%Y-%m-%d/%H:%M:%S')

        result = self._send_request_command('GET_COUNTER_VALUES nose %s %s' %
                                            (start_dt, end_dt))
        self.assertEqual('200 Ok 1 1\n', result)

    def test_increment_counter_within_multiple_minutes(self):
        """Test INCREMENT_COUNTER commands within multiple minutes."""

        self.test_increment_counter_multiple_times_within_minute()

        # counter's value resets every minute.
        time.sleep(60)

        result = self._send_request_command('INCREMENT_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        store = shelve.open(DEFAULT_FILE)
        self.assertEqual(2, len(store['nose']))

    def test_average_counter_value(self):
        """Test AVERAGE_COUNTER_VALUE command."""

        self.test_increment_counter_within_multiple_minutes()
        result = self._send_request_command('AVERAGE_COUNTER_VALUE nose')
        self.assertEqual('200 Ok 3\n', result)

    def test_average_counter_value_within_date_range(self):
        """Test AVERAGE_COUNTER_VALUE within date range."""

        result = self._send_request_command('CREATE_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        start_dt = datetime.datetime.now().replace(
            second=0).strftime('%Y-%m-%d/%H:%M:%S')
        max = 2
        for i in range(0, max):
            time.sleep(i * 60)
            result = self._send_request_command('INCREMENT_COUNTER nose')
            self.assertEqual('200 Ok\n', result)

        end_dt = datetime.datetime.now().replace(
            second=0).strftime('%Y-%m-%d/%H:%M:%S')

        result = self._send_request_command(
            'AVERAGE_COUNTER_VALUE nose %s %s' % (start_dt, end_dt))
        self.assertEqual('200 Ok 1\n', result)

    def test_average_counter_value_missing_label(self):
        """Test AVERAGE_COUNTER_VALUE command with missing label."""

        result = self._send_request_command('AVERAGE_COUNTER_VALUE')
        self.assertEqual('401 Bad Request: Missing label\n', result)

    def test_average_counter_value_unknown_label(self):
        """Test AVERAGE_COUNTER_VALUE command with unknown label."""

        result = self._send_request_command('AVERAGE_COUNTER_VALUE barfoo')
        self.assertEqual('403 Bad Request: Label not found\n', result)
class CounterServerTest(unittest.TestCase):
    """Default test class against all commands. For better performance, use the
    nosetests -vv or nt -vv command."""

    def setUp(self):
        self.server = CounterServer((DEFAULT_HOST, DEFAULT_PORT), CounterRequestHandler)

        # we've to use threading here otherwise the test script will freeze
        # until we stop it using Ctrl-C.
        self.server_thread = threading.Thread(target=self.server.serve_forever)
        self.server_thread.setDaemon(True)
        self.server_thread.start()

    def tearDown(self):
        os.remove(DEFAULT_FILE)
        self.server.shutdown()
        self.server.server_close()

    def _create_client(self):
        """Create multiple client instances."""

        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect((DEFAULT_HOST, DEFAULT_PORT))
        return client

    def _send_request_command(self, command, *args):
        """Common code to send a request command."""

        client = self._create_client()
        client.send(command)
        result = client.recv(1024)
        client.close()
        return result

    def test_bad_request(self):
        """Test unsupported or missing command."""

        result = self._send_request_command('HELLO')
        self.assertEqual('400 Bad Request\n', result)

    def test_create_counter(self):
        """Test CREATE_COUNTER command."""

        result = self._send_request_command('CREATE_COUNTER foobar')
        self.assertEqual('200 Ok\n', result)

    def test_create_counter_without_label(self):
        """Test CREATE_COUNTER command without label."""

        result = self._send_request_command('CREATE_COUNTER')
        self.assertEqual('401 Bad Request: Missing label\n', result)

    def test_create_duplicate_counter(self):
        """Test CREATE_COUNTER command with duplicate label."""

        self.test_create_counter()
        result = self._send_request_command('CREATE_COUNTER foobar')
        self.assertEqual('402 Bad Request: Duplicate label\n', result)

    def test_increment_counter_missing_label(self):
        """Test INCREMENT_COUNTER command with missing label."""

        result = self._send_request_command('INCREMENT_COUNTER')
        self.assertEqual('401 Bad Request: Missing label\n', result)

    def test_increment_counter_unknown_label(self):
        """Test INCREMENT_COUNTER command with unknown label."""

        result = self._send_request_command('INCREMENT_COUNTER barfoo')
        self.assertEqual('403 Bad Request: Label not found\n', result)

    def test_increment_counter_and_counter_values(self):
        """Test INCREMENT_COUNTER and GET_COUNTER_VALUES commands."""

        result = self._send_request_command('CREATE_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        result = self._send_request_command('INCREMENT_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        result = self._send_request_command('GET_COUNTER_VALUES nose')
        self.assertEqual('200 Ok 1\n', result)

    def test_increment_counter_multiple_times_within_minute(self):
        """Test INCREMENT_COUNTER commands multiple times within minute."""

        result = self._send_request_command('CREATE_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        max = 5
        for i in range(0, max):
            result = self._send_request_command('INCREMENT_COUNTER nose')
            self.assertEqual('200 Ok\n', result)

        result = self._send_request_command('GET_COUNTER_VALUES nose')
        self.assertEqual('200 Ok %d\n' % max, result)

    def test_get_counter_values_within_date_range(self):
        """Test GET_COUNTER_VALUES within date range."""

        result = self._send_request_command('CREATE_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        start_dt = datetime.datetime.now().replace(second=0).strftime('%Y-%m-%d/%H:%M:%S')
        max = 2
        for i in range(0, max):
            time.sleep(i * 60)
            result = self._send_request_command('INCREMENT_COUNTER nose')
            self.assertEqual('200 Ok\n', result)

        end_dt = datetime.datetime.now().replace(second=0).strftime('%Y-%m-%d/%H:%M:%S')

        result = self._send_request_command('GET_COUNTER_VALUES nose %s %s' % (start_dt, end_dt))
        self.assertEqual('200 Ok 1 1\n', result)

    def test_increment_counter_within_multiple_minutes(self):
        """Test INCREMENT_COUNTER commands within multiple minutes."""

        self.test_increment_counter_multiple_times_within_minute()

        # counter's value resets every minute.
        time.sleep(60)

        result = self._send_request_command('INCREMENT_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        store = shelve.open(DEFAULT_FILE)
        self.assertEqual(2, len(store['nose']))

    def test_average_counter_value(self):
        """Test AVERAGE_COUNTER_VALUE command."""

        self.test_increment_counter_within_multiple_minutes()
        result = self._send_request_command('AVERAGE_COUNTER_VALUE nose')
        self.assertEqual('200 Ok 3\n', result)

    def test_average_counter_value_within_date_range(self):
        """Test AVERAGE_COUNTER_VALUE within date range."""

        result = self._send_request_command('CREATE_COUNTER nose')
        self.assertEqual('200 Ok\n', result)

        start_dt = datetime.datetime.now().replace(second=0).strftime('%Y-%m-%d/%H:%M:%S')
        max = 2
        for i in range(0, max):
            time.sleep(i * 60)
            result = self._send_request_command('INCREMENT_COUNTER nose')
            self.assertEqual('200 Ok\n', result)

        end_dt = datetime.datetime.now().replace(second=0).strftime('%Y-%m-%d/%H:%M:%S')

        result = self._send_request_command('AVERAGE_COUNTER_VALUE nose %s %s' % (start_dt, end_dt))
        self.assertEqual('200 Ok 1\n', result)

    def test_average_counter_value_missing_label(self):
        """Test AVERAGE_COUNTER_VALUE command with missing label."""

        result = self._send_request_command('AVERAGE_COUNTER_VALUE')
        self.assertEqual('401 Bad Request: Missing label\n', result)

    def test_average_counter_value_unknown_label(self):
        """Test AVERAGE_COUNTER_VALUE command with unknown label."""

        result = self._send_request_command('AVERAGE_COUNTER_VALUE barfoo')
        self.assertEqual('403 Bad Request: Label not found\n', result)