def test_expiry_after_append(self):
        # create a doc and set expiry for the doc
        # append to the doc and check if the expiry is not changed

        self.key = "expiry_after_append"
        array = {
            "name": "Douglas Reynholm",
            "place": "India",
        }
        jsonDump = json.dumps(array)
        self.client.set(self.key, 60, 0, jsonDump)
        client1 = VBucketAwareMemcached(RestConnection(self.master), 'default')
        get_meta_resp_before = client1.generic_request(client1.memcached(self.key).getMeta, self.key)
        self.log.info("Sleeping for 5 sec")
        time.sleep(5)
        client1.generic_request(client1.memcached(self.key).append, self.key, 'appended data')
        get_meta_resp_after = client1.generic_request(client1.memcached(self.key).getMeta, self.key)
        self.assertEquals(get_meta_resp_before[2], get_meta_resp_after[2]) # 3rd value is expiry value
    def test_CASnotzero(self):
        # MB-31149
        # observe.observeseqnotests.ObserveSeqNoTests.test_CASnotzero
        # set value, append and check CAS value
        self.log.info('Starting test_CASnotzero')

        # without hello(mutationseqencenumber)
        client = VBucketAwareMemcached(RestConnection(self.master), 'default')
        KEY_NAME = "test1key"
        client.set(KEY_NAME, 0, 0, json.dumps({'value': 'value2'}))
        client.generic_request(
            client.memcached(KEY_NAME).append, 'test1key', 'appended data')
        get_meta_resp = client.generic_request(
            client.memcached(KEY_NAME).getMeta, 'test1key')
        self.log.info(
            'the CAS value without hello(mutationseqencenumber): {} '.format(
                get_meta_resp[4]))
        self.assertNotEqual(get_meta_resp[4], 0)

        # with hello(mutationseqencenumber)
        KEY_NAME = "test2key"
        client.set(KEY_NAME, 0, 0, json.dumps({'value': 'value1'}))
        h = client.sendHellos(
            memcacheConstants.PROTOCOL_BINARY_FEATURE_MUTATION_SEQNO)
        client.generic_request(
            client.memcached(KEY_NAME).append, 'test2key', 'appended data456')

        get_meta_resp = client.generic_request(
            client.memcached(KEY_NAME).getMeta, 'test2key')
        self.log.info(
            'the CAS value with hello(mutationseqencenumber): {} '.format(
                get_meta_resp[4]))
        self.assertNotEqual(get_meta_resp[4], 0)
    def test_new_response_fields(self):

        self.log.info('\n\nStarting test_new_response_fields')

        client = VBucketAwareMemcached(RestConnection(self.master), 'default')

        h = client.sendHellos(
            memcacheConstants.PROTOCOL_BINARY_FEATURE_MUTATION_SEQNO)

        set_resp = self.extract_vbucket_uuid_and_seqno(
            client.set('test1key', 0, 0, '123456789'))

        # test the inplace operations
        test = client.generic_request(
            client.memcached('test1key').set, 'test1key', 0, 0,
            'totally new value')
        replace_resp = self.extract_vbucket_uuid_and_seqno(
            client.generic_request(
                client.memcached('test1key').replace, 'test1key', 0, 0,
                'totally new value'))
        self.verify_vbucket_and_seqno(set_resp, replace_resp, 'replace')

        append_resp = self.extract_vbucket_uuid_and_seqno(
            client.generic_request(
                client.memcached('test1key').append, 'test1key',
                'appended data'))
        self.verify_vbucket_and_seqno(replace_resp, append_resp, 'append')

        prepend_resp = self.extract_vbucket_uuid_and_seqno(
            client.generic_request(
                client.memcached('test1key').prepend, 'test1key',
                'prepended data'))
        self.verify_vbucket_and_seqno(append_resp, prepend_resp, 'prepend')

        # and finally do the delete
        delete_resp = self.extract_vbucket_uuid_and_seqno(
            client.generic_request(
                client.memcached('test1key').delete, 'test1key'))
        self.verify_vbucket_and_seqno(set_resp, delete_resp, 'delete')

        #meta commands under construction
        # test the 'meta' commands
        TEST_SEQNO = 123
        TEST_CAS = 456

        set_with_meta_resp = client.generic_request(
            client.memcached('test1keyformeta').set_with_meta,
            'test1keyformeta', 0, 0, TEST_SEQNO, TEST_CAS, '123456789')
        set_meta_vbucket_uuid, set_meta_seqno = struct.unpack(
            '>QQ', set_with_meta_resp[2])
        set_with_meta_dict = {
            'vbucket_uuid': set_meta_vbucket_uuid,
            'seqno': set_meta_seqno
        }

        get_meta_resp = client.generic_request(
            client.memcached('test1keyformeta').getMeta, 'test1keyformeta')
        self.assertTrue(TEST_SEQNO == get_meta_resp[3], \
               msg='get meta seqno does not match as set. Expected {0}, actual {1}'.format(TEST_SEQNO, get_meta_resp[3]) )
        self.assertTrue(TEST_CAS == get_meta_resp[4], \
               msg='get meta cas does not match as set. Expected {0}, actual {1}'.format(TEST_CAS, get_meta_resp[4]) )

        #   def del_with_meta(self, key, exp, flags, seqno, old_cas, new_cas, vbucket= -1):
        del_with_meta_resp = client.generic_request(
            client.memcached('test1keyformeta').del_with_meta,
            'test1keyformeta', 0, 0, TEST_SEQNO, TEST_CAS, TEST_CAS + 1)
        vbucket_uuid, seqno = struct.unpack('>QQ', del_with_meta_resp[2])
        del_with_meta_dict = {'vbucket_uuid': vbucket_uuid, 'seqno': seqno}

        self.verify_vbucket_and_seqno(set_with_meta_dict, del_with_meta_dict,
                                      'set/del with meta')

        #  do some integer operations
        set_resp = self.extract_vbucket_uuid_and_seqno(
            client.set('key-for-integer-value', 0, 0, '123'))
        incr_resp = client.generic_request(
            client.memcached('key-for-integer-value').incr,
            'key-for-integer-value')
        incr_resp_dict = {'vbucket_uuid': incr_resp[2], 'seqno': incr_resp[3]}
        self.verify_vbucket_and_seqno(set_resp, incr_resp_dict, 'incr')

        decr_resp = client.generic_request(
            client.memcached('key-for-integer-value').decr,
            'key-for-integer-value')
        decr_resp_dict = {'vbucket_uuid': decr_resp[2], 'seqno': decr_resp[3]}
        self.verify_vbucket_and_seqno(incr_resp_dict, decr_resp_dict, 'decr')

        add_resp = self.extract_vbucket_uuid_and_seqno(
            client.generic_request(
                client.memcached('totally new key').add, 'totally new key', 0,
                0, 'totally new value'))

        self.assertTrue(add_resp['vbucket_uuid'] > 0,
                        msg='Add request vbucket uuid is zero')

        self.log.info('\n\nComplete test_new_response_fields\n\n')
    def test_appendprepend(self):
        # MB-32078, Append with CAS=0 can return ENGINE_KEY_EEXISTS
        # observe.observeseqnotests.ObserveSeqNoTests.test_appendprepend
        self.log.info('Starting test_appendprepend')
        TEST_SEQNO = 123
        TEST_CAS = 456
        KEY_NAME = 'test_appendprepend'

        client = VBucketAwareMemcached(RestConnection(self.master), 'default')
        # create a value with CAS
        client.generic_request(
            client.memcached(KEY_NAME).set_with_meta, KEY_NAME, 0, 0,
            TEST_SEQNO, TEST_CAS, '123456789')
        get_resp = client.generic_request(
            client.memcached(KEY_NAME).get, KEY_NAME)
        self.assertEqual(get_resp[2], '123456789')

        # check if the changing the value fails
        try:
            client.generic_request(
                client.memcached(KEY_NAME).set_with_meta, KEY_NAME, 0, 0, 0, 0,
                'value')
            self.fail('Expected to fail but passed')
        except MemcachedError as exp:
            self.assertEqual(int(exp.status), 2)

        # check if append works fine
        client.generic_request(
            client.memcached(KEY_NAME).append, KEY_NAME, 'appended data')
        get_resp = client.generic_request(
            client.memcached(KEY_NAME).get, KEY_NAME)
        self.assertEqual(get_resp[2], '123456789appended data')

        # check if prepend works fine and verify the data
        client.generic_request(
            client.memcached(KEY_NAME).prepend, KEY_NAME, 'prepended data')
        get_resp = client.generic_request(
            client.memcached(KEY_NAME).get, KEY_NAME)
        self.assertEqual(get_resp[2], 'prepended data123456789appended data')
Esempio n. 5
0
    def test_new_response_fields(self):

        self.log.info('\n\nStarting test_new_response_fields')

        client = VBucketAwareMemcached(RestConnection(self.master), 'default')


        h = client.sendHellos( memcacheConstants.PROTOCOL_BINARY_FEATURE_MUTATION_SEQNO );



        set_resp = self.extract_vbucket_uuid_and_seqno( client.set('test1key', 0, 0, '123456789') )

        # test the inplace operations
        test = client.generic_request(client.memcached('test1key').set, 'test1key', 0, 0,'totally new value')
        replace_resp = self.extract_vbucket_uuid_and_seqno(
            client.generic_request( client.memcached('test1key').replace,  'test1key', 0, 0,'totally new value') )
        self.verify_vbucket_and_seqno( set_resp, replace_resp, 'replace')

        append_resp = self.extract_vbucket_uuid_and_seqno(
            client.generic_request( client.memcached('test1key').append, 'test1key', 'appended data') )
        self.verify_vbucket_and_seqno(replace_resp, append_resp, 'append')

        prepend_resp = self.extract_vbucket_uuid_and_seqno(
            client.generic_request( client.memcached('test1key').prepend, 'test1key', 'prepended data') )
        self.verify_vbucket_and_seqno(append_resp, prepend_resp, 'prepend')


        # and finally do the delete
        delete_resp = self.extract_vbucket_uuid_and_seqno(
            client.generic_request( client.memcached('test1key').delete,'test1key') )
        self.verify_vbucket_and_seqno( set_resp, delete_resp, 'delete')


        #meta commands under construction
        # test the 'meta' commands
        TEST_SEQNO = 123
        TEST_CAS = 456

        set_with_meta_resp = client.generic_request(
            client.memcached('test1keyformeta').set_with_meta, 'test1keyformeta', 0, 0, TEST_SEQNO, TEST_CAS, '123456789')
        set_meta_vbucket_uuid, set_meta_seqno = struct.unpack('>QQ', set_with_meta_resp[2])
        set_with_meta_dict = {'vbucket_uuid':set_meta_vbucket_uuid, 'seqno': set_meta_seqno}



        get_meta_resp = client.generic_request(client.memcached( 'test1keyformeta').getMeta, 'test1keyformeta')
        self.assertTrue(TEST_SEQNO == get_meta_resp[3], \
               msg='get meta seqno does not match as set. Expected {0}, actual {1}'.format(TEST_SEQNO,get_meta_resp[3]) )
        self.assertTrue(TEST_CAS == get_meta_resp[4], \
               msg='get meta cas does not match as set. Expected {0}, actual {1}'.format(TEST_CAS,get_meta_resp[4]) )


        #   def del_with_meta(self, key, exp, flags, seqno, old_cas, new_cas, vbucket= -1):
        del_with_meta_resp = client.generic_request(
            client.memcached('test1keyformeta').del_with_meta,'test1keyformeta', 0, 0, TEST_SEQNO, TEST_CAS, TEST_CAS+1)
        vbucket_uuid, seqno = struct.unpack('>QQ', del_with_meta_resp[2])
        del_with_meta_dict = {'vbucket_uuid':vbucket_uuid, 'seqno': seqno}

        self.verify_vbucket_and_seqno( set_with_meta_dict, del_with_meta_dict, 'set/del with meta')





        #  do some integer operations
        set_resp = self.extract_vbucket_uuid_and_seqno( client.set('key-for-integer-value', 0, 0, '123') )
        incr_resp = client.generic_request(client.memcached('key-for-integer-value').incr, 'key-for-integer-value')
        incr_resp_dict = {'vbucket_uuid':incr_resp[2], 'seqno':incr_resp[3]}
        self.verify_vbucket_and_seqno(set_resp, incr_resp_dict, 'incr')


        decr_resp = client.generic_request(client.memcached('key-for-integer-value').decr,'key-for-integer-value')
        decr_resp_dict = {'vbucket_uuid':decr_resp[2], 'seqno':decr_resp[3]}
        self.verify_vbucket_and_seqno(incr_resp_dict, decr_resp_dict, 'decr')


        add_resp = self.extract_vbucket_uuid_and_seqno(
            client.generic_request( client.memcached('totally new key').add, 'totally new key', 0, 0,'totally new value') )

        self.assertTrue( add_resp['vbucket_uuid'] > 0, msg='Add request vbucket uuid is zero')

        self.log.info('\n\nComplete test_new_response_fields\n\n')