def test_multi_tenant(self): """マルチテナント:テナント毎にREST APIが実行できること""" service1 = util.create_service(key="service") service2 = util.create_service(key="service2") baas.User.login(service1, username="******", password="******") baas.User.login(service2, username="******", password="******") b1 = baas.ObjectBucket(service1, "bucket1") b2 = baas.ObjectBucket(service2, "bucket2") res1 = b1.insert({"key1": 12345}) assert res1["key1"] == 12345 res2 = b2.insert({"key2": 23456}) assert res2["key2"] == 23456 results1 = b1.query() assert len(results1) == 1 assert results1[0]["key1"] == 12345 results2 = b2.query() assert len(results2) == 1 assert results2[0]["key2"] == 23456 baas.User.logout(service1) baas.User.logout(service2)
def test_durability_object(self): """耐久試験:オブジェクトストレージ 検索/更新""" self.bucket = baas.ObjectBucket(self.service, "bucket1") self._import_csv() objects, count = self.bucket.query_with_count() assert count == 10000 update_id = objects[0]["_id"] end_time = time.time() + (48 * 60 * 60) counter = 0 while end_time >= time.time(): # update obj = self.bucket.update(update_id, {"updateKey": counter}) assert obj["updateKey"] == counter # query target = "ANTC-CD{:05}".format((counter % 100) * 100) where = {"CD": {"$gte": target}} objects = self.bucket.query(where=where, limit=100) assert len(objects) == 100 counter += 1 # sleep 1sec time.sleep(1) # update session token if self.service.session_token_expire - (60 * 60) < time.time(): baas.User.login(self.service, username="******", password="******")
def setup(self): self.service = util.create_service() self.master_service = util.create_service(master=True) # ensure bucket buckets = baas.Buckets(self.master_service, "object") buckets.upsert(self.TEST_BUCKET, desc="performance test", acl={}, content_acl={ "r": ["g:anonymous"], "w": ["g:anonymous"] }) self.bucket = baas.ObjectBucket(self.service, self.TEST_BUCKET) (res, total) = self.bucket.query_with_count(limit=1) if total == 10000: # ok, test data exists return elif total > 0: # re-create buckets buckets.remove(self.TEST_BUCKET) buckets.upsert(self.TEST_BUCKET, content_acl={ "r": ["g:anonymous"], "w": ["g:anonymous"] }) self.create_test_data_10000()
def test_crud(self): """追加・更新・クエリ・削除が実行できること。URLエンコードも正常に行われること""" b = baas.ObjectBucket(self.service, "bucket1") # insert res = b.insert({"key1": 12345}) assert res["key1"] == 12345 # update res = b.update(res["_id"], {"key1": "あいうえお"}, etag=res["etag"]) kana = "あいうえお" if type(res["key1"]) is str else u"あいうえお" assert res["key1"] == kana # query results = b.query(where={"key1": "あいうえお"}) assert len(results) == 1 assert results[0]["key1"] == kana # remove _id = results[0]["_id"] res = b.remove(_id) assert len(res) == 0 # remove with query res = b.remove_with_query({}) assert res["result"] == "ok" assert res["deletedObjects"] == 0
def insert_sample_data(self, count): # type: () -> baas.ObjectBucket b = baas.ObjectBucket(self.service, "bucket1") for i in range(count): b.insert({"key": i, "type": "A" if i % 2 == 1 else "B"}) return b
def test_batch(self): """正常に batch 処理ができること""" b = baas.ObjectBucket(self.service, "bucket1") # insert requests = [{ "op": "insert", "data": { "key": 1 } }, { "op": "insert", "data": { "key": 2 } }] results = b.batch(requests) assert len(results) == 2 assert results[0]["data"]["key"] == 1 assert results[1]["data"]["key"] == 2 # update/(soft)delete requests = [{ "op": "update", "_id": results[0]["_id"], "data": { "key": 11 } }, { "op": "delete", "_id": results[1]["_id"] }] results = b.batch(requests, True) assert len(results) == 2 assert results[0]["data"]["key"] == 11 assert results[1]["result"] == "ok" # update/delete requests = [{ "op": "update", "_id": results[0]["_id"], "data": { "key": 21 } }, { "op": "delete", "_id": results[1]["_id"] }] results = b.batch(requests, True) assert len(results) == 2 assert results[0]["data"]["key"] == 21 assert results[1]["result"] == "ok"
def _query_object(self, bucket_name, size, count): b = baas.ObjectBucket(self.service, bucket_name) objects, c = b.query_with_count(limit=-1, order="DATA_ID") assert c == count assert len(objects) == count for i in range(count): assert objects[i]["DATA_ID"] == i assert len(objects[i]["DATA"]) == size return objects
def _register_object(self, bucket_name, size, count): b = baas.ObjectBucket(self.service, bucket_name) test_data = self.create_test_data(size) requests = [] for i in range(count): request = { "op": "insert", "data": { "DATA_ID": i, "DATA": test_data } } requests.append(request) b.batch(requests)
def test_crud_time(self): """CRUD実行時間 (1件)""" self.bucket = baas.ObjectBucket(self.service, "bucket1") self._import_csv() # query numbers = [] for i in range(10000): numbers.append(str((i + 1) * 100)) where = {"NO": {"$in": numbers}} start_time = time.time() objects = self.bucket.query(where=where, limit=-1) elapsed_time = time.time() - start_time assert len(objects) == 100 assert elapsed_time < 0.3 print("query time: " + str(elapsed_time)) # create start_time = time.time() obj = self.bucket.insert({"key": "value"}) elapsed_time = time.time() - start_time assert obj["key"] == "value" assert elapsed_time < 0.1 print("create time: " + str(elapsed_time)) # update start_time = time.time() obj = self.bucket.update(obj["_id"], {"key2": "value2"}) elapsed_time = time.time() - start_time assert obj["key2"] == "value2" assert elapsed_time < 0.1 print("update time: " + str(elapsed_time)) # delete start_time = time.time() self.bucket.remove(obj["_id"]) elapsed_time = time.time() - start_time assert elapsed_time < 0.1 print("delete time: " + str(elapsed_time))
def test_update(self, good_etag): """正常に update できること""" b = baas.ObjectBucket(self.service, "bucket1") data = {"key": 1} data = b.insert(data) data["key"] = 100 oid = data["_id"] if good_etag is None: etag = None elif good_etag: etag = data["etag"] else: etag = "BAD_ETAG" if good_etag is None or good_etag: new_data = b.update(oid, data, etag=etag) assert new_data["key"] == 100 else: with pytest.raises(HTTPError) as ei: b.update(oid, data, etag=etag) status_code = ei.value.response.status_code assert status_code == 409
sys.path.append( os.path.abspath(os.path.dirname(os.path.abspath(__file__)) + "/../")) import necbaas as baas from config import CONFIG service = baas.Service(CONFIG) # login test res = baas.User.login(service, username="******", password="******") print("login result:", res) print() # object bucket objectBucket = baas.ObjectBucket(service, "test2") obj = objectBucket.insert({"score": 90}) print("insert:", obj) obj["score"] = 95 res = objectBucket.update(obj["_id"], obj, obj["etag"]) print("update:", res) res = objectBucket.query(where={}) print("query:", res) res = objectBucket.remove_with_query({}) print("delete:", res) print()
def get_bucket(self, expected_result): service = mock_service_json_resp(expected_result) bucket = baas.ObjectBucket(service, "bucket1") return service, bucket