Statistics
| Branch: | Tag: | Revision:

root / snf-app / synnefo / ui / static / snf / js / tests.js @ d5ba5588

History | View | Annotate | Download (17.2 kB)

1 00469232 Kostas Papadimitriou
// Copyright 2011 GRNET S.A. All rights reserved.
2 00469232 Kostas Papadimitriou
// 
3 00469232 Kostas Papadimitriou
// Redistribution and use in source and binary forms, with or
4 00469232 Kostas Papadimitriou
// without modification, are permitted provided that the following
5 00469232 Kostas Papadimitriou
// conditions are met:
6 00469232 Kostas Papadimitriou
// 
7 00469232 Kostas Papadimitriou
//   1. Redistributions of source code must retain the above
8 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
9 00469232 Kostas Papadimitriou
//      disclaimer.
10 00469232 Kostas Papadimitriou
// 
11 00469232 Kostas Papadimitriou
//   2. Redistributions in binary form must reproduce the above
12 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
13 00469232 Kostas Papadimitriou
//      disclaimer in the documentation and/or other materials
14 00469232 Kostas Papadimitriou
//      provided with the distribution.
15 00469232 Kostas Papadimitriou
// 
16 00469232 Kostas Papadimitriou
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 00469232 Kostas Papadimitriou
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 00469232 Kostas Papadimitriou
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 00469232 Kostas Papadimitriou
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 00469232 Kostas Papadimitriou
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 00469232 Kostas Papadimitriou
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 00469232 Kostas Papadimitriou
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 00469232 Kostas Papadimitriou
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 00469232 Kostas Papadimitriou
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 00469232 Kostas Papadimitriou
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 00469232 Kostas Papadimitriou
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 00469232 Kostas Papadimitriou
// POSSIBILITY OF SUCH DAMAGE.
28 00469232 Kostas Papadimitriou
// 
29 00469232 Kostas Papadimitriou
// The views and conclusions contained in the software and
30 00469232 Kostas Papadimitriou
// documentation are those of the authors and should not be
31 00469232 Kostas Papadimitriou
// interpreted as representing official policies, either expressed
32 00469232 Kostas Papadimitriou
// or implied, of GRNET S.A.
33 00469232 Kostas Papadimitriou
// 
34 00469232 Kostas Papadimitriou
35 8d08f18a Kostas Papadimitriou
$(document).ready(function(){
36 8d08f18a Kostas Papadimitriou
37 8d08f18a Kostas Papadimitriou
    // shortcuts
38 8d08f18a Kostas Papadimitriou
    snf = synnefo;
39 8d08f18a Kostas Papadimitriou
    models = snf.models;
40 8d08f18a Kostas Papadimitriou
    util = snf.utils;
41 8d08f18a Kostas Papadimitriou
    views = snf.views;
42 8d08f18a Kostas Papadimitriou
    bb = Backbone;
43 8d08f18a Kostas Papadimitriou
    vms = snf.storage.vms;
44 8d08f18a Kostas Papadimitriou
    nets = snf.storage.networks;
45 8d08f18a Kostas Papadimitriou
46 1a1bac97 Kostas Papadimitriou
    synnefo.config.api_urls = {
47 1a1bac97 Kostas Papadimitriou
        'compute': '/api/v1.1', 
48 1a1bac97 Kostas Papadimitriou
        'glance':'/images/v1.1'
49 1a1bac97 Kostas Papadimitriou
    };
50 1a1bac97 Kostas Papadimitriou
51 8d08f18a Kostas Papadimitriou
    module("VM Model")
52 8d08f18a Kostas Papadimitriou
53 8d08f18a Kostas Papadimitriou
    test("model change events", function(){
54 8d08f18a Kostas Papadimitriou
        expect(8);
55 8d08f18a Kostas Papadimitriou
56 8d08f18a Kostas Papadimitriou
        synnefo.storage.images.add({id:1,metadata:{values:{size:100}}});
57 8d08f18a Kostas Papadimitriou
        var v1 = new models.VM({'imageRef':1});
58 8d08f18a Kostas Papadimitriou
        v1.bind("change", function(){
59 8d08f18a Kostas Papadimitriou
            ok(1, "change event triggered")
60 8d08f18a Kostas Papadimitriou
            equals(v1.get("status"), "BUILD")
61 8d08f18a Kostas Papadimitriou
            equals(v1.get("state"), "BUILD_COPY")
62 8d08f18a Kostas Papadimitriou
        })
63 8d08f18a Kostas Papadimitriou
        v1.set({'status':'BUILD', 'progress':80, 'imageRef': 1});
64 8d08f18a Kostas Papadimitriou
        v1.unbind();
65 8d08f18a Kostas Papadimitriou
66 8d08f18a Kostas Papadimitriou
        v1.bind("change", function(){
67 8d08f18a Kostas Papadimitriou
            ok(1, "change event triggered")
68 8d08f18a Kostas Papadimitriou
            equals(v1.get("status"), "BUILD")
69 8d08f18a Kostas Papadimitriou
            equals(v1.get("state"), "DESTROY")
70 8d08f18a Kostas Papadimitriou
        })
71 8d08f18a Kostas Papadimitriou
        v1.set({'state':'DESTROY'});
72 8d08f18a Kostas Papadimitriou
        v1.unbind();
73 8d08f18a Kostas Papadimitriou
74 8d08f18a Kostas Papadimitriou
        v1.bind("change", function() {
75 8d08f18a Kostas Papadimitriou
            ok(1, "change event triggered")
76 8d08f18a Kostas Papadimitriou
            equals(v1.get("status"), "BUILD")
77 8d08f18a Kostas Papadimitriou
            equals(v1.get("state"), "BUILD_COPY")
78 8d08f18a Kostas Papadimitriou
        })
79 8d08f18a Kostas Papadimitriou
        v1.set({'status':'BUILD', 'progress':80, 'imageRef': 1});
80 8d08f18a Kostas Papadimitriou
        equals(v1.get("status"), "BUILD")
81 8d08f18a Kostas Papadimitriou
        equals(v1.get("state"), "DESTROY")
82 8d08f18a Kostas Papadimitriou
        v1.unbind();
83 8d08f18a Kostas Papadimitriou
    })
84 8d08f18a Kostas Papadimitriou
85 8d08f18a Kostas Papadimitriou
    test("model state transitions", function(){
86 8d08f18a Kostas Papadimitriou
        var vm = models.VM;
87 8d08f18a Kostas Papadimitriou
        
88 8d08f18a Kostas Papadimitriou
        var v1 = new vm();
89 8d08f18a Kostas Papadimitriou
        v1.set({status: 'BUILD_COPY'})
90 8d08f18a Kostas Papadimitriou
        equals(v1.get("state"), 'BUILD_COPY', "State is set");
91 8d08f18a Kostas Papadimitriou
        v1.set({status: 'DESTROY'})
92 8d08f18a Kostas Papadimitriou
        equals(v1.get("state"), 'DESTROY', "From buld to destroy");
93 8d08f18a Kostas Papadimitriou
        v1.set({status: 'BUILD'})
94 8d08f18a Kostas Papadimitriou
        equals(v1.get("state"), 'DESTROY', "Keep destroy state");
95 8d08f18a Kostas Papadimitriou
96 8d08f18a Kostas Papadimitriou
        v1 = new vm();
97 8d08f18a Kostas Papadimitriou
        v1.set({status: 'ACTIVE'})
98 8d08f18a Kostas Papadimitriou
        equals(v1.get("state"), 'ACTIVE', "State is set");
99 8d08f18a Kostas Papadimitriou
100 8d08f18a Kostas Papadimitriou
        v1.set({status: 'SHUTDOWN'})
101 8d08f18a Kostas Papadimitriou
        equals(v1.get("state"), 'SHUTDOWN', "From active to shutdown (should change)");
102 8d08f18a Kostas Papadimitriou
103 8d08f18a Kostas Papadimitriou
        v1.set({status: 'ACTIVE'})
104 8d08f18a Kostas Papadimitriou
        equals(v1.get("state"), 'SHUTDOWN', "From shutdown to active (should not change)");
105 8d08f18a Kostas Papadimitriou
        
106 8d08f18a Kostas Papadimitriou
        v1.set({status: 'STOPPED'})
107 8d08f18a Kostas Papadimitriou
        equals(v1.get("state"), 'STOPPED', "From shutdown to stopped (should change)");
108 8d08f18a Kostas Papadimitriou
109 8d08f18a Kostas Papadimitriou
        v1.set({status: 'ACTIVE'})
110 8d08f18a Kostas Papadimitriou
        equals(v1.get("state"), 'ACTIVE', "From stopped to active (should change)");
111 8d08f18a Kostas Papadimitriou
        v1.set({'status': 'STOPPED'})
112 8d08f18a Kostas Papadimitriou
        equals(v1.get('state'), 'STOPPED', "From shutdown to stopped should change");
113 8d08f18a Kostas Papadimitriou
114 8d08f18a Kostas Papadimitriou
        v1.set({'status': 'DESTROY'})
115 8d08f18a Kostas Papadimitriou
        equals(v1.get('state'), 'DESTROY', "From stopped to destory should set state to DESTROY");
116 8d08f18a Kostas Papadimitriou
        v1.set({'status': 'ACTIVE'})
117 8d08f18a Kostas Papadimitriou
        equals(v1.get('state'), 'DESTROY', "From destroy to active should keep state to DESTROY");
118 8d08f18a Kostas Papadimitriou
        v1.set({'status': 'REBOOT'})
119 8d08f18a Kostas Papadimitriou
        equals(v1.get('state'), 'DESTROY', "From destroy to active should keep state to DESTROY");
120 1420aae4 Kostas Papadimitriou
        v1.set({'status': 'DELETED'})
121 1420aae4 Kostas Papadimitriou
        equals(v1.get('state'), 'DELETED', "Destroy should be kept until DELETE or ERROR");
122 8d08f18a Kostas Papadimitriou
123 8d08f18a Kostas Papadimitriou
        v1 = new vm({status:'BUILD'});
124 8d08f18a Kostas Papadimitriou
        equals(v1.get('state'), 'BUILD', "new vm with build as initial status")
125 8d08f18a Kostas Papadimitriou
        equals(v1.get('status'), 'BUILD', "new vm with build as initial status")
126 8d08f18a Kostas Papadimitriou
        v1.set({status:'ACTIVE'})
127 8d08f18a Kostas Papadimitriou
        equals(v1.get('state'), 'ACTIVE', "active state has been set")
128 8d08f18a Kostas Papadimitriou
        equals(v1.get('status'), 'ACTIVE', "active status has been set")
129 8d08f18a Kostas Papadimitriou
    })
130 8d08f18a Kostas Papadimitriou
131 8d08f18a Kostas Papadimitriou
132 8d08f18a Kostas Papadimitriou
    test("building states", function(){
133 8d08f18a Kostas Papadimitriou
        synnefo.storage.images.add({id:1,metadata:{values:{size:100}}});
134 8d08f18a Kostas Papadimitriou
        var vm = models.VM;
135 8d08f18a Kostas Papadimitriou
        var v1 = new vm({'status':'BUILD','progress':0, 'imageRef':1});
136 8d08f18a Kostas Papadimitriou
        equals(v1.get('state'), 'BUILD_INIT', "progress 0 sets state to BUILD_INIT");
137 8d08f18a Kostas Papadimitriou
        equals(v1.get('status'), 'BUILD', "progress 0 sets status to BUILD");
138 8d08f18a Kostas Papadimitriou
        equals(v1.get('progress_message'), 'init', "message 'init'");
139 8d08f18a Kostas Papadimitriou
        v1.set({status:'BUILD', progress:50});
140 8d08f18a Kostas Papadimitriou
        equals(v1.get('state'), 'BUILD_COPY', "progress 50 sets state to BUILD_COPY");
141 8d08f18a Kostas Papadimitriou
        equals(v1.get('status'), 'BUILD', "progress 50 sets status to BUILD");
142 8d08f18a Kostas Papadimitriou
        equals(v1.get('progress_message'), '50.00 MB, 100.00 MB, 50', "message: 'final'");
143 8d08f18a Kostas Papadimitriou
        v1.set({status:'BUILD', progress:100});
144 8d08f18a Kostas Papadimitriou
        equals(v1.get('state'), 'BUILD_FINAL', "progress 100 sets state to BUILD_FINAL");
145 8d08f18a Kostas Papadimitriou
        equals(v1.get('status'), 'BUILD', "progress 100 sets status to BUILD");
146 8d08f18a Kostas Papadimitriou
        v1.set({status:'ACTIVE', progress:100});
147 8d08f18a Kostas Papadimitriou
        equals(v1.get('state'), 'ACTIVE', "ACTIVE set transition to ACTIVE");
148 8d08f18a Kostas Papadimitriou
        equals(v1.get('status'), 'ACTIVE', "ACTIVE set transition to ACTIVE");
149 8d08f18a Kostas Papadimitriou
        equals(v1.get('progress_message'), 'final', "message: 'final'");
150 8d08f18a Kostas Papadimitriou
    })
151 8d08f18a Kostas Papadimitriou
152 8d08f18a Kostas Papadimitriou
    test("active inactive states", function(){
153 8d08f18a Kostas Papadimitriou
    
154 8d08f18a Kostas Papadimitriou
        var vm = models.VM;
155 8d08f18a Kostas Papadimitriou
        var v1 = new vm();
156 8d08f18a Kostas Papadimitriou
        var v = {}
157 8d08f18a Kostas Papadimitriou
        var active = ['ACTIVE', 'BUILD', 'REBOOT'];
158 8d08f18a Kostas Papadimitriou
        for (v in active) {
159 8d08f18a Kostas Papadimitriou
            v = active[v];
160 8d08f18a Kostas Papadimitriou
            v1.set({status: v})
161 8d08f18a Kostas Papadimitriou
            equals(v1.is_active(), true, v + " status is active")
162 8d08f18a Kostas Papadimitriou
        }
163 8d08f18a Kostas Papadimitriou
        
164 8d08f18a Kostas Papadimitriou
        var v1 = new vm();
165 8d08f18a Kostas Papadimitriou
        var inactive = ['STOPPED', 'ERROR', 'UNKNOWN'];
166 8d08f18a Kostas Papadimitriou
        for (v in inactive) {
167 8d08f18a Kostas Papadimitriou
            v = inactive[v];
168 8d08f18a Kostas Papadimitriou
            v1.set({status: v})
169 8d08f18a Kostas Papadimitriou
            equals(v1.is_active(), false, v1.state() + " status is not active")
170 8d08f18a Kostas Papadimitriou
        }
171 8d08f18a Kostas Papadimitriou
    
172 8d08f18a Kostas Papadimitriou
    })
173 8d08f18a Kostas Papadimitriou
174 8d08f18a Kostas Papadimitriou
    test("transition event", function(){
175 8d08f18a Kostas Papadimitriou
        expect(9);
176 8d08f18a Kostas Papadimitriou
177 8d08f18a Kostas Papadimitriou
        var vm = new models.VM({status:'BUILD'});
178 8d08f18a Kostas Papadimitriou
        vm.bind("transition", function(data) {
179 8d08f18a Kostas Papadimitriou
            ok(true, "Transition triggered");
180 8d08f18a Kostas Papadimitriou
            equals(data.from, "BUILD")
181 8d08f18a Kostas Papadimitriou
            equals(data.to, "ACTIVE");
182 8d08f18a Kostas Papadimitriou
        })
183 8d08f18a Kostas Papadimitriou
        // trigger 1 time
184 8d08f18a Kostas Papadimitriou
        vm.set({status:'BUILD'});
185 8d08f18a Kostas Papadimitriou
        vm.set({status:'ACTIVE'});
186 8d08f18a Kostas Papadimitriou
        vm.unbind();
187 8d08f18a Kostas Papadimitriou
        
188 8d08f18a Kostas Papadimitriou
        // from build to active
189 8d08f18a Kostas Papadimitriou
        vm = new models.VM({status:'BUILD'});
190 8d08f18a Kostas Papadimitriou
        vm.bind("transition", function(data) {
191 8d08f18a Kostas Papadimitriou
            ok(true, "Transition triggered");
192 8d08f18a Kostas Papadimitriou
            equals(data.from, "BUILD")
193 8d08f18a Kostas Papadimitriou
            equals(data.to, "ACTIVE");
194 8d08f18a Kostas Papadimitriou
        })
195 8d08f18a Kostas Papadimitriou
        // trigger 1 time
196 8d08f18a Kostas Papadimitriou
        vm.set({status:'ACTIVE'});
197 8d08f18a Kostas Papadimitriou
        vm.unbind();
198 8d08f18a Kostas Papadimitriou
199 8d08f18a Kostas Papadimitriou
        // from active to shutdown
200 8d08f18a Kostas Papadimitriou
        vm = new models.VM({status:'SHUTDOWN'});
201 8d08f18a Kostas Papadimitriou
        vm.bind("transition", function(data) {
202 8d08f18a Kostas Papadimitriou
            ok(true, "Transition triggered");
203 8d08f18a Kostas Papadimitriou
            equals(data.from, "SHUTDOWN")
204 8d08f18a Kostas Papadimitriou
            equals(data.to, "STOPPED");
205 8d08f18a Kostas Papadimitriou
        })
206 8d08f18a Kostas Papadimitriou
        // trigger 1 time
207 8d08f18a Kostas Papadimitriou
        vm.set({status:'STOPPED'});
208 8d08f18a Kostas Papadimitriou
    })
209 8d08f18a Kostas Papadimitriou
    
210 8d08f18a Kostas Papadimitriou
    module("Collections");
211 8d08f18a Kostas Papadimitriou
        
212 8d08f18a Kostas Papadimitriou
    test("status model remove events", function(){
213 8d08f18a Kostas Papadimitriou
        vms.unbind();
214 8d08f18a Kostas Papadimitriou
        expect(1)
215 8d08f18a Kostas Papadimitriou
216 8d08f18a Kostas Papadimitriou
        vms.bind("change", function(){
217 8d08f18a Kostas Papadimitriou
            ok(-1, "change event should not get triggered");
218 8d08f18a Kostas Papadimitriou
        })
219 8d08f18a Kostas Papadimitriou
220 8d08f18a Kostas Papadimitriou
        vms.bind("remove", function(){
221 8d08f18a Kostas Papadimitriou
            ok(1, "remove event triggered")
222 8d08f18a Kostas Papadimitriou
        })
223 8d08f18a Kostas Papadimitriou
224 8d08f18a Kostas Papadimitriou
        var vm = new models.VM({id:1, status:"ACTIVE", name:"oldname"});
225 8d08f18a Kostas Papadimitriou
        vms.add(vm);
226 8d08f18a Kostas Papadimitriou
        
227 8d08f18a Kostas Papadimitriou
        // NO change/delete just DELETE event triggered
228 8d08f18a Kostas Papadimitriou
        vms.update([{id:1, status:"DELETED", name:"newname"}])
229 8d08f18a Kostas Papadimitriou
    });
230 8d08f18a Kostas Papadimitriou
231 8d08f18a Kostas Papadimitriou
    test("collection reset events", function() {
232 8d08f18a Kostas Papadimitriou
        expect(9);
233 8d08f18a Kostas Papadimitriou
234 8d08f18a Kostas Papadimitriou
        var testCollection = models.Collection.extend({
235 8d08f18a Kostas Papadimitriou
            url: '/testObject'
236 8d08f18a Kostas Papadimitriou
        });
237 8d08f18a Kostas Papadimitriou
        var collection = new testCollection();
238 8d08f18a Kostas Papadimitriou
239 8d08f18a Kostas Papadimitriou
        
240 8d08f18a Kostas Papadimitriou
        // reset on new entry after empty
241 8d08f18a Kostas Papadimitriou
        $.mockjax({
242 8d08f18a Kostas Papadimitriou
            url: '/testObject',
243 8d08f18a Kostas Papadimitriou
            responseTime: 50,
244 8d08f18a Kostas Papadimitriou
            responseText: [
245 8d08f18a Kostas Papadimitriou
                {id:1, attr1: 1, attr2: 2}
246 8d08f18a Kostas Papadimitriou
            ]
247 8d08f18a Kostas Papadimitriou
        }); 
248 8d08f18a Kostas Papadimitriou
        // THIS SHOULD NOT FIRE, since we force update method
249 8d08f18a Kostas Papadimitriou
        collection.bind("reset", function() {
250 8d08f18a Kostas Papadimitriou
            ok(1, "NOT EXPECTED: reset triggered on new entry while collection was empty");
251 8d08f18a Kostas Papadimitriou
        });
252 8d08f18a Kostas Papadimitriou
        collection.bind("add", function() {
253 8d08f18a Kostas Papadimitriou
            ok(1, "1: add triggered on new entry while collection was empty");
254 8d08f18a Kostas Papadimitriou
        });
255 8d08f18a Kostas Papadimitriou
        // THIS SHOULD NOT FIRE, model was added, not changed
256 8d08f18a Kostas Papadimitriou
        collection.bind("change", function() {
257 8d08f18a Kostas Papadimitriou
            ok(1, "NOT EXPECTED: change triggered on new entry while collection was empty");
258 8d08f18a Kostas Papadimitriou
        });
259 8d08f18a Kostas Papadimitriou
        collection.fetch({'async': false});
260 8d08f18a Kostas Papadimitriou
        equals(collection.length, 1, "2: collection contains 1 model");
261 8d08f18a Kostas Papadimitriou
        collection.unbind();
262 8d08f18a Kostas Papadimitriou
        $.mockjaxClear();
263 8d08f18a Kostas Papadimitriou
        
264 8d08f18a Kostas Papadimitriou
        // reset is called on change
265 8d08f18a Kostas Papadimitriou
        $.mockjax({
266 8d08f18a Kostas Papadimitriou
            url: '/testObject',
267 8d08f18a Kostas Papadimitriou
            responseTime: 50,
268 8d08f18a Kostas Papadimitriou
            responseText: [
269 8d08f18a Kostas Papadimitriou
                {id:1, attr1: 4, attr2: 2}
270 8d08f18a Kostas Papadimitriou
            ]
271 8d08f18a Kostas Papadimitriou
        });
272 8d08f18a Kostas Papadimitriou
        collection.bind("reset", function() {
273 8d08f18a Kostas Papadimitriou
            ok(1, "NOT EXPECTED: reset triggered on new entry while collection was empty");
274 8d08f18a Kostas Papadimitriou
        });
275 8d08f18a Kostas Papadimitriou
        collection.bind("add", function() {
276 8d08f18a Kostas Papadimitriou
            ok(1, "NOT EXPECTED: add triggered on new entry while collection was empty");
277 8d08f18a Kostas Papadimitriou
        });
278 8d08f18a Kostas Papadimitriou
        // THIS SHOULD NOT FIRE, model was added, not changed
279 8d08f18a Kostas Papadimitriou
        collection.bind("change", function() {
280 8d08f18a Kostas Papadimitriou
            ok(1, "3: change triggered on new entry while collection was empty");
281 8d08f18a Kostas Papadimitriou
        });
282 8d08f18a Kostas Papadimitriou
        collection.fetch({'async': false, refresh:true});
283 8d08f18a Kostas Papadimitriou
        equals(collection.length, 1, "4 collection contains 1 model");
284 8d08f18a Kostas Papadimitriou
        collection.unbind();
285 8d08f18a Kostas Papadimitriou
        $.mockjaxClear();
286 8d08f18a Kostas Papadimitriou
287 8d08f18a Kostas Papadimitriou
        // reset on second entry
288 8d08f18a Kostas Papadimitriou
        $.mockjax({
289 8d08f18a Kostas Papadimitriou
            url: '/testObject',
290 8d08f18a Kostas Papadimitriou
            responseTime: 50,
291 8d08f18a Kostas Papadimitriou
            responseText: [
292 8d08f18a Kostas Papadimitriou
                {id:1, attr1: 4, attr2: 2},
293 8d08f18a Kostas Papadimitriou
                {id:2, attr1: 1, attr2: 2}
294 8d08f18a Kostas Papadimitriou
            ]
295 8d08f18a Kostas Papadimitriou
        });
296 8d08f18a Kostas Papadimitriou
        collection.bind("reset", function() {
297 8d08f18a Kostas Papadimitriou
            ok(1, "NOT EXPECTED: reset triggered when new model arrived");
298 8d08f18a Kostas Papadimitriou
        })
299 8d08f18a Kostas Papadimitriou
        collection.bind("add", function() {
300 8d08f18a Kostas Papadimitriou
            ok(1, "5: add triggered when new model arrived");
301 8d08f18a Kostas Papadimitriou
        })
302 8d08f18a Kostas Papadimitriou
        collection.bind("change", function() {
303 8d08f18a Kostas Papadimitriou
            ok(1, "NOT EXPECTED: change triggered when new model arrived");
304 8d08f18a Kostas Papadimitriou
        }) 
305 8d08f18a Kostas Papadimitriou
        collection.fetch({async:false, refresh:true});
306 8d08f18a Kostas Papadimitriou
        equals(collection.length, 2, "6 new model added");
307 8d08f18a Kostas Papadimitriou
        collection.unbind();
308 8d08f18a Kostas Papadimitriou
        $.mockjaxClear();
309 8d08f18a Kostas Papadimitriou
        
310 8d08f18a Kostas Papadimitriou
        // reset does not remove
311 8d08f18a Kostas Papadimitriou
        $.mockjax({
312 8d08f18a Kostas Papadimitriou
            url: '/testObject',
313 8d08f18a Kostas Papadimitriou
            responseTime: 50,
314 8d08f18a Kostas Papadimitriou
            responseText: [
315 8d08f18a Kostas Papadimitriou
                {id:2, attr1: 1, attr2: 2}
316 8d08f18a Kostas Papadimitriou
            ]
317 8d08f18a Kostas Papadimitriou
        }); 
318 8d08f18a Kostas Papadimitriou
        collection.bind("reset", function() {
319 8d08f18a Kostas Papadimitriou
            ok(1, "NOT EXPECTED: reset triggered when model removed");
320 8d08f18a Kostas Papadimitriou
        })
321 8d08f18a Kostas Papadimitriou
        collection.bind("remove", function() {
322 8d08f18a Kostas Papadimitriou
            ok(1, "7: remove triggered when model removed");
323 8d08f18a Kostas Papadimitriou
        })
324 8d08f18a Kostas Papadimitriou
        collection.bind("change", function() {
325 8d08f18a Kostas Papadimitriou
            ok(1, "NOT EXPECTED: change triggered when model removed");
326 8d08f18a Kostas Papadimitriou
        })
327 8d08f18a Kostas Papadimitriou
328 8d08f18a Kostas Papadimitriou
        collection.fetch({async:false, refresh:true});
329 8d08f18a Kostas Papadimitriou
        equals(collection.length, 1, "8 one model removed");
330 8d08f18a Kostas Papadimitriou
        collection.unbind();
331 8d08f18a Kostas Papadimitriou
        $.mockjaxClear();
332 8d08f18a Kostas Papadimitriou
333 8d08f18a Kostas Papadimitriou
        // reset is not called on 304
334 8d08f18a Kostas Papadimitriou
        $.mockjax({
335 8d08f18a Kostas Papadimitriou
            url: '/testObject',
336 8d08f18a Kostas Papadimitriou
            responseTime: 50,
337 8d08f18a Kostas Papadimitriou
            status: 304,
338 8d08f18a Kostas Papadimitriou
            responseText: undefined
339 8d08f18a Kostas Papadimitriou
        }); 
340 8d08f18a Kostas Papadimitriou
        // NO event is triggered on 304
341 8d08f18a Kostas Papadimitriou
        collection.bind("reset", function() {
342 8d08f18a Kostas Papadimitriou
            ok(1, "WRONG: reset triggered on 304");
343 8d08f18a Kostas Papadimitriou
        });
344 8d08f18a Kostas Papadimitriou
        collection.bind("remove", function() {
345 8d08f18a Kostas Papadimitriou
            ok(1, "WRONG: remove triggered on 304");
346 8d08f18a Kostas Papadimitriou
        });
347 8d08f18a Kostas Papadimitriou
        collection.bind("change", function() {
348 8d08f18a Kostas Papadimitriou
            ok(1, "WRONG: remove triggered on 304");
349 8d08f18a Kostas Papadimitriou
        });
350 8d08f18a Kostas Papadimitriou
        collection.fetch({async:false, refresh:true});
351 8d08f18a Kostas Papadimitriou
        equals(collection.length, 1, "9 one model removed");
352 8d08f18a Kostas Papadimitriou
        collection.unbind();
353 8d08f18a Kostas Papadimitriou
        $.mockjaxClear();
354 8d08f18a Kostas Papadimitriou
    })
355 8d08f18a Kostas Papadimitriou
356 8d08f18a Kostas Papadimitriou
357 8d08f18a Kostas Papadimitriou
    module("network vm connections")
358 8d08f18a Kostas Papadimitriou
    test("network vm connections", function() {
359 8d08f18a Kostas Papadimitriou
360 8d08f18a Kostas Papadimitriou
        function _net(id, ip) {
361 8d08f18a Kostas Papadimitriou
            return {
362 8d08f18a Kostas Papadimitriou
                id: id,
363 8d08f18a Kostas Papadimitriou
                name: "net " + id,
364 8d08f18a Kostas Papadimitriou
                values:[{version:4, addr: ip}, {version:6, addr:ip}] 
365 8d08f18a Kostas Papadimitriou
            }
366 8d08f18a Kostas Papadimitriou
        }
367 8d08f18a Kostas Papadimitriou
        vms.add({id:1, name:"s1", linked_to_nets:[_net("p", "127")]});
368 8d08f18a Kostas Papadimitriou
        var vm = vms.at(0);
369 8d08f18a Kostas Papadimitriou
        
370 8d08f18a Kostas Papadimitriou
        nets.add({id:"p", nid:"p", name:"n1", linked_to:[1]});
371 8d08f18a Kostas Papadimitriou
        var n = nets.at(0);
372 8d08f18a Kostas Papadimitriou
    })
373 1420aae4 Kostas Papadimitriou
374 1420aae4 Kostas Papadimitriou
    module("images/flavors")
375 1420aae4 Kostas Papadimitriou
    test("Test DELETE state image retrieval", function() {
376 1420aae4 Kostas Papadimitriou
        snf.storage.images.reset();
377 1420aae4 Kostas Papadimitriou
        snf.storage.vms.reset();
378 1420aae4 Kostas Papadimitriou
379 1420aae4 Kostas Papadimitriou
        var images = snf.storage.images;
380 1420aae4 Kostas Papadimitriou
        var vms = snf.storage.vms;
381 1420aae4 Kostas Papadimitriou
382 1420aae4 Kostas Papadimitriou
        var img = images.add({name:"image 1", id:1}).last();
383 1420aae4 Kostas Papadimitriou
        var vm1 = vms.add({imageRef:1, name:"vm1"}).last();
384 1420aae4 Kostas Papadimitriou
        var vm2 = vms.add({imageRef:2, name:"vm2"}).last();
385 1420aae4 Kostas Papadimitriou
            
386 1420aae4 Kostas Papadimitriou
        equals(img, vm1.get_image());
387 1420aae4 Kostas Papadimitriou
        
388 1420aae4 Kostas Papadimitriou
        // reset is not called on 304
389 1420aae4 Kostas Papadimitriou
        $.mockjax({
390 1420aae4 Kostas Papadimitriou
            url: '/api/v1.1/images/2',
391 1420aae4 Kostas Papadimitriou
            responseTime: 50,
392 1420aae4 Kostas Papadimitriou
            status: 200,
393 1420aae4 Kostas Papadimitriou
            responseText: {image:{name:"image 2", id:2}}
394 1420aae4 Kostas Papadimitriou
        }); 
395 1420aae4 Kostas Papadimitriou
        
396 1420aae4 Kostas Papadimitriou
        
397 1420aae4 Kostas Papadimitriou
        equals(images.length, 1, "1 image exists");
398 1420aae4 Kostas Papadimitriou
        vm2.get_image();
399 1420aae4 Kostas Papadimitriou
        equals(images.get(2).get("name"), "image 2", "image data parsed");
400 1420aae4 Kostas Papadimitriou
        equals(images.length, 2);
401 1420aae4 Kostas Papadimitriou
    })
402 1420aae4 Kostas Papadimitriou
403 1420aae4 Kostas Papadimitriou
    test("Test DELETE state flavor retrieval", function() {
404 1420aae4 Kostas Papadimitriou
        snf.storage.flavors.reset();
405 1420aae4 Kostas Papadimitriou
        snf.storage.vms.reset();
406 1420aae4 Kostas Papadimitriou
407 1420aae4 Kostas Papadimitriou
        var flavors = snf.storage.flavors;
408 1420aae4 Kostas Papadimitriou
        var vms = snf.storage.vms;
409 1420aae4 Kostas Papadimitriou
410 1420aae4 Kostas Papadimitriou
        var flv = flavors.add({id:1, cpu:1, disk:1, ram:1024}).last();
411 1420aae4 Kostas Papadimitriou
        var vm1 = vms.add({flavorRef:1, name:"vm1"}).last();
412 1420aae4 Kostas Papadimitriou
        var vm2 = vms.add({flavorRef:2, name:"vm2"}).last();
413 1420aae4 Kostas Papadimitriou
            
414 1420aae4 Kostas Papadimitriou
        equals(flv, vm1.get_flavor());
415 1420aae4 Kostas Papadimitriou
        
416 1420aae4 Kostas Papadimitriou
        // reset is not called on 304
417 1420aae4 Kostas Papadimitriou
        $.mockjax({
418 1420aae4 Kostas Papadimitriou
            url: '/api/v1.1/flavors/2',
419 1420aae4 Kostas Papadimitriou
            responseTime: 50,
420 1420aae4 Kostas Papadimitriou
            status: 200,
421 1420aae4 Kostas Papadimitriou
            responseText: {flavor:{cpu:1, ram:2048, disk:100, id:2}}
422 1420aae4 Kostas Papadimitriou
        }); 
423 1420aae4 Kostas Papadimitriou
        
424 1420aae4 Kostas Papadimitriou
        
425 1420aae4 Kostas Papadimitriou
        equals(flavors.length, 1, "1 flavor exists");
426 1420aae4 Kostas Papadimitriou
        vm2.get_flavor();
427 1420aae4 Kostas Papadimitriou
        equals(flavors.get(2).get("ram"), 2048, "flavor data parsed");
428 1420aae4 Kostas Papadimitriou
        equals(flavors.length, 2);
429 1420aae4 Kostas Papadimitriou
    })
430 101e6604 Kostas Papadimitriou
431 101e6604 Kostas Papadimitriou
    test("actions list object", function(){
432 101e6604 Kostas Papadimitriou
        var m = new models.Image();
433 101e6604 Kostas Papadimitriou
        var l = new models.ParamsList(m, "actions");
434 101e6604 Kostas Papadimitriou
        var count = 0;
435 101e6604 Kostas Papadimitriou
436 101e6604 Kostas Papadimitriou
        l.add("destroy");
437 101e6604 Kostas Papadimitriou
        equals(l.has_action("destroy"), true);
438 101e6604 Kostas Papadimitriou
        equals(l.contains("destroy"), true);
439 101e6604 Kostas Papadimitriou
440 101e6604 Kostas Papadimitriou
        l.add("destroy", 1, {});
441 101e6604 Kostas Papadimitriou
        equals(l.has_action("destroy"), true);
442 101e6604 Kostas Papadimitriou
        equals(l.contains("destroy", 1, {}), true);
443 101e6604 Kostas Papadimitriou
444 101e6604 Kostas Papadimitriou
        l.remove("destroy", 1, {});
445 101e6604 Kostas Papadimitriou
        equals(l.contains("destroy", 1, {}), false);
446 101e6604 Kostas Papadimitriou
447 101e6604 Kostas Papadimitriou
        m.bind("change:actions", function() { count ++});
448 101e6604 Kostas Papadimitriou
        l.add("destroy");
449 101e6604 Kostas Papadimitriou
        
450 101e6604 Kostas Papadimitriou
        equals(count, 0);
451 101e6604 Kostas Papadimitriou
        l.add("destroy", 1, {});
452 101e6604 Kostas Papadimitriou
        equals(count, 1);
453 101e6604 Kostas Papadimitriou
    });
454 aeadb7bf Kostas Papadimitriou
455 aeadb7bf Kostas Papadimitriou
    module("update handlers")
456 aeadb7bf Kostas Papadimitriou
    test("update handlers", function() {
457 aeadb7bf Kostas Papadimitriou
        // this test is based on multiple timeouts
458 aeadb7bf Kostas Papadimitriou
        // so the results might differ between different browsers
459 aeadb7bf Kostas Papadimitriou
        // or browser load
460 aeadb7bf Kostas Papadimitriou
        stop();
461 aeadb7bf Kostas Papadimitriou
462 aeadb7bf Kostas Papadimitriou
        var counter = 0;
463 aeadb7bf Kostas Papadimitriou
        var cb = function() {
464 aeadb7bf Kostas Papadimitriou
            counter++;
465 aeadb7bf Kostas Papadimitriou
        }
466 aeadb7bf Kostas Papadimitriou
        
467 aeadb7bf Kostas Papadimitriou
        var opts = {
468 aeadb7bf Kostas Papadimitriou
            callback:cb,
469 aeadb7bf Kostas Papadimitriou
            interval: 10,
470 aeadb7bf Kostas Papadimitriou
            fast: 5,
471 aeadb7bf Kostas Papadimitriou
            increase: 5,
472 aeadb7bf Kostas Papadimitriou
            max: 15,
473 aeadb7bf Kostas Papadimitriou
            increase_after_calls: 3,
474 aeadb7bf Kostas Papadimitriou
            initial_call: false
475 aeadb7bf Kostas Papadimitriou
        }
476 aeadb7bf Kostas Papadimitriou
477 aeadb7bf Kostas Papadimitriou
        var h = new snf.api.updateHandler(opts);
478 aeadb7bf Kostas Papadimitriou
        h.start();
479 aeadb7bf Kostas Papadimitriou
480 aeadb7bf Kostas Papadimitriou
        var add = $.browser.msie ? 8 : 0;
481 aeadb7bf Kostas Papadimitriou
482 aeadb7bf Kostas Papadimitriou
        window.setTimeout(function(){
483 aeadb7bf Kostas Papadimitriou
            h.stop();
484 aeadb7bf Kostas Papadimitriou
            start();
485 aeadb7bf Kostas Papadimitriou
            // 4 calls, limit reached
486 aeadb7bf Kostas Papadimitriou
            equals(counter, 4, "normal calls");
487 aeadb7bf Kostas Papadimitriou
            equals(h.interval, opts.max, "limit reached");
488 aeadb7bf Kostas Papadimitriou
489 aeadb7bf Kostas Papadimitriou
            stop();
490 aeadb7bf Kostas Papadimitriou
            h.start(false);
491 aeadb7bf Kostas Papadimitriou
            h.faster();
492 aeadb7bf Kostas Papadimitriou
            window.setTimeout(function(){
493 aeadb7bf Kostas Papadimitriou
                // 11 calls, limit reached
494 aeadb7bf Kostas Papadimitriou
                start();
495 aeadb7bf Kostas Papadimitriou
                equals(counter, 11, "faster calls");
496 aeadb7bf Kostas Papadimitriou
                equals(h.interval, opts.max, "limit reached");
497 aeadb7bf Kostas Papadimitriou
                h.stop();
498 aeadb7bf Kostas Papadimitriou
                stop();
499 aeadb7bf Kostas Papadimitriou
                window.setTimeout(function(){
500 aeadb7bf Kostas Papadimitriou
                    // no additional calls because we stopped it
501 aeadb7bf Kostas Papadimitriou
                    start();
502 aeadb7bf Kostas Papadimitriou
                    equals(counter, 11, "no additional calls")
503 aeadb7bf Kostas Papadimitriou
                }, 50 + add)
504 aeadb7bf Kostas Papadimitriou
            }, 50 + add)
505 aeadb7bf Kostas Papadimitriou
        }, 43 + add)
506 aeadb7bf Kostas Papadimitriou
    })
507 8d08f18a Kostas Papadimitriou
})