You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ko...@apache.org on 2014/08/27 16:14:19 UTC
[5/5] git commit: [OLINGO-413] move more testcases to tests-tmp
[OLINGO-413] move more testcases to tests-tmp
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/commit/a044327c
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/tree/a044327c
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/diff/a044327c
Branch: refs/heads/master
Commit: a044327c24594e5ea15823e9b7bad667f15c5508
Parents: a69b061
Author: Sven Kobler <sv...@sap.com>
Authored: Wed Aug 27 16:12:53 2014 +0200
Committer: Sven Kobler <sv...@sap.com>
Committed: Wed Aug 27 16:14:00 2014 +0200
----------------------------------------------------------------------
datajs/src/lib/cache.js | 8 +-
datajs/tests-tmp/b-cache-tests.js | 1191 ++++++++++++++++++
...cache-large-collection-functional-tests.html | 53 +
...s-cache-large-collection-functional-tests.js | 187 +++
datajs/tests-tmp/bn-odata-json-tests.js | 211 ++++
datajs/tests-tmp/common/ODataVerifiyReader.svc | 114 ++
datajs/tests-tmp/common/cacheVerifier.js | 241 ----
datajs/tests-tmp/common/djstest.js | 4 +-
datajs/tests-tmp/common/logging.js | 5 +
datajs/tests-tmp/common/odataCacheVerifier.js | 241 ++++
datajs/tests-tmp/common/odataVerifyReader.js | 203 +++
...cache-large-collection-functional-tests.html | 53 -
...s-cache-large-collection-functional-tests.js | 187 ---
datajs/tests-tmp/done.txt | 8 +-
.../endpoints/BasicAuthDataService.svc | 124 ++
.../tests-tmp/endpoints/CustomAnnotations.xml | 121 ++
.../tests-tmp/endpoints/CustomDataService.svc | 85 ++
datajs/tests-tmp/endpoints/EpmDataService.svc | 336 +++++
datajs/tests-tmp/endpoints/ErrorDataService.svc | 78 ++
.../endpoints/FoodStoreDataServiceV4.svc | 590 +++++++++
.../endpoints/LargeCollectionService.svc | 113 ++
datajs/tests-tmp/endpoints/web.config | 46 +
.../tests-tmp/odata-json-tests-todo-analyse.js | 4 +-
datajs/tests-tmp/odata-json-tests.js | 211 ----
datajs/tests-tmp/odata-qunit-tests-launcher.htm | 20 +-
25 files changed, 3726 insertions(+), 708 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/a044327c/datajs/src/lib/cache.js
----------------------------------------------------------------------
diff --git a/datajs/src/lib/cache.js b/datajs/src/lib/cache.js
index 56eb5f1..dd872aa 100644
--- a/datajs/src/lib/cache.js
+++ b/datajs/src/lib/cache.js
@@ -599,13 +599,13 @@ function DataCache(options) {
throw cacheFailure;
}
- return window.Rx.Observable.CreateWithDisposable(function (obs) {
+ return new window.Rx.Observable(function (obs) {
var disposed = false;
var index = 0;
var errorCallback = function (error) {
if (!disposed) {
- obs.OnError(error);
+ obs.onError(error);
}
};
@@ -615,11 +615,11 @@ function DataCache(options) {
for (i = 0, len = data.value.length; i < len; i++) {
// The wrapper automatically checks for Dispose
// on the observer, so we don't need to check it here.
- obs.OnNext(data.value[i]);
+ obs.onNext(data.value[i]);
}
if (data.value.length < pageSize) {
- obs.OnCompleted();
+ obs.onCompleted();
} else {
index += pageSize;
that.readRange(index, pageSize).then(successCallback, errorCallback);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/a044327c/datajs/tests-tmp/b-cache-tests.js
----------------------------------------------------------------------
diff --git a/datajs/tests-tmp/b-cache-tests.js b/datajs/tests-tmp/b-cache-tests.js
new file mode 100644
index 0000000..5b41123
--- /dev/null
+++ b/datajs/tests-tmp/b-cache-tests.js
@@ -0,0 +1,1191 @@
+/*
+ * 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.
+*/
+
+(function (window, undefined) {
+
+ module("cache-tests.js");
+ var foodsFeed = "./endpoints/FoodStoreDataServiceV4.svc/Foods";
+ var collectionSize = 16;
+
+ var thenFailTest = function (err) {
+ if (err && err.message) {
+ djstest.fail(err.message);
+ } else {
+ djstest.fail("unexepected promise failure");
+ }
+
+ djstest.done();
+ };
+
+ djstest.addTest(function dataCacheCountTest() {
+ var cache = odatajs.cache.createDataCache({ name: "cache", source: foodsFeed });
+ cache.count().then(function (count) {
+ djstest.assertAreEqual(count, collectionSize, "expected count for Foods");
+ djstest.destroyCacheAndDone(cache);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheCountOnLocalTest() {
+ var cache = odatajs.cache.createDataCache({ name: "cache", source: foodsFeed, pageSize: collectionSize + 10, mechanism: "memory" });
+ cache.readRange(0, collectionSize + 10).then(function (data) {
+ var expectedCount = data.value ? data.value.length : 0;
+ cache.count().then(function (count) {
+ djstest.assertAreEqual(count, expectedCount, "expected count for expectedCount");
+ djstest.destroyCacheAndDone(cache);
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheCountAbortTest() {
+ // Abort before completion.
+ var cache = odatajs.cache.createDataCache({ name: "cache", source: foodsFeed });
+ var item = cache.count().then(thenFailTest, function (err) {
+ djstest.assertAreEqual(true, err.canceled, "err.aborted is true");
+ djstest.destroyCacheAndDone(cache);
+ }).cancel();
+ });
+
+ var createNewCache = function (options) {
+
+ var thenSuccess = null;
+
+ var resolved = false;
+ var rejected = false;
+
+ var args = null;
+
+ this.then = function (success) {
+ if (resolved) {
+ success.apply(null, args);
+ } else if (!rejected) {
+ thenSuccess = success;
+ }
+ };
+
+ var resolve = function (/*args*/) {
+ resolved = true;
+ args = arguments;
+ if (thenSuccess) {
+ thenSuccess.apply(null, arguments);
+ }
+ };
+
+ var cache = odatajs.cache.createDataCache(options);
+ cache.clear().then(function () {
+ var newCache = odatajs.cache.createDataCache(options);
+ resolve(newCache);
+ }, function (err) {
+ rejected = true;
+ thenFailTest(err);
+ });
+
+ return this;
+ };
+
+ djstest.addTest(function dataCacheReadRangeSingleTest() {
+ // Read a new range.
+ var options = { name: "cache", source: foodsFeed, pageSize: 2 };
+ createNewCache(options).
+ then(function (cache) {
+ cache.readRange(0, 1).
+ then(function (data) {
+ djstest.assertAreEqual(data.value.length, 1, "single item was read.");
+ djstest.assertAreEqual(data.value[0].FoodID, 0, "food id is 0.");
+ djstest.done();
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheReadRangeExactPageTest() {
+ // Read exactly one page.
+ var options = { name: "cache", source: foodsFeed, pageSize: 2 };
+ createNewCache(options).
+ then(function (cache) {
+ cache.readRange(0, 2).
+ then(function (data) {
+ djstest.assertAreEqual(data.value.length, 2, "single item was read.");
+ djstest.assertAreEqual(data.value[0].FoodID, 0, "first food id is 0.");
+ djstest.assertAreEqual(data.value[1].FoodID, 1, "second food id is 1.");
+ djstest.done();
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheReadRangeMultiplePageTest() {
+ // Read multiple pages.
+ var options = { name: "cache", source: foodsFeed, pageSize: 2 };
+ createNewCache(options).
+ then(function (cache) {
+ cache.readRange(0, 3).
+ then(function (data) {
+ djstest.assertAreEqual(data.value.length, 3, "single item was read.");
+ djstest.assertAreEqual(data.value[0].FoodID, 0, "first food id is 0.");
+ djstest.assertAreEqual(data.value[1].FoodID, 1, "second food id is 1.");
+ djstest.assertAreEqual(data.value[2].FoodID, 2, "third food id is 2.");
+ djstest.done();
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheReadRangeSyncDelaysTest() {
+ var options = { name: "cache", source: foodsFeed, pageSize: 2 };
+ var counter = 0;
+ createNewCache(options).
+ then(function (cache) {
+ cache.readRange(0, 1).
+ then(function (data) {
+ djstest.assertAreEqual(counter, 0, "counter is zero for first set of results");
+ djstest.assertAreEqual(cache.stats.netReads, 1, "one request made to fulfill the readRange");
+ counter++;
+ cache.readRange(0, 1).
+ then(function (data) {
+ djstest.assertAreEqual(counter, 2, "counter is two because even sync results are delayed)");
+ djstest.assertAreEqual(cache.stats.netReads, 1, "no additional requests since requested data is in cache");
+ djstest.done();
+ }, thenFailTest);
+ djstest.assertAreEqual(counter, 1, "counter is one because readRange hasn't run (even if results are cached)");
+ counter++;
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheReadRangesWithDestroyTest() {
+ var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: 0 };
+ var counter = 0;
+ createNewCache(options).then(function (cache) {
+ cache.readRange(0, 1).then(function (data) {
+ djstest.assertAreEqual(cache.stats.netReads, 1, "one request made to fulfill the readRange");
+ cache.clear().then(function () {
+ djstest.assertAreEqual(cache.stats.netReads, 0, "stats cleared in destroy");
+ cache.readRange(0, 1).then(function (data) {
+ djstest.assertAreEqual(cache.stats.netReads, 1, "request made after destroy to fulfill the readRange");
+ djstest.done();
+ }, thenFailTest);
+ }, thenFailTest);
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheReadSimultaneousTest() {
+ var options = { name: "cache", source: foodsFeed, pageSize: 2 };
+ var counter = 0;
+ var theCache;
+ var checkDataAndCount = function (data) {
+ djstest.assertAreEqual(data.value.length, 1, "Single item returned");
+ djstest.assertAreEqual(data.value[0].FoodID, 0, "FoodId is set to zero for first item");
+ djstest.assertAreEqual(theCache.stats.netReads, 1, "single theCache.stats.netReads");
+ djstest.assert(theCache.stats.prefetches <= 1, "theCache.stats.prefetches <= 1 - no repetitions");
+ counter++;
+ if (counter === 3) {
+ djstest.done();
+ }
+ };
+
+ createNewCache(options).
+ then(function (cache) {
+ theCache = cache;
+ cache.readRange(0, 1).then(checkDataAndCount, thenFailTest);
+ cache.readRange(0, 1).then(checkDataAndCount, thenFailTest);
+ cache.readRange(0, 1).then(checkDataAndCount, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheMultipleClearTest() {
+ var options = { name: "cache", source: foodsFeed, pageSize: 2 };
+ var counter = 0;
+ var checkCount = function (data) {
+ djstest.assert(true, "clear then was called");
+ counter++;
+ if (counter === 3) {
+ djstest.done();
+ }
+ };
+
+ createNewCache(options).
+ then(function (cache) {
+ cache.readRange(0, 1).then(function () {
+ cache.clear().then(checkCount, thenFailTest);
+ cache.clear().then(checkCount, thenFailTest);
+ cache.clear().then(checkCount, thenFailTest);
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheOnIdleIsFired() {
+ var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: 0 };
+
+ createNewCache(options).
+ then(function (cache) {
+ var counter = 0;
+ var clearSucceeded = false;
+
+ var thenFailThisTest = function (err) {
+ if (err && err.message) {
+ djstest.fail(err.message);
+ } else {
+ djstest.fail("unexepected promise failure");
+ }
+ };
+
+ cache.onidle = function () {
+ counter++;
+ djstest.assertAreEqual(counter, 1, "onidle was called 1 times");
+ djstest.assert(clearSucceeded, "onidle was called after destroy");
+ djstest.done();
+ };
+
+ cache.readRange(0, 1).then(null, thenFailThisTest);
+ cache.readRange(0, 1).then(null, thenFailThisTest);
+ cache.readRange(3, 4).then(function () {
+ cache.readRange(5, 6).then(function () {
+ cache.clear().then(function () {
+ clearSucceeded = true;
+ }, thenFailThisTest);
+ }, thenFailThisTest);
+ }, thenFailThisTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheOnIdleFiresOnErrorTest() {
+
+ var errorResponse = false;
+ var httpClient = {
+ request: function (request, success, error) {
+ var response = { statusCode: 200, headers: { "Content-Type": "application/json", "OData-Version": "4.0" }, body: JSON.stringify({ d: [1, 2] }) };
+ if (!errorResponse) {
+ errorResponse = true;
+ setTimeout(function () {
+ success(response);
+ }, 0);
+ } else {
+ response.statusCode = 500;
+ response.body = "bad response";
+ setTimeout(function () {
+ error({ message: "HTTP request failed", request: request, response: response });
+ }, 0);
+ }
+ }
+ };
+
+ var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: 0, httpClient: httpClient };
+
+ createNewCache(options).
+ then(function (cache) {
+ var counter = 0;
+ var errorHandlerCalled = false;
+
+ var thenFailThisTest = function (err) {
+ if (err && err.message) {
+ if (errorResponse) {
+ djstest.assertAreEqual(err.message, "HTTP request failed", "Error is the expected one");
+ errorHandlerCalled = true;
+ } else {
+ djstest.fail(err.message);
+ }
+ } else {
+ djstest.fail("unexepected promise failure");
+ }
+ };
+
+ cache.onidle = function () {
+ counter++;
+ djstest.assertAreEqual(counter, 1, "onidle was called");
+ djstest.assert(errorHandlerCalled, "error handler was called before onidle");
+ cache.onidle = null;
+ cache.clear().then(function () {
+ djstest.done();
+ }, thenFailTest);
+ };
+ cache.readRange(0, 2).then(function () {
+ cache.readRange(2, 4).then(function () {
+ djstest.fail("unexpected readRange success");
+ }, thenFailThisTest);
+ }, thenFailThisTest);
+ }, thenFailTest);
+ });
+
+
+ djstest.addTest(function dataCacheOdataSourceNormalizedURITest() {
+ var requestsMade = 0;
+ var httpClient = {
+ request: function (request, success, error) {
+ var response = { statusCode: 200, headers: { "Content-Type": "application/json", "OData-Version": "4.0" }, body: JSON.stringify({ value: [1, 2] }) };
+ if (requestsMade === 0) {
+ djstest.pass("Cache made first request for data from the source");
+ requestsMade++;
+ } else {
+ // In memory storage will make a second request from the new cache since two caches with the same name will coexist
+ if (window.mozIndexedDB || window.localStorage || requestsMade > 1) {
+ djstest.fail("Unexpected request to the source");
+ } else {
+ djstest.pass("In memory cache requested the data from the source");
+ }
+ }
+ setTimeout(function () {
+ success(response);
+ }, 0);
+ }
+ };
+
+ var options = { name: "cache", source: "http://exampleuri.com/my service.svc", pageSize: 2, prefetchSize: 0, httpClient: httpClient };
+
+ createNewCache(options).
+ then(function (cache) {
+ cache.readRange(0, 2).then(function () {
+ options.source = "HtTp://ExampleURI.cOm/my%20service.svc";
+ var newCache = odatajs.cache.createDataCache(options);
+ newCache.readRange(0, 2).then(function (data) {
+ djstest.assertAreEqualDeep(data.value, [1, 2], "Got the expected data from the new cache instance");
+ newCache.clear().then(function () {
+ djstest.done();
+ }, thenFailTest);
+ }, thenFailTest);
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+
+ djstest.addTest(function dataCachePrefetchAllTest() {
+ var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: -1 };
+ var counter = 0;
+ var theCache;
+
+ var callback = function () {
+ counter++;
+ if (counter === 2) {
+ djstest.assertAreEqual(1, theCache.stats.netReads, "single page to satisfy read (" + theCache.stats.netReads + ")");
+ djstest.assert(theCache.stats.prefetches > 1, "theCache.stats.prefetches(" + theCache.stats.prefetches + ") > 1 - multiple prefetches");
+ djstest.done();
+ }
+ };
+
+ var checkDataAndCount = function (data) {
+ djstest.assertAreEqual(data.value.length, 1, "Single item returned");
+ djstest.assertAreEqual(data.value[0].FoodID, 0, "FoodId is set to zero for first item");
+ djstest.assertAreEqual(1, theCache.stats.netReads, "single theCache.stats.netReads");
+ djstest.assert(theCache.stats.prefetches <= 1, "theCache.stats.prefetches <= 1 - no repetitions");
+ callback();
+ };
+
+ createNewCache(options).
+ then(function (cache) {
+ theCache = cache;
+ cache.readRange(0, 1).then(checkDataAndCount, thenFailTest);
+ cache.onidle = function () {
+ djstest.log("onidle fired");
+ callback();
+ };
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheReadRangeTakeMoreThanCollectionCountTest() {
+ // Read multiple pages.
+ var options = { name: "cache", source: foodsFeed, pageSize: 2 };
+ createNewCache(options).
+ then(function (cache) {
+ cache.count().then(function (count) {
+ cache.readRange(0, count + 1).
+ then(function (data) {
+ djstest.assertAreEqual(data.value.length, count, "all items in the collection were read.");
+ cache.readRange(2, count + 1).
+ then(function (data) {
+ djstest.assertAreEqual(data.value.length, count - 2, "all requested in the collection were read.");
+ djstest.assertAreEqual(data.value[0].FoodID, 2, "first read food id is 2.");
+ djstest.done();
+ }, thenFailTest);
+ }, thenFailTest);
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheReadRangeSkipMoreThanCollectionCountTest() {
+ // Read multiple pages.
+ var options = { name: "cache", source: foodsFeed, pageSize: 2 };
+ createNewCache(options).
+ then(function (cache) {
+ cache.count().then(function (count) {
+ cache.readRange(count + 1, 5).
+ then(function (data) {
+ djstest.assertAreEqual(data.value.length, 0, "no items were read.");
+ djstest.done();
+ }, thenFailTest);
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheReadRangeTakeMoreThanPrefetchSizeTest() {
+ // Read multiple pages.
+ var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: 1 };
+ createNewCache(options).
+ then(function (cache) {
+ cache.readRange(0, 4).
+ then(function (data) {
+ djstest.assertAreEqual(data.value.length, 4, "all requested in the collection were read.");
+ djstest.assertAreEqual(data.value[0].FoodID, 0, "first food id is 0.");
+ djstest.assertAreEqual(data.value[1].FoodID, 1, "second food id is 1.");
+ djstest.assertAreEqual(data.value[2].FoodID, 2, "third food id is 2.");
+ djstest.assertAreEqual(data.value[3].FoodID, 3, "third food id is 3.");
+ djstest.done();
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function dataCacheRangeInvalidIndexAndCount() {
+ var options = { name: "cache", source: foodsFeed, pageSize: 2, prefetchSize: 1 };
+ var counter = 0;
+
+ var thenFailSuccess = function () {
+ djstest.fail("Call to success was unexpected");
+ counter++;
+ if (counter === tests.length) {
+ djstest.done();
+ }
+ };
+
+ var thenFailError = function () {
+ djstest.fail("Call to error was unexpected");
+ counter++;
+ if (counter === tests.length) {
+ djstest.done();
+ }
+ };
+
+ var invalidValues = [-5, -1, null, undefined, NaN, Infinity, "5", "this is not a number"];
+ var tests = [];
+ $.each(invalidValues, function (_, value) {
+ tests.push({ i: value, c: 0 });
+ tests.push({ i: 0, c: value });
+ tests.push({ i: value, c: value });
+ });
+
+ createNewCache(options).
+ then(function (cache) {
+ var i, len;
+ for (i = 0, len = tests.length; i < len; i++) {
+ var test = tests[i];
+ try {
+ cache.readRange(test.i, test.c).then(thenFailSuccess, thenFailTest);
+ } catch (err) {
+ djstest.pass("Expected exception was thrown: " + err.message);
+ counter++;
+ }
+ }
+ if (counter === tests.length) {
+ djstest.done();
+ }
+ });
+ });
+
+
+ djstest.addTest(function cacheOptionsForCountTest() {
+ var httpClient = {
+ request: function (r, success, error) {
+ window.setTimeout(function () {
+ success({ data: "10" });
+ }, 1);
+ return null;
+ }
+ };
+ var cache = odatajs.cache.createDataCache({
+ name: "mem", mechanism: "memory", source: "http://www.example.org/service/",
+ httpClient: httpClient
+ });
+ cache.count().then(function (count) {
+ djstest.assertAreEqual(count, 10, "count value");
+ djstest.done();
+ }, djstest.failAndDoneCallback("failed to get count"));
+ });
+
+ djstest.addTest(function dataCacheDestoryStopsThePrefetcherTest() {
+ var oldHttpClientRequest = window.odatajs.oData.net.defaultHttpClient.request;
+ var prefetchCount = 0;
+ var theCache;
+
+ window.odatajs.oData.net.defaultHttpClient.request = function (request, success, error) {
+ prefetchCount++;
+ djstest.assert(prefetchCount <= 3, "Expected prefetch request");
+ if (prefetchCount === 3) {
+ theCache.clear().then(function () {
+ djstest.assertAreEqual(prefetchCount, 3, "cache.clear() stopped the prefetcher");
+ djstest.done();
+ window.odatajs.oData.net.defaultHttpClient.request = oldHttpClientRequest;
+ }, thenFailTest);
+ return {
+ abort: function () { }
+ };
+ }
+ return oldHttpClientRequest(request, success, error);
+ };
+
+ try {
+ var options = { name: "cache", source: foodsFeed, pageSize: 1, prefetchSize: -1 };
+ createNewCache(options).then(function (cache) {
+ theCache = cache;
+ cache.readRange(0, 0).then(null, thenFailTest);
+ });
+ } catch (e) {
+ window.odatajs.oData.net.defaultHttpClient.request = oldHttpClientRequest;
+ djstest.fail("Exception thrown, prefetchSize: " + tests[count] + " error: " + e.message);
+ djstest.done();
+ }
+ });
+
+ djstest.addTest(function dataCacheFilterTest() {
+ var options = { name: "cache", source: foodsFeed, pageSize: 3, prefetchSize: -1 };
+ var counter = 0;
+
+ var singleItemPredicate = function (data) {
+ return data.FoodID === 2;
+ };
+
+ var multipleItemPredicate = function (data) {
+ return data.FoodID % 2 === 1;
+ };
+
+ var noItemPredicate = function (data) {
+ return data.Name === "something i would never eat";
+ };
+
+ var allItemPredicate = function (data) {
+ return data.FoodID >= 0;
+ };
+
+ var doneAfterAllTests = function () {
+ counter++;
+ if (counter === tests.length) {
+ djstest.done();
+ }
+ };
+
+ var last = collectionSize - 1;
+ var tests = [
+ { index: 0, count: -5, predicate: singleItemPredicate }, // Single match in entire collection
+ {index: 2, count: 1, predicate: singleItemPredicate }, // Single match, single count
+ {index: 3, count: 1, predicate: singleItemPredicate }, // Single match skipped, i.e. no matches
+ {index: 0, count: -1, predicate: multipleItemPredicate }, // Multiple matches in entire collection
+ {index: 0, count: 5, predicate: multipleItemPredicate }, // Multiple matches, take partial
+ {index: 3, count: 5, predicate: multipleItemPredicate }, // Multiple matches, skip/take partial
+ {index: 7, count: 10, predicate: multipleItemPredicate }, // Multiple matches, skip partial, take past end of collection
+ {index: 13, count: 4, predicate: allItemPredicate }, // All items match, skip/take partial
+ {index: 0, count: 20, predicate: noItemPredicate }, // No matches
+ {index: 0, count: 0, predicate: allItemPredicate }, // Zero count
+ {index: -5, count: 1, predicate: allItemPredicate }, // Negative index
+ {index: last + 1, count: 1, predicate: allItemPredicate }, // Index past end of collection
+
+ {index: last, count: -5, predicate: singleItemPredicate, backwards: true }, // Single match in entire collection
+ {index: 2, count: 1, predicate: singleItemPredicate, backwards: true }, // Single match, single count
+ {index: 1, count: 1, predicate: singleItemPredicate, backwards: true }, // Single match skipped, i.e. no matches
+ {index: last, count: -1, predicate: multipleItemPredicate, backwards: true }, // Multiple matches in entire collection
+ {index: last, count: 6, predicate: multipleItemPredicate, backwards: true }, // Multiple matches, take partial
+ {index: last - 3, count: 5, predicate: multipleItemPredicate, backwards: true }, // Multiple matches, skip/take partial
+ {index: 13, count: 10, predicate: multipleItemPredicate, backwards: true }, // Multiple matches, skip partial, take past end of collection
+ {index: 4, count: 13, predicate: allItemPredicate, backwards: true }, // All items match, skip/take partial
+ {index: last, count: 20, predicate: noItemPredicate, backwards: true }, // No matches
+ {index: 0, count: 0, predicate: allItemPredicate, backwards: true }, // Zero count
+ {index: -5, count: 1, predicate: allItemPredicate, backwards: true }, // Negative index
+ {index: last + 1, count: 1, predicate: allItemPredicate, backwards: true }, // Index past end of collection
+
+ {index: "foo", count: 1, predicate: singleItemPredicate, exception: { message: "'index' must be a valid number.", index: NaN} },
+ { index: 0, count: "foo", predicate: multipleItemPredicate, exception: { message: "'count' must be a valid number.", count: NaN} }
+ ];
+
+ var testDescription = function(test) {
+ return "filter [" + test.index + ", " + test.count + " " + (test.backwards ? "back" : "forward") + "] for predicate " + test.predicate;
+ };
+
+ var filterErrorCallback = function (err) {
+ if (err && err.message) {
+ djstest.fail(err.message);
+ } else {
+ djstest.fail("unexpected promise failure");
+ }
+ doneAfterAllTests();
+ };
+
+ var removeSafariExceptionProperties = function (err) {
+ /** Removes Safari-specific properties from an exception object
+ * @param {Exception} err -The exception object to operate on
+ * @returns {Exception} The original exception object with the Safari-specific properties removed
+ */
+ var safariProperties = ["line", "expressionBeginOffset", "expressionEndOffset", "sourceId", "sourceURL"];
+
+ var result = {};
+ $.each(err, function (property, value) {
+ if ($.inArray(property, safariProperties) === -1) {
+ result[property] = value;
+ }
+ });
+
+ return result;
+ };
+
+ ODataVerifyReader.readJsonAcrossServerPages(foodsFeed, function (expectData) {
+ $.each(tests, function (_, test) {
+ createNewCache(options).then(function (cache) {
+ try {
+ var expectedResults = {};
+ if (test.backwards) {
+ cache.filterBack(test.index, test.count, test.predicate).then(function (results) {
+ expectedResults = CacheVerifier.getExpectedFilterResults(expectData, test.index, test.count, test.predicate, test.backwards);
+ djstest.assertAreEqualDeep(results, expectedResults, "results for " + testDescription(test));
+ doneAfterAllTests();
+ }, filterErrorCallback);
+ } else {
+ cache.filterForward(test.index, test.count, test.predicate).then(function (results) {
+ expectedResults = CacheVerifier.getExpectedFilterResults(expectData, test.index, test.count, test.predicate, test.backwards);
+ djstest.assertAreEqualDeep(results, expectedResults, "results for " + testDescription(test));
+ doneAfterAllTests();
+ }, filterErrorCallback);
+ }
+
+ if (test.exception) {
+ djstest.fail("expected exception for " + testDescription(test));
+ doneAfterAllTests();
+ }
+ } catch (err) {
+ if (test.exception) {
+ djstest.assertAreEqualDeep(removeSafariExceptionProperties(err), test.exception, "exception for " + testDescription(test));
+ } else {
+ djstest.fail("unexpected exception for " + testDescription(test) + ": " + djstest.toString(err));
+ }
+ doneAfterAllTests();
+ }
+ }, thenFailTest);
+ });
+ });
+ });
+
+ djstest.addTest(function createDataCacheTest() {
+ var cache;
+
+ // Verify the defaults.
+ cache = odatajs.cache.createDataCache({ name: "name", source: "src" });
+
+ djstest.assertAreEqual(cache.onidle, undefined, "onidle is undefined");
+
+ // Verify specific values.
+ cache = odatajs.cache.createDataCache({ name: "name", source: "src", cacheSize: 1, pageSize: 2, prefetchSize: 3, idle: 123 });
+
+ djstest.assertAreEqual(cache.onidle, 123, "onidle is as specified");
+
+ // Verify 0 pageSize
+ djstest.expectException(function () {
+ odatajs.cache.createDataCache({ name: "name", source: "src", cacheSize: 1, pageSize: 0, prefetchSize: 3, idle: 123 });
+ }, "zero pageSize");
+
+ // Verify negative pageSize
+ djstest.expectException(function () {
+ odatajs.cache.createDataCache({ name: "name", source: "src", cacheSize: 1, pageSize: -2, prefetchSize: 3, idle: 123 });
+ }, "negative pageSize");
+
+ // Verify NaN pageSize
+ djstest.expectException(function () {
+ cache = odatajs.cache.createDataCache({ name: "name", source: "src", cacheSize: 1, pageSize: "2", prefetchSize: 3, idle: 123 });
+ }, "NaN pageSize");
+
+ // Verify NaN cacheSize
+ djstest.expectException(function () {
+ cache = odatajs.cache.createDataCache({ name: "name", source: "src", cacheSize: "1", pageSize: 2, prefetchSize: 3, idle: 123 });
+ }, "NaN cacheSize");
+
+ // Verify NaN prefetchSize
+ djstest.expectException(function () {
+ cache = odatajs.cache.createDataCache({ name: "name", source: "src", cacheSize: 1, pageSize: 2, prefetchSize: "3", idle: 123 });
+ }, "NaN prefetchSize");
+
+ // Verify undefined name
+ djstest.expectException(function () {
+ odatajs.cache.createDataCache({ source: "src", cacheSize: 1, pageSize: 1, prefetchSize: 3, idle: 123 });
+ }, "undefined name");
+
+ // Verify null name
+ djstest.expectException(function () {
+ odatajs.cache.createDataCache({ name: null, source: "src", cacheSize: 1, pageSize: 1, prefetchSize: 3, idle: 123 });
+ }, "null name");
+
+ // Verify undefined source
+ djstest.expectException(function () {
+ odatajs.cache.createDataCache({ name: "name", cacheSize: 1, pageSize: 1, prefetchSize: 3, idle: 123 });
+ }, "undefined source");
+
+ djstest.done();
+ });
+
+ djstest.addTest(function createDataCacheWithSourceTest() {
+ var cacheSource = {
+ count: function (success) {
+ djstest.pass("cacheSource.count was called");
+ success(0);
+ },
+
+ read: function (index, count, success, error) {
+ djstest.assertAreEqual(index, 0, "index is the expected one");
+ djstest.assertAreEqual(count, 10, "test is the expected one");
+ djstest.assert(success, "success is defined");
+ djstest.assert(error, "error is defined");
+ djstest.pass("cacheSource.read was called");
+
+ setTimeout(function () {
+ success([]);
+ }, 0);
+ }
+ };
+
+ var cache = odatajs.cache.createDataCache({ name: "name", source: cacheSource, mechanism: "memory", pageSize: 10 });
+ cache.count().then(function () {
+ cache.readRange(0, 5).then(function () {
+ djstest.done();
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ djstest.addTest(function cacheInitializationFailTest() {
+ // Tests various failure modes for cache initialization.
+ var failures = ["read-settings", "write-settings", "v2"];
+ var failureIndex = 0;
+
+ var originalStore = odatajs.store.createStore;
+ var restoreStore = function () {
+ odatajs.store.createStore = originalStore;
+ };
+
+ var storeError = { message: "cacheInitializationFailTest error" };
+ odatajs.store.createStore = function (name, mechanism) {
+ return {
+ addOrUpdate: function (key, value, successCallback, errorCallback) {
+ if (failures[failureIndex] === "write-settings") {
+ window.setTimeout(function () { errorCallback(storeError); }, 2);
+ } else {
+ djstest.fail("Error unaccounted for in addOrUpdate for " + failures[failureIndex]);
+ window.setTimeout(function () { errorCallback(storeError); }, 2);
+ }
+ },
+ read: function (key, successCallback, errorCallback) {
+ if (failures[failureIndex] === "read-settings") {
+ window.setTimeout(function () { errorCallback(storeError); }, 2);
+ } else if (failures[failureIndex] === "v2") {
+ window.setTimeout(function () {
+ successCallback("K", { version: "2.0" });
+ }, 2);
+ } else if (failures[failureIndex] === "write-settings") {
+ window.setTimeout(function () { successCallback(null, null); }, 2);
+ } else {
+ djstest.fail("Error unaccounted for read in " + failures[failureIndex]);
+ window.setTimeout(function () { errorCallback(storeError); }, 2);
+ }
+ }
+ };
+ };
+
+ var nextFailure = function () {
+ djstest.log("Failure mode: " + failures[failureIndex]);
+ var cache = odatajs.cache.createDataCache({ name: "name", source: "foo", mechanism: "memory", pageSize: 10 });
+ try {
+ // The first readRange should succeed, because the data cache isn't really initialized at this time.
+ cache.readRange(1, 2).then(djstest.failAndDoneCallback("No function should succeed"), function (err) {
+ djstest.expectException(function () {
+ cache.readRange(1, 2);
+ }, "readRange after store is invalidated");
+
+ djstest.expectException(function () {
+ cache.count();
+ }, "count after store is invalidated");
+
+ djstest.expectException(function () {
+ cache.clear();
+ }, "clear after store is invalidated");
+
+ djstest.expectException(function () {
+ cache.filterForward(1, 2);
+ }, "filterForward after store is invalidated");
+
+ djstest.expectException(function () {
+ cache.filterBack(1, 2);
+ }, "filterBack after store is invalidated");
+
+ djstest.expectException(function () {
+ cache.toObservable();
+ }, "toObservable after store is invalidated");
+
+ failureIndex++;
+ if (failureIndex === failures.length) {
+ restoreStore();
+ djstest.done();
+ } else {
+ nextFailure();
+ }
+ });
+ } catch (outerError) {
+ djstest.fail("Unexpected failure for first .readRange: " + window.JSON.stringify(outerError));
+ restoreStore();
+ djstest.done();
+ }
+ };
+
+ nextFailure();
+ });
+
+ djstest.addTest(function createDataCacheWithSourceCallsErrorTest() {
+ var cacheSource = {
+ count: function () {
+ djstest.fail("cacheSource.count was called");
+ },
+
+ read: function (index, count, success, error) {
+ setTimeout(function () {
+ error({ message: "source error" });
+ }, 0);
+ }
+ };
+
+ var cache = odatajs.cache.createDataCache({ name: "name", source: cacheSource, mechanism: "memory", pageSize: 10 });
+ cache.readRange(0, 5).then(function () {
+ djstest.fail("unexpected call to then success");
+ djstest.done();
+ }, function (err) {
+ djstest.assertAreEqual(err.message, "source error", "got the expected error");
+ djstest.done();
+ });
+ });
+
+ djstest.addTest(function toObservableMissingTest() {
+ createNewCache({ name: "cache", source: "http://temp.org" }).then(function (cache) {
+ var hiddenRx = window.Rx;
+ try {
+ window.Rx = null;
+ var error = null;
+ try {
+ cache.toObservable();
+ } catch (err) {
+ error = err;
+ }
+
+ djstest.assert(error !== null, "error !== null");
+ } finally {
+ window.Rx = hiddenRx;
+ }
+
+ djstest.assert(error !== null, "error !== null");
+ djstest.destroyCacheAndDone(cache);
+ });
+ });
+
+ djstest.addTest(function toObservableSinglePageTest() {
+ createNewCache({ name: "cache", source: foodsFeed }).then(function (cache) {
+ var lastId = -1;
+ cache.toObservable().subscribe(function (item) {
+ djstest.assert(lastId < item.FoodID, "lastId < item.FoodID");
+ lastId = item.FoodID;
+ }, thenFailTest, function () {
+ djstest.assert(lastId !== -1, "lastId !== -1");
+ djstest.done();
+ });
+ });
+ });
+
+ djstest.addTest(function toObservableCaseSinglePageTest() {
+ createNewCache({ name: "cache", source: foodsFeed }).then(function (cache) {
+ var lastId = -1;
+ cache.toObservable().subscribe(function (item) {
+ djstest.assert(lastId < item.FoodID, "lastId < item.FoodID");
+ lastId = item.FoodID;
+ }, thenFailTest, function () {
+ djstest.assert(lastId !== -1, "lastId !== -1");
+ djstest.done();
+ });
+ });
+ });
+
+ djstest.addTest(function toObservableMultiplePageTest() {
+ createNewCache({ name: "cache", source: foodsFeed, pageSize: 2 }).then(function (cache) {
+ var lastId = -1;
+ var callCount = 0;
+ cache.toObservable().subscribe(function (item) {
+ djstest.assert(lastId < item.FoodID, "lastId < item.FoodID");
+ lastId = item.FoodID;
+ callCount += 1;
+ }, thenFailTest, function () {
+ djstest.assert(lastId !== -1, "lastId !== -1");
+ djstest.assert(callCount > 1, "callCount > 1");
+ djstest.done();
+ });
+ });
+ });
+
+ djstest.addTest(function toObservableEarlyDisposeTest() {
+ createNewCache({ name: "cache", source: foodsFeed, pageSize: 2 }).then(function (cache) {
+ var lastId = -1;
+ var callCount = 0;
+ var complete = false;
+ var observer = cache.toObservable().subscribe(function (item) {
+ djstest.assert(complete === false, "complete === false");
+ djstest.assert(lastId < item.FoodID, "lastId < item.FoodID");
+ lastId = item.FoodID;
+ callCount += 1;
+ complete = true;
+ observer.Dispose();
+ djstest.done();
+ }, thenFailTest);
+ });
+ });
+
+ djstest.addTest(function toObservableFailureTest() {
+ createNewCache({ name: "cache", source: foodsFeed, pageSize: 2 }).then(function (cache) {
+ var lastId = -1;
+ var complete = false;
+ window.MockHttpClient.clear().addResponse("*", { statusCode: 500, body: "server error" });
+ window.MockHttpClient.async = true;
+ var savedClient = window.odatajs.oData.net.defaultHttpClient;
+ window.odatajs.oData.net.defaultHttpClient = window.MockHttpClient;
+ cache.toObservable().subscribe(function (item) {
+ window.odatajs.oData.net.defaultHttpClient = savedClient;
+ djstest.fail("Unexpected call to OnNext");
+ }, function (err) {
+ djstest.assert(complete === false, "complete === false");
+ djstest.assert(err, "err defined");
+ window.odatajs.oData.net.defaultHttpClient = savedClient;
+ complete = true;
+ djstest.done();
+ }, function (complete) {
+ djstest.fail("Unexpected call to complete. Error handler should be called.");
+ window.odatajs.oData.net.defaultHttpClient = savedClient;
+ complete = true;
+ djstest.done();
+ });
+ });
+ });
+
+ // DATAJS INTERNAL START
+
+ djstest.addTest(function createDeferredTest() {
+ // Verify basic use of deferred object.
+ var deferred = odatajs.deferred.createDeferred();
+ deferred.then(function (val1, val2) {
+ djstest.assertAreEqual(val1, 1, "val1 is as specified");
+ djstest.assertAreEqual(val2, 2, "val2 is as specified");
+ djstest.done();
+ });
+ deferred.resolve(1, 2);
+ });
+
+ djstest.addTest(function deferredThenTest() {
+ // Verify then registration and chaining.
+ var deferred = odatajs.deferred.createDeferred();
+ deferred.then(function (val1, val2) {
+ djstest.assertAreEqual(val1, 1, "val1 is as specified");
+ djstest.assertAreEqual(val2, 2, "val2 is as specified");
+ return "foo";
+ }).then(function (foo) {
+ // See Compatibility Note B in DjsDeferred remarks.
+ djstest.assert(foo !== "foo", "argument for chained 'then' is *not* result of previous call");
+ djstest.assert(foo === 1, "argument for chained 'then' is same as for previous call");
+
+ var other = odatajs.deferred.createDeferred();
+ other.then(null, function (err, msg) {
+ djstest.assertAreEqual("error", err, "err is as specified");
+ djstest.assertAreEqual("message", msg, "msg is as specified");
+
+ }).then(null, function (err, msg) {
+ djstest.log("chained errors are called");
+
+ djstest.assertAreEqual("error", err, "err is as specified");
+ djstest.assertAreEqual("message", msg, "msg is as specified");
+
+ var multiple = odatajs.deferred.createDeferred();
+ var count = 0;
+
+ // See Compatibility Note A in DjsDeferred remarks.
+ multiple.then(function () {
+ djstest.assertAreEqual(count, 0, "first base registration fires as #0");
+ count++;
+ }).then(function () {
+ djstest.assertAreEqual(count, 1, "first chained registration fires as #1");
+ count++;
+ });
+
+ multiple.then(function () {
+ djstest.assertAreEqual(count, 2, "second base registration fires as #2");
+ count++;
+ }).then(function () {
+ djstest.assertAreEqual(count, 3, "second chained registration fires as #3");
+ djstest.done();
+ });
+
+ multiple.resolve();
+ });
+ other.reject("error", "message");
+ });
+
+ deferred.resolve(1, 2);
+ });
+
+ djstest.addTest(function deferredResolveTest() {
+ // Resolve with no arguments.
+ var deferred = odatajs.deferred.createDeferred();
+ deferred.then(function (arg) {
+ djstest.assertAreEqual(arg, undefined, "resolve with no args shows up as undefined");
+
+ // Resolve with no callbacks.
+ var other = odatajs.deferred.createDeferred();
+ other.resolve();
+ djstest.done();
+ });
+
+ deferred.resolve();
+ });
+
+ djstest.addTest(function deferredRejectTest() {
+ // Resolve with no arguments.
+ var deferred = odatajs.deferred.createDeferred();
+ deferred.then(null, function (arg) {
+ djstest.assertAreEqual(arg, undefined, "reject with no args shows up as undefined");
+
+ // Resolve with no callbacks.
+ var other = odatajs.deferred.createDeferred();
+ other.reject();
+ djstest.done();
+ });
+
+ deferred.reject();
+ });
+
+ djstest.addTest(function estimateSizeTest() {
+ var tests = [
+ { i: null, e: 8 },
+ { i: undefined, e: 8 },
+ { i: 0, e: 8 },
+ { i: "abc", e: 6 },
+ { i: [1, 2, 3], e: 30 },
+ { i: { a1: null, a2: undefined, a3: 5, a4: "ab", a5: { b1: 5, b2: 6} }, e: 72 },
+ { i: {}, e: 0 }
+ ];
+
+ var i, len;
+ for (i = 0, len = tests.length; i < len; i++) {
+ var test = tests[i];
+ djstest.assertAreEqual(odatajs.cache.estimateSize(test.i), test.e);
+ }
+ djstest.done();
+ });
+
+ djstest.addTest(function cacheOptionsTunnelTest() {
+ var mockClient = window.MockHttpClient;
+ var doneCalled = false;
+
+ mockClient.clear().setAsync(true).addRequestVerifier("*", function (theRequest) {
+ if (!doneCalled) {
+ doneCalled = true;
+ djstest.assertAreEqual(theRequest.user, "the-user", "theRequest.user");
+ djstest.assertAreEqual(theRequest.password, "the-password", "theRequest.password");
+ djstest.assertAreEqual(theRequest.enableJsonpCallback, false, "theRequest.enableJsonpCallback");
+ djstest.assertAreEqual(theRequest.callbackParameterName, "p", "callbackParameterName");
+ djstest.done();
+ }
+ });
+
+ var cache = odatajs.cache.createDataCache({
+ name: "cacheOptionsTunnel",
+ source: "http://foo-bar/",
+ user: "the-user",
+ password: "the-password",
+ enableJsonpCallback: false,
+ callbackParameterName: "p",
+ httpClient: mockClient
+ });
+
+ cache.readRange(0, 10).then(function (arr) {
+ djstest.fail("unexpected callback into readRange in test cacheOptionsTunnelTest");
+ if (!doneCalled) {
+ doneCalled = true;
+ djstest.done();
+ }
+ });
+ });
+
+ djstest.addTest(function dataCacheHandlesFullStoreTest() {
+
+ var TestStore = function (name) {
+ var that = new window.odatajs.store.MemoryStore(name);
+ that.addOrUpdate = function (key, value, success, error) {
+ if (key === "__settings") {
+ window.setTimeout(function () {
+ success(key, value);
+ }, 0);
+ } else {
+ window.setTimeout(function () {
+ error({ name: "QUOTA_EXCEEDED_ERR" });
+ }, 0);
+ }
+ };
+ return that;
+ };
+
+ TestStore.create = function (name) {
+ return new TestStore(name);
+ };
+
+ TestStore.isSupported = function () {
+ return true;
+ };
+
+ var cacheSource = {
+ identifier: "testSource",
+ count: function (success) {
+ djstest.fail("cacheSource.count was called");
+ success(5);
+ },
+ read: function (index, count, success, error) {
+ djstest.assertAreEqual(index, 0, "index is the expected one");
+ djstest.assertAreEqual(count, 5, "test is the expected one");
+
+ setTimeout(function () {
+ success({ value: [1, 2, 3, 4, 5] });
+ }, 0);
+ }
+ };
+
+ var originalCreateStore = window.odatajs.store.createStore;
+
+ window.odatajs.store.createStore = function (name, mechanism) {
+ return TestStore(name);
+ };
+
+ try {
+ var cache = odatajs.cache.createDataCache({
+ name: "cache",
+ pageSize: 5,
+ prefetchSize: 0,
+ source: cacheSource,
+ mechanism: "teststore"
+ });
+ } finally {
+ window.odatajs.store.createStore = originalCreateStore;
+ }
+
+ cache.readRange(0, 5).then(function (data) {
+ djstest.assertAreEqual(data.value.length, 5, "5 items were read.");
+ cache.readRange(0, 5).then(function (data) {
+ djstest.assertAreEqual(data.value.length, 5, "5 items were read.");
+ djstest.done();
+ }, thenFailTest);
+ }, thenFailTest);
+ });
+
+ // DATAJS INTERNAL END
+})(this);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/a044327c/datajs/tests-tmp/b-datajs-cache-large-collection-functional-tests.html
----------------------------------------------------------------------
diff --git a/datajs/tests-tmp/b-datajs-cache-large-collection-functional-tests.html b/datajs/tests-tmp/b-datajs-cache-large-collection-functional-tests.html
new file mode 100644
index 0000000..a3820cb
--- /dev/null
+++ b/datajs/tests-tmp/b-datajs-cache-large-collection-functional-tests.html
@@ -0,0 +1,53 @@
+<!--
+/*
+ * 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.
+ */
+ -->
+<html>
+<head>
+ <title>datajs.cache and datajs.store full local store tests</title>
+ <meta http-equiv="cache-control" content="no-cache"/>
+ <meta http-equiv="pragma" content="no-cache"/>
+ <meta http-equiv="expires" content="-1"/>
+
+ <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.10.0.css" type="text/css" />
+ <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/json2/20110223/json2.js"></script>
+ <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.4.min.js"></script>
+ <script type="text/javascript" src="http://code.jquery.com/qunit/qunit-1.10.0.js"></script>
+ <!--<script type="text/javascript" src="common/TestSynchronizerClient.js"></script>-->
+ <!--<script type="text/javascript">
+ window.TestSynchronizer.init(QUnit);
+ </script>-->
+ <script type="text/javascript" src="../build/odatajs-4.0.0-beta-01.js"></script>
+ <!--<script type="text/javascript" src="common/common.js"></script>-->
+
+ <script type="text/javascript" src="common/djstest.js"></script>
+ <script type="text/javascript" src="common/djstest-browser.js"></script>
+ <script type="text/javascript" src="common/cacheVerifier.js"></script>
+ <script type="text/javascript" src="common/observableHttpClient.js"></script>
+ <!--<script type="text/javascript" src="common/ODataReadOracle.js"></script>-->
+
+ <script type="text/javascript" src="b-datajs-cache-large-collection-functional-tests.js"></script>
+</head>
+<body>
+ <h1 id="qunit-header">datajs.cache and datajs.store full local store tests</h1>
+ <h2 id="qunit-banner"></h2>
+ <h2 id="qunit-userAgent"></h2>
+ <ol id="qunit-tests"></ol>
+</body>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/a044327c/datajs/tests-tmp/b-datajs-cache-large-collection-functional-tests.js
----------------------------------------------------------------------
diff --git a/datajs/tests-tmp/b-datajs-cache-large-collection-functional-tests.js b/datajs/tests-tmp/b-datajs-cache-large-collection-functional-tests.js
new file mode 100644
index 0000000..d09ae51
--- /dev/null
+++ b/datajs/tests-tmp/b-datajs-cache-large-collection-functional-tests.js
@@ -0,0 +1,187 @@
+/*
+ * 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.
+ */
+
+(function (window, undefined) {
+ window.odatajs.oData.defaultHandler.accept = "application/json;q=0.9, */*;q=0.1";
+ var largeCollectionFeed = "./endpoints/LargeCollectionService.svc/Customers";
+ var itemsInCollection = 2 * 1024 * 1024;
+
+ var cleanDomStorage = function (done) {
+ /* Cleans all the data saved in the browser's DOM Storage. Needs to be called asynchronously in the
+ * setup and teardown methods to be consistent with indexedDb's cleanup method.
+ * @param {Function} done - Function to be called after DOM storage is cleared.
+ */
+ if (window.localStorage) {
+ window.localStorage.clear();
+ }
+ done();
+ };
+
+ var cleanIndexedDb = function (done) {
+ /** Cleans all the data saved in the browser's IndexedDb Storage.
+ * @param {Function} done - Function to be called after DOM storage is cleared.
+ */
+ var caches = this.caches;
+
+ djstest.cleanStoreOnIndexedDb(caches, done);
+ };
+
+ var makeUnexpectedErrorHandler = function () {
+ return function (err) {
+ djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
+ };
+ };
+
+ var storageMechanisms = {
+ indexeddb: { cleanup: cleanIndexedDb },
+ dom: { cleanup: cleanDomStorage }
+ };
+
+ var cleanupAllStorage = function(done) {
+ /** Cleans up all available storage mechanisms in the browser.
+ * @param {Function} done - Function to be called by each cleanup function after storage is cleared.
+ */
+ var that = this;
+ var storeCleanup = [];
+
+ $.each(CacheVerifier.mechanisms, function(_, mechanism) {
+ if (CacheVerifier.isMechanismAvailable(mechanism)) {
+ storeCleanup.push(function(done) {
+ if (storageMechanisms[mechanism]) {
+ storageMechanisms[mechanism].cleanup.call(that, done);
+ } else {
+ done();
+ }
+ });
+ }
+ });
+
+ djstest.asyncDo(storeCleanup, done);
+ };
+
+
+ module("Functional", {
+ setup: function () {
+ this.observableHttpClient = new ObservableHttpClient();
+ window.odatajs.oData.net.defaultHttpClient = this.observableHttpClient;
+ this.caches = [];
+ var that = this;
+
+ djstest.wait(function (done) {
+ cleanupAllStorage.call(that, done);
+ });
+ },
+
+ teardown: function () {
+ window.odatajs.oData.net.defaultHttpClient = this.observableHttpClient.provider;
+ var clearActions = [];
+ var that = this;
+
+ $.each(this.caches, function (_, cacheObject) {
+ cacheObject.cache.onidle = undefined;
+
+ clearActions.push(function (done) {
+ cacheObject.cache.clear().then(function () {
+ done();
+ },
+ function (err) {
+ djstest.assert(false, "Unexpected call to error handler while attempting to clear with error: " + djstest.toString(err));
+ });
+ });
+ });
+
+ djstest.wait(function (done) {
+ djstest.asyncDo(clearActions, function () {
+ cleanupAllStorage.call(that, function () {
+ that.caches = [];
+ done();
+ });
+ });
+ });
+ }
+ });
+
+ $.each(["dom", "indexeddb"], function (_, mechanism) {
+ if (CacheVerifier.isMechanismAvailable(mechanism)) {
+ $.each([-1, 10 * 1024 * 1024, 1024 * 10248], function (_, cacheSize) {
+ var prefetchParameters = { mechanism: mechanism, feed: largeCollectionFeed, skip: 0, take: 5, pageSize: 1024, prefetchSize: -1, cacheSize: cacheSize };
+ djstest.addTest(function (params) {
+
+ djstest.assertsExpected(3);
+ var options = { name: "cache" + new Date().valueOf(), source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize,
+ mechanism: params.mechanism, cacheSize: params.cacheSize
+ };
+
+ var cache = odatajs.cache.createDataCache(options);
+ this.caches.push({ name: options.name,
+ cache: cache
+ });
+
+ cache.onidle = function () {
+ djstest.assert(true, "onidle Called");
+ djstest.done();
+ };
+
+ var cacheOracle = new CacheVerifier(params.feed, params.pageSize, itemsInCollection);
+ var session = this.observableHttpClient.newSession();
+
+ cache.readRange(params.skip, params.take).then(function (data) {
+ var expectedRangeUrl = params.feed + "?$skip=" + params.skip + "&$top=" + params.take;
+ cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "largeCollection requests with prefetch", false, true);
+ window.ODataReadOracle.readJsonAcrossServerPages(expectedRangeUrl, function (expectedData) {
+ djstest.assertAreEqualDeep(data, expectedData, "Verify response data");
+ });
+ }, function (err) {
+ makeUnexpectedErrorHandler(err)();
+ });
+ }, "readRange and prefetch all to fill store on " + prefetchParameters.mechanism + " with cacheSize=" + prefetchParameters.cacheSize, prefetchParameters, 600000);
+
+ $.each([500, 1024 * 10 /*Test reduced from 100 to 10 to work around slow running script error in IE8 and Safari (bug 2200)*/], function (_, pageSize) {
+ var largeReadParameters = { mechanism: mechanism, feed: largeCollectionFeed, skip: 0, take: 1024, pageSize: pageSize, prefetchSize: 0, cacheSize: cacheSize };
+ djstest.addTest(function (params) {
+
+ djstest.assertsExpected(2);
+ var options = { name: "cache" + new Date().valueOf(), source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize,
+ mechanism: params.mechanism, cacheSize: params.cacheSize
+ };
+
+ var cache = odatajs.cache.createDataCache(options);
+ this.caches.push({ name: options.name, cache: cache });
+
+ var cacheOracle = new CacheVerifier(params.feed, params.pageSize, itemsInCollection);
+ var session = this.observableHttpClient.newSession();
+
+ cache.readRange(params.skip, params.take).then(function (data) {
+ var expectedRangeUrl = params.feed + "?$skip=" + params.skip + "&$top=" + params.take;
+ cacheOracle.verifyRequests(session.requests, session.responses, params.skip, params.take, "largeCollection requests without prefetch", false, false);
+ window.ODataReadOracle.readJsonAcrossServerPages(expectedRangeUrl, function (expectedData) {
+ djstest.assertAreEqualDeep(data, expectedData, "Verify response data");
+ djstest.done();
+ });
+ }, function (err) {
+ makeUnexpectedErrorHandler(err)();
+ djstest.done();
+ });
+ }, "readRange of skip=" + largeReadParameters.skip + " take=" + largeReadParameters.take + " cacheSize=" + largeReadParameters.cacheSize + " and pageSize=" + largeReadParameters.pageSize +
+ " to fill store on " + largeReadParameters.mechanism, largeReadParameters, 600000);
+ });
+ });
+ }
+ });
+})(window);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/a044327c/datajs/tests-tmp/bn-odata-json-tests.js
----------------------------------------------------------------------
diff --git a/datajs/tests-tmp/bn-odata-json-tests.js b/datajs/tests-tmp/bn-odata-json-tests.js
new file mode 100644
index 0000000..3e306a5
--- /dev/null
+++ b/datajs/tests-tmp/bn-odata-json-tests.js
@@ -0,0 +1,211 @@
+/*
+ * 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.
+ */
+
+// odata-tests.js
+
+(function (window, undefined) {
+ QUnit.module("odata-json-tests.js");
+
+ djstest.addTest(function isArrayTest() {
+ djstest.assert(window.odatajs.utils.isArray([]));
+ djstest.assert(window.odatajs.utils.isArray([1, 2]));
+ djstest.assert(!window.odatajs.utils.isArray({}));
+ djstest.assert(!window.odatajs.utils.isArray("1,2,3,4"));
+ djstest.assert(!window.odatajs.utils.isArray());
+ djstest.assert(!window.odatajs.utils.isArray(null));
+ djstest.done();
+ });
+
+ var verifyReadJsonLightDataMetadataFull = function (input, expected, message, model) {
+ var response = {
+ headers: {
+ "Content-Type": "application/json;odata.metadata=full",
+ DataServiceVersion: "4.0"
+ },
+ body: JSON.stringify(input)
+ };
+
+ window.odatajs.oData.json.jsonHandler.read(response, { metadata: model });
+ djstest.assertAreEqualDeep(response.data, expected, message);
+ };
+
+
+ var verifyReadJsonLightDataMetadataMinimal= function (input, expected, message, model) {
+ var response = {
+ headers: {
+ "Content-Type": "application/json;odata.metadata=minimal",
+ DataServiceVersion: "4.0"
+ },
+ body: JSON.stringify(input)
+ };
+
+ window.odatajs.oData.json.jsonHandler.read(response, { metadata: model });
+ djstest.assertAreEqualDeep(response.data, expected, message);
+ };
+
+
+ function createPointValue(geoKind) {
+ return {
+ edmType : geoKind+'Point', value : {
+ type: "Point",
+ coordinates: [1.0, 2.0],
+ crs: {
+ type: "Point",
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }
+ };
+ }
+
+ function createLineStringValue(geoKind) {
+ return {
+ edmType : geoKind+'LineString', value : {
+ "type": "LineString",
+ "coordinates": [ [100.0, 0.0], [101.0, 1.0] ],
+ crs: {
+ type: "LineString",
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }
+ };
+ }
+
+ function createPolygonValue(geoKind) {
+ return {
+ edmType : geoKind+'Polygon', value : {
+ "type": "Polygon",
+ "coordinates": [
+ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
+ [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
+ ],
+ crs: {
+ type: "Polygon",
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }
+ };
+ }
+
+ function createMultiPointValue(geoKind) {
+ return {
+ edmType : geoKind+'MultiPoint', value : {
+ "type": "MultiPoint",
+ "coordinates": [ [100.0, 0.0], [101.0, 1.0] ],
+ crs: {
+ type: "MultiPoint",
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }
+ };
+ }
+
+ function createMultiLineStringValue(geoKind) {
+ return {
+ edmType : geoKind+'MultiLineString', value : {
+ "type": "MultiLineString",
+ "coordinates": [
+ [ [100.0, 0.0], [101.0, 1.0] ],
+ [ [102.0, 2.0], [103.0, 3.0] ]
+ ],
+ crs: {
+ type: "MultiLineString",
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }
+ };
+ }
+ function createMultiPolygonStringValue(geoKind) {
+ return {
+ edmType : geoKind+'MultiPolygon', value : {
+ "type": "MultiPolygon",
+ "coordinates": [
+ [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
+ [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
+ [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
+ ],
+ crs: {
+ type: "MultiPolygon",
+ properties: {
+ name: "EPSG:4326"
+ }
+ }
+ }
+ };
+ }
+
+ function createWorkload(geoKind) {
+ return [
+ createPointValue(geoKind),
+ createLineStringValue(geoKind),
+ createPolygonValue(geoKind),
+ createMultiPointValue(geoKind),
+ createMultiLineStringValue(geoKind),
+ createMultiPolygonStringValue(geoKind)
+ ];
+ }
+
+ function checkGeoKind(geoKind, full) {
+ var workload = createWorkload(geoKind);
+ for ( var i = 0; i < workload.length; i++) {
+ var item = workload[i];
+ var input = {
+ "@odata.context": "http://someUri#Edm."+item.edmType,
+ "value@odata.type" : item.edmType,
+ value: item.value
+ };
+
+ var expected = {
+ "@odata.context": "http://someUri#Edm."+item.edmType,
+ "value@odata.type" : item.edmType,
+ value: item.value
+ };
+ if (full) {
+ verifyReadJsonLightDataMetadataFull(input, expected, item.edmType + " was read properly.", {});
+ } else {
+ verifyReadJsonLightDataMetadataMinimal(input, expected, item.edmType + " was read properly.", {});
+ }
+ }
+
+ djstest.done();
+ }
+
+ djstest.addTest(function jsonReadGeometryFull() {
+ checkGeoKind('Geometry',true);
+ });
+ djstest.addTest(function jsonReadGeometryMinimal() {
+ checkGeoKind('Geometry',false);
+ });
+ djstest.addTest(function jsonReadGeographyFull() {
+ checkGeoKind('Geography',true);
+ });
+ djstest.addTest(function jsonReadGeographyMinimal() {
+ checkGeoKind('Geography',false);
+ });
+
+})(window);
http://git-wip-us.apache.org/repos/asf/olingo-odata4-js/blob/a044327c/datajs/tests-tmp/common/ODataVerifiyReader.svc
----------------------------------------------------------------------
diff --git a/datajs/tests-tmp/common/ODataVerifiyReader.svc b/datajs/tests-tmp/common/ODataVerifiyReader.svc
new file mode 100644
index 0000000..101cf36
--- /dev/null
+++ b/datajs/tests-tmp/common/ODataVerifiyReader.svc
@@ -0,0 +1,114 @@
+/*
+ * 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.
+*/
+
+<%@ ServiceHost Language="C#" Debug="true" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"
+ Service="DataJS.Tests.ODataVerifyReader" %>
+
+//uncomment this line to debug JSON serialization.
+//#define DEBUG_SERIALIZATION
+
+namespace DataJS.Tests
+{
+ using System;
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Linq;
+ using System.Net;
+ using System.Runtime.Serialization;
+ using System.ServiceModel;
+ using System.ServiceModel.Activation;
+ using System.ServiceModel.Syndication;
+ using System.ServiceModel.Web;
+ using System.Xml;
+ using System.Xml.Linq;
+ using Microsoft.Spatial;
+ using Microsoft.OData.Core;
+ using System.Web.Script.Serialization;
+
+ /// <summary>
+ /// Oracle for the OData.read library function
+ /// </summary>
+ [ServiceContract]
+ [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
+ [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
+ public class ODataVerifyReader
+ {
+ const string jsonlightMediaType = "application/json";
+
+ /// <summary>
+ /// Reads a URI that will return a metadata object
+ /// </summary>
+ /// <param name="url">The URL to send the request to</param>
+ /// <returns>Stream of metadata in json light format</returns>
+ [OperationContract]
+ [WebGet]
+ public Stream ReadMetadata(string url)
+ {
+ WebResponse response = WebRequest.Create(ResolveUri(url, UriKind.Absolute)).GetResponse();
+ Dictionary<string, object> jsonObject = CsdlReader.ReadCsdl(new StreamReader(response.GetResponseStream()));
+ return ReaderUtils.ConvertDictionarytoJsonlightStream(jsonObject);
+ }
+
+ /// <summary>
+ /// Reads a URI that will get the Json response and return the stream
+ /// </summary>
+ /// <param name="url">URL of the entry</param>
+ /// <param name="user">The username for basic authentication</param>
+ /// <param name="password">The password for basic authentication</param>
+ /// <returns>Stream of the Json response expected to be returned by OData.read</returns>
+ [OperationContract]
+ [WebGet(ResponseFormat = WebMessageFormat.Json)]
+ public Stream ReadJson(string url, string mimeType, string user, string password)
+ {
+ if (mimeType == null)
+ {
+ mimeType = jsonlightMediaType + ";odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8";
+ }
+
+ HttpWebRequest request = (HttpWebRequest)ReaderUtils.CreateRequest(ResolveUri(url, UriKind.Absolute), user, password);
+ request.Accept = mimeType;
+ WebResponse response = request.GetResponse();
+
+ return response.GetResponseStream();
+ }
+
+ /// <summary>
+ /// Resolves the given url string to a URI
+ /// </summary>
+ /// <param name="url">The given URL string</param>
+ /// <param name="urlKind">URI kind to resolve to</param>
+ /// <returns>The resolved URI</returns>
+ private static string ResolveUri(string url, UriKind uriKind)
+ {
+ Uri resolvedUri = new Uri(url, UriKind.RelativeOrAbsolute);
+ if (!resolvedUri.IsAbsoluteUri)
+ {
+ // If the given URI is relative, then base it on the Referer URI
+ Uri baseUri = new Uri(WebOperationContext.Current.IncomingRequest.Headers["Referer"]);
+ resolvedUri = new Uri(baseUri, resolvedUri);
+ if (uriKind == UriKind.Relative)
+ {
+ resolvedUri = baseUri.MakeRelativeUri(resolvedUri);
+ }
+ }
+
+ return resolvedUri.ToString();
+ }
+ }
+}
\ No newline at end of file