GUI -- Created the RestService in the Remote module.
- implemented get() function (with unit tests).

Change-Id: I65edb5422ed3719d8bdc262e398673e0a1db3f0b
diff --git a/web/gui/src/main/webapp/app/fw/remote/remote.js b/web/gui/src/main/webapp/app/fw/remote/remote.js
new file mode 100644
index 0000000..b0f4848
--- /dev/null
+++ b/web/gui/src/main/webapp/app/fw/remote/remote.js
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed 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.
+ */
+
+/*
+ ONOS GUI -- Remote Communications Module
+
+ @author Bri Prebilic Cole
+ @author Simon Hunt
+ */
+(function () {
+    'use strict';
+
+    angular.module('onosRemote', ['onosUtil']);
+
+}());
diff --git a/web/gui/src/main/webapp/app/fw/remote/rest.js b/web/gui/src/main/webapp/app/fw/remote/rest.js
new file mode 100644
index 0000000..ceff93a
--- /dev/null
+++ b/web/gui/src/main/webapp/app/fw/remote/rest.js
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed 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.
+ */
+
+/*
+ ONOS GUI -- Remote Communications Module -- REST Service
+
+ @author Bri Prebilic Cole
+ @author Simon Hunt
+ */
+(function () {
+    'use strict';
+
+    var $log;
+
+    angular.module('onosRemote')
+        .factory('RestService', ['$log', '$http', function (_$log_, $http) {
+            $log = _$log_;
+
+            function get(url, callback) {
+                $http.get(url).then(function (response) {
+                    // success
+                    callback(response.data);
+                }, function (response) {
+                    // error
+                    $log.warn('Failed to retrieve JSON data: ' + url,
+                        response.status, response.data);
+                });
+            }
+
+            return {
+                get: get
+            };
+        }]);
+
+}());
diff --git a/web/gui/src/main/webapp/tests/app/fw/remote/rest-spec.js b/web/gui/src/main/webapp/tests/app/fw/remote/rest-spec.js
new file mode 100644
index 0000000..ecfcba7
--- /dev/null
+++ b/web/gui/src/main/webapp/tests/app/fw/remote/rest-spec.js
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed 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.
+ */
+
+/*
+ ONOS GUI -- Remote -- REST Service - Unit Tests
+
+ @author Bri Prebilic Cole
+ @author Simon Hunt
+ */
+describe('factory: fw/remote/rest.js', function() {
+    var $log, $httpBackend, fs, rs, promise;
+
+    beforeEach(module('onosUtil', 'onosRemote'));
+
+    beforeEach(inject(function (_$log_, _$httpBackend_, FnService, RestService) {
+        $log = _$log_;
+        $httpBackend = _$httpBackend_;
+        fs = FnService;
+        rs = RestService;
+    }));
+
+    it('should define RestService', function () {
+        expect(rs).toBeDefined();
+    });
+
+    it('should define api functions', function () {
+        expect(fs.areFunctions(rs, [
+            'get'
+        ])).toBeTruthy();
+    });
+
+    var mockData = {
+        id: 1,
+        prop: 'abc'
+    };
+
+    it('should fetch remote data', function () {
+        var called = 0,
+            capture = null;
+        $httpBackend.expectGET('/bar').respond(mockData);
+        spyOn($log, 'warn');
+
+        rs.get('/bar', function (data) {
+            called++;
+            capture = data;
+        });
+
+        expect(called).toEqual(0);
+        expect(capture).toBeNull();
+        $httpBackend.flush();
+        expect(called).toEqual(1);
+        expect(capture).toEqual(mockData);
+        expect($log.warn).not.toHaveBeenCalled();
+    });
+
+    it('should fail to fetch remote data', function () {
+        var called = 0,
+            capture = null;
+        $httpBackend.expectGET('/bar').respond(404, 'Not Found');
+        spyOn($log, 'warn');
+
+        rs.get('/bar', function (data) {
+            called++;
+            capture = data;
+        });
+
+        expect(called).toEqual(0);
+        expect(capture).toBeNull();
+        $httpBackend.flush();
+        expect(called).toEqual(0);
+        expect(capture).toBeNull();
+        expect($log.warn)
+            .toHaveBeenCalledWith('Failed to retrieve JSON data: /bar',
+                                    404, 'Not Found');
+    });
+
+});
diff --git a/web/gui/src/main/webapp/tests/karma.conf.js b/web/gui/src/main/webapp/tests/karma.conf.js
index 6f0628f..a08167a 100644
--- a/web/gui/src/main/webapp/tests/karma.conf.js
+++ b/web/gui/src/main/webapp/tests/karma.conf.js
@@ -29,6 +29,7 @@
         '../app/directives.js',
         '../app/fw/util/util.js',
         '../app/fw/svg/svg.js',
+        '../app/fw/remote/remote.js',
         // now load services etc. that augment the modules
         '../app/**/*.js',