Merge "Remove dead code from tests." into devel/master
[platform/core/uifw/dali-core.git] / automated-tests / src / dali-internal / utc-Dali-Internal-ResourceClient.cpp
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <iostream>
19
20 #include <stdlib.h>
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23 #include <test-native-image.h>
24
25 // Internal headers are allowed here
26 #include <dali/internal/event/common/thread-local-storage.h>
27 #include <dali/internal/update/resources/texture-metadata.h>
28 #include <dali/internal/update/resources/resource-manager.h>
29 #include <dali/internal/update/manager/update-manager.h>
30 #include <dali/internal/event/resources/resource-client.h>
31 #include <dali/internal/event/resources/resource-ticket.h>
32 #include <dali/internal/event/resources/image-ticket.h>
33 #include <dali/internal/event/resources/resource-ticket-observer.h>
34 #include <dali/internal/event/images/resource-image-impl.h>
35 #include <dali/integration-api/resource-cache.h>
36 #include <dali/internal/render/gl-resources/texture-declarations.h>
37 #include <dali/internal/render/shaders/scene-graph-shader.h>
38 #include <dali/internal/common/owner-pointer.h>
39 #include <dali/internal/common/image-attributes.h>
40
41 using namespace Dali;
42
43 #include <mesh-builder.h>
44
45 namespace
46 {
47
48 class TestTicketObserver : public Internal::ResourceTicketObserver
49 {
50 public:
51   TestTicketObserver()
52   : mLoadingFailedCalled(0), mLoadingSucceededCalled(0),
53     mUploadedCount(0)
54   {}
55
56   int LoadFailedCalled() {
57     tet_printf("TicketObserver: LoadingFailed() called %d times\n", mLoadingFailedCalled);
58     return mLoadingFailedCalled;
59   }
60   int LoadSucceededCalled() {
61     tet_printf("TicketObserver: LoadingSucceeded()  called %d times\n", mLoadingSucceededCalled);
62     return mLoadingSucceededCalled;
63   }
64   int  UploadCalled() {
65     tet_printf("TicketObserver: Uploaded() called %d times\n", mUploadedCount);
66     return mUploadedCount;
67   }
68   void Reset() {
69     mLoadingFailedCalled    = 0;
70     mLoadingSucceededCalled = 0;
71     mUploadedCount           = 0;
72   }
73
74 public: // From ResourceTicketObserver
75   virtual void ResourceLoadingFailed(const Internal::ResourceTicket& ticket) {mLoadingFailedCalled++;}
76   virtual void ResourceLoadingSucceeded(const Internal::ResourceTicket& ticket) {mLoadingSucceededCalled++;}
77   virtual void ResourceUploaded(const Internal::ResourceTicket& ticket) {mUploadedCount++;}
78
79 private:
80   int mLoadingFailedCalled;
81   int mLoadingSucceededCalled;
82   int mUploadedCount;
83 };
84
85 class TestTicketLifetimeObserver : public Internal::ResourceTicketLifetimeObserver
86 {
87 public:
88   TestTicketLifetimeObserver() : resourceTicketDiscarded(false) {}
89
90   virtual void ResourceTicketDiscarded( const Internal::ResourceTicket& ticket )
91   { resourceTicketDiscarded = true; }
92
93   void Reset() { resourceTicketDiscarded = false; }
94   bool resourceTicketDiscarded;
95 };
96
97 static TestTicketObserver testTicketObserver;
98 static TestTicketLifetimeObserver testTicketLifetimeObserver;
99
100 Internal::ResourceTicketPtr CheckLoadBitmap(TestApplication& application, const char* name, int w, int h)
101 {
102   Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
103   Integration::BitmapResourceType bitmapRequest;
104   Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, name );
105   ticket->AddObserver(testTicketObserver);
106   application.SendNotification(); // Flush update messages
107   application.Render();           // Process resource request
108   Integration::ResourceRequest*   req = application.GetPlatform().GetRequest();
109   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_RETAIN );
110   bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, w, h, w, h );
111   Integration::ResourcePointer resourcePtr(bitmap); // reference it
112   application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
113   application.Render();           // Process LoadComplete
114   application.SendNotification(); // Process event messages
115   DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingSucceeded );
116   application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
117   req=NULL;
118   application.GetPlatform().ResetTrace();
119
120   return ticket;
121 }
122
123 } //anonymous namespace
124
125
126 void utc_dali_internal_resource_client_startup()
127 {
128   test_return_value = TET_UNDEF;
129 }
130
131 void utc_dali_internal_resource_client_cleanup()
132 {
133   test_return_value = TET_PASS;
134 }
135
136 // Load a bitmap resource successfully, then discard it's ticket
137 int UtcDaliInternalRequestResourceBitmapRequests01(void)
138 {
139   TestApplication application; // Reset all test adapter return codes
140
141   tet_infoline("Testing bitmap requests");
142
143   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
144   Integration::BitmapResourceType bitmapRequest;
145   Internal::ResourceId id(0);
146
147   testTicketObserver.Reset();
148
149   {
150     Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
151     /************************************************************
152      * FUNCTION UNDER TEST
153      ***********************************************************/
154     Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
155     ticket->AddObserver(testTicketObserver);
156
157     // Update thread will request the bitmap resource:
158     // Sets application.GetPlatform().mRequest
159     application.SendNotification(); // Run flush update queue
160     application.Render(1);          // Process update messages
161     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
162
163     application.SendNotification(); // Send any event messages
164     DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
165     DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
166     DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoading );
167
168     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
169     DALI_TEST_CHECK( imageTicket );
170     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
171     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
172
173     // Create a resource
174     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
175     Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_RETAIN );
176     bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
177     Integration::ResourcePointer resourcePtr(bitmap); // reference it
178
179     // Set up platform abstraction to load it
180     id=req->GetId();
181     application.GetPlatform().SetResourceLoaded( id, Integration::ResourceBitmap, resourcePtr );
182
183     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(req->GetId()) );
184
185     // load the cache, which will immediately have the loaded resource
186     application.Render(0);
187
188     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
189
190     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(req->GetId()) );
191     Internal::TextureMetadata* bitmapData = NULL;
192     DALI_TEST_CHECK( resourceManager.GetTextureMetadata(req->GetId(), bitmapData ) );
193     DALI_TEST_CHECK( bitmapData->GetWidth() == 80 );
194     DALI_TEST_CHECK( bitmapData->GetHeight() == 80 );
195
196     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
197     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
198
199     // Trigger the event thread to process notify messages. Should then trigger the signals
200     // in the ticket observer
201     application.SendNotification();
202
203     DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingSucceeded );
204     DALI_TEST_EQUALS(testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
205
206     // Check that the image ticket was updated with the image attributes
207     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
208     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
209   } // Discard ticket
210
211   application.SendNotification(); // Flush update queue (with ticket discarded message
212   application.Render(1);          // Process update messages
213   application.SendNotification(); // Send event notifications
214   application.Render(1);          // Process update messages
215
216   // Resource should have been discarded.
217   DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::CancelLoadFunc ) );
218   DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
219
220   DALI_TEST_EQUALS(testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
221   DALI_TEST_EQUALS(testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
222   END_TEST;
223 }
224
225 // Starting Loading a bitmap resource, then discard it's ticket before loading complete.
226 int UtcDaliInternalRequestResourceBitmapRequests02(void)
227 {
228   TestApplication application; // Reset all test adapter return codes
229
230   tet_infoline("Testing bitmap request ticket discard before load complete");
231
232   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
233   Integration::BitmapResourceType bitmapRequest;
234   Internal::ResourceId id(0);
235
236   testTicketObserver.Reset();
237
238   {
239     Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
240     /************************************************************
241      * FUNCTION UNDER TEST
242      ***********************************************************/
243     Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
244     ticket->AddObserver(testTicketObserver);
245     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
246     DALI_TEST_CHECK( imageTicket );
247     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
248     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
249
250     // Update thread will request the bitmap resource:
251     // Sets application.GetPlatform().mRequest
252     application.SendNotification(); // Run flush update queue
253     application.Render(1);
254     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
255     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
256     id=req->GetId();
257
258     application.SendNotification(); // Should produce no messages
259     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 0, TEST_LOCATION );
260     DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
261
262     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
263
264     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
265     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
266     DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoading );
267
268   } // Discard ticket
269
270   // Ensure ticket discarded message is sent to update thread
271   application.SendNotification(); // Flush update queue
272   application.Render(0);          // Process update messages
273
274   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::CancelLoadFunc ) );
275   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
276
277   DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
278
279   // Trigger the event thread to process notify messages. Should then trigger the signals
280   // in the ticket observer
281   application.SendNotification();
282
283   DALI_TEST_EQUALS(testTicketObserver.LoadSucceededCalled(), 0, TEST_LOCATION );
284   DALI_TEST_EQUALS(testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
285   END_TEST;
286 }
287
288 // start loading a bitmap resource that doesn't exist, then discard it's ticket after failure
289 int UtcDaliInternalRequestResourceBitmapRequests03(void)
290 {
291   TestApplication application; // Reset all test adapter return codes
292
293   tet_infoline("Load bitmap that doesn't exist, followed by ticket discard. Expect LoadingFailed");
294
295   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
296   Integration::BitmapResourceType bitmapRequest;
297   Internal::ResourceId id(0);
298
299   testTicketObserver.Reset();
300   { // Scope lifetime of ticket
301     Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
302
303     /************************************************************
304      * FUNCTION UNDER TEST
305      ***********************************************************/
306     Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
307     ticket->AddObserver(testTicketObserver);
308     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
309     DALI_TEST_CHECK( imageTicket );
310     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
311     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
312
313     // Update thread will request the bitmap resource:
314     // Sets application.GetPlatform().mRequest
315     application.SendNotification(); // Run flush update queue
316     application.Render(1);          // process update messages
317     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
318     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
319     id=req->GetId();
320     application.SendNotification(); // Should produce no messages
321     DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
322     DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
323
324     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
325
326     application.GetPlatform().SetResourceLoadFailed(id, Integration::FailureFileNotFound );
327
328     application.Render(0); // Get failed result
329     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
330     application.SendNotification(); // send failed
331     DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() != 0 );
332     DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingFailed );
333
334     DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
335     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
336     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
337
338     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
339   } // Discard ticket
340
341   application.Render(0); // Send DiscardTicket
342   application.SendNotification();
343
344   DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
345   END_TEST;
346 }
347
348
349
350 // Load a bitmap resource successfully, then reload it
351 int UtcDaliInternalRequestReloadBitmapRequests01(void)
352 {
353   TestApplication application; // Reset all test adapter return codes
354
355   tet_infoline("Testing bitmap reload after successful load");
356
357   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
358   Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
359
360   Internal::ResourceId id(0);
361   testTicketObserver.Reset();
362
363   {
364     Internal::ResourceTicketPtr ticket = CheckLoadBitmap( application, "image.png", 80, 80 );
365     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
366     id = ticket->GetId();
367
368     // Reset call statistics - test that resource is reloaded
369     application.GetPlatform().ResetTrace();
370
371     /************************************************************
372      * FUNCTION UNDER TEST
373      ***********************************************************/
374     resourceClient.ReloadResource( ticket->GetId() );
375
376     DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
377     application.SendNotification(); // Flush update messages
378     application.Render(0);  // Process update messages
379     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
380     application.SendNotification(); // Process event messages
381
382     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoading, TEST_LOCATION );
383     DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
384     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
385     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
386
387     // Create a new resource - the image size could have changed in the meantime
388     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
389     Integration::Bitmap* bitmap2 = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_RETAIN );
390     bitmap2->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 120, 120, 120, 120 );
391     Integration::ResourcePointer resourcePtr2(bitmap2); // reference it
392     DALI_TEST_CHECK( req->GetId() == ticket->GetId() );
393     application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr2);
394
395     application.Render(0 , TEST_LOCATION );  // Process update messages / UpdateCache
396     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
397
398     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
399     Internal::TextureMetadata* bitmapData = NULL;
400     DALI_TEST_CHECK( resourceManager.GetTextureMetadata(req->GetId(), bitmapData ) );
401     DALI_TEST_CHECK( bitmapData->GetWidth() == 120 );
402     DALI_TEST_CHECK( bitmapData->GetHeight() == 120 );
403
404     // Ticket can't have been updated yet - it should still have old values
405     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
406     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
407
408     application.SendNotification(); // Process event messages
409     application.Render(0, TEST_LOCATION ); // Process update messages / UpdateCache
410     application.SendNotification(); // Process event messages
411
412     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION );
413     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 1, TEST_LOCATION );
414     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
415     DALI_TEST_EQUALS( imageTicket->GetWidth(), 120, TEST_LOCATION );
416     DALI_TEST_EQUALS( imageTicket->GetHeight(), 120, TEST_LOCATION );
417
418   } // Discard ticket
419
420   application.SendNotification(); // Flush update queue (with ticket discarded message
421   application.Render(1, TEST_LOCATION );          // Process update messages
422   application.SendNotification(); // Send event notifications
423
424   // Resource should have been discarded.
425   DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::CancelLoadFunc ) );
426   DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
427
428   DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION );
429   DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
430   DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 1, TEST_LOCATION );
431   END_TEST;
432 }
433
434
435 int UtcDaliInternalRequestReloadBitmapRequests02(void)
436 {
437   TestApplication application; // Reset all test adapter return codes
438
439   tet_infoline("Testing bitmap reload during first load");
440
441   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
442   Integration::BitmapResourceType bitmapRequest;
443   Internal::ResourceId id(0);
444
445   testTicketObserver.Reset();
446
447   {
448     Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
449     Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
450     ticket->AddObserver(testTicketObserver);
451
452     // Update thread will request the bitmap resource:
453     // Sets application.GetPlatform().mRequest
454     application.SendNotification(); // Run flush update queue
455     application.Render(1);          // Process update messages
456     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
457
458     application.SendNotification(); // Send any event messages
459     DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
460     DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
461
462     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
463     DALI_TEST_CHECK( imageTicket );
464     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
465     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
466
467
468     /************************************************************
469      * FUNCTION UNDER TEST
470      ***********************************************************/
471     resourceClient.ReloadResource( ticket->GetId() );
472     /************************************************************
473      * Expected result - current load completes as usual, no reload requested
474      ************************************************************/
475
476     application.SendNotification(); // Flush update methods
477
478     // Reset call statistics - test that resource is not reloaded
479     application.GetPlatform().ResetTrace();
480
481     application.Render(0); // Process reload message (nothing for UpdateCache yet)
482
483     DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
484     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
485     // Create a resource
486     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
487     Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_RETAIN );
488     bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
489     Integration::ResourcePointer resourcePtr(bitmap); // reference it
490
491     // Set up platform abstraction to load it
492     id=req->GetId();
493
494     application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr);
495
496     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
497
498     application.GetPlatform().ResetTrace();
499     // load the cache, which will immediately have the loaded resource
500     application.Render(0);
501     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
502     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
503     Internal::TextureMetadata* bitmapData = NULL;
504     DALI_TEST_CHECK( resourceManager.GetTextureMetadata(req->GetId(), bitmapData ) );
505     DALI_TEST_CHECK( bitmapData->GetWidth() == 80 );
506     DALI_TEST_CHECK( bitmapData->GetHeight() == 80 );
507
508     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
509     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
510
511     // Trigger the event thread to process notify messages. Should then trigger the signals
512     // in the ticket observer
513     application.SendNotification();
514
515     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
516     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
517     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
518
519     // Check that the image ticket was updated with the image attributes
520     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
521     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
522
523     DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
524
525     application.SendNotification(); // Flush update messages
526     application.Render(0);  // Process update messages
527
528     // There should be no reload
529     DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
530     application.SendNotification(); // Process event messages
531
532     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
533     DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
534     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
535     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
536
537     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
538     DALI_TEST_CHECK( resourceManager.GetTextureMetadata(req->GetId(), bitmapData ) );
539     DALI_TEST_CHECK( bitmapData->GetWidth() == 80 );
540     DALI_TEST_CHECK( bitmapData->GetHeight() == 80 );
541     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
542     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
543
544   } // Discard ticket
545   END_TEST;
546 }
547
548
549 int UtcDaliInternalRequestReloadBitmapRequests03(void)
550 {
551   TestApplication application; // Reset all test adapter return codes
552
553   tet_infoline("Testing bitmap reload at end of first load");
554
555   Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
556   Integration::BitmapResourceType bitmapRequest;
557   Internal::ResourceId id(0);
558
559   testTicketObserver.Reset();
560
561   {
562     Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
563     Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
564     ticket->AddObserver(testTicketObserver);
565
566     // Update thread will request the bitmap resource:
567     // Sets application.GetPlatform().mRequest
568     application.SendNotification(); // Run flush update queue
569     application.Render(1);          // Process update messages
570     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
571
572     application.SendNotification(); // Send any event messages
573     DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
574     DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
575
576     Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
577     DALI_TEST_CHECK( imageTicket );
578     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
579     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
580
581
582     /************************************************************
583      * FUNCTION UNDER TEST
584      ***********************************************************/
585     resourceClient.ReloadResource( ticket->GetId() );
586     /************************************************************
587      * Expected result - current load completes as usual, no reload requested
588      ************************************************************/
589
590     application.SendNotification(); // Flush update methods
591
592     // Reset call statistics - test that resource is not reloaded
593     application.GetPlatform().ResetTrace();
594
595     // Create a resource
596     Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
597     Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_RETAIN );
598     bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
599     Integration::ResourcePointer resourcePtr(bitmap); // reference it
600
601     // Set up platform abstraction to load it
602     id=req->GetId();
603
604     application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr);
605
606     DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
607
608     application.GetPlatform().ResetTrace();
609     // load the cache, which will immediately have the loaded resource
610     application.Render(0);
611
612     // UpdateCache runs before ProcessMessages, so the loading resource completes before
613     // the reload request is handled.
614     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
615     DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
616
617     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
618     Internal::TextureMetadata* bitmapData = NULL;
619     DALI_TEST_CHECK( resourceManager.GetTextureMetadata(req->GetId(), bitmapData ) );
620     DALI_TEST_CHECK( bitmapData->GetWidth() == 80 );
621     DALI_TEST_CHECK( bitmapData->GetHeight() == 80 );
622
623     DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
624     DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
625
626     // Trigger the event thread to process notify messages. Should then trigger the signals
627     // in the ticket observer
628     application.SendNotification();
629
630     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
631     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
632     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoading, TEST_LOCATION );
633
634     // Check that the image ticket was updated with the image attributes
635     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
636     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
637
638     DALI_TEST_EQUALS( resourceManager.ResourcesToProcess(), true, TEST_LOCATION );
639
640     // Create a new resource - the image size could have changed in the meantime
641     req = application.GetPlatform().GetRequest();
642     Integration::Bitmap* bitmap2 = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_RETAIN );
643     bitmap2->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 120, 120, 120, 120 );
644     Integration::ResourcePointer resourcePtr2(bitmap2); // reference it
645     DALI_TEST_CHECK( req->GetId() == id );
646     application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr2);
647
648     application.Render(0);  // Process update messages / UpdateCache
649
650     DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
651     DALI_TEST_CHECK( resourceManager.GetTextureMetadata(req->GetId(), bitmapData ) );
652     DALI_TEST_CHECK( bitmapData->GetWidth() == 120 );
653     DALI_TEST_CHECK( bitmapData->GetHeight() == 120 );
654     DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
655     DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
656
657     application.SendNotification(); // Process event messages
658
659     DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION );
660
661     // Not staged - no GL upload
662     DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
663
664     DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
665     DALI_TEST_EQUALS( imageTicket->GetWidth(), 120, TEST_LOCATION );
666     DALI_TEST_EQUALS( imageTicket->GetHeight(), 120, TEST_LOCATION );
667     DALI_TEST_EQUALS( resourceManager.ResourcesToProcess(), false, TEST_LOCATION );
668   }
669   END_TEST;
670 }
671
672 int UtcDaliInternalRequestResourceTicket01(void)
673 {
674   TestApplication application;
675   tet_infoline("Testing RequestResourceTicket() with valid id");
676
677   testTicketObserver.Reset();
678
679   Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
680
681   // First, load a bitmap resource
682   Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "bitmap.jpg", 80, 80);
683
684   Internal::ResourceTicketPtr newTicket = resourceClient.RequestResourceTicket( ticket->GetId() );
685   DALI_TEST_CHECK( newTicket );
686   DALI_TEST_CHECK( newTicket->GetId() == ticket->GetId() );
687   DALI_TEST_CHECK( newTicket->GetTypePath().type->id == ticket->GetTypePath().type->id );
688   END_TEST;
689 }
690
691 int UtcDaliInternalRequestResourceTicket02(void)
692 {
693   TestApplication application;
694   tet_infoline("Testing RequestResourceTicket() with invalid id");
695
696   testTicketObserver.Reset();
697
698   Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
699
700   // First, load a bitmap resource
701   Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "bitmap.jpg", 80, 80);
702
703   Internal::ResourceTicketPtr newTicket = resourceClient.RequestResourceTicket( ticket->GetId() + 2000 );
704   DALI_TEST_CHECK( ! newTicket );
705   END_TEST;
706 }
707
708 int UtcDaliInternalAddBitmapImage01(void)
709 {
710   TestApplication application;
711   tet_infoline("Testing AddBitmap with reserved buffer()");
712   testTicketObserver.Reset();
713   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
714   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS,  ResourcePolicy::OWNED_RETAIN  );
715   bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGB565, 80, 80, 80, 80 );
716
717   Internal::ImageTicketPtr imageTicket = resourceClient.AddBitmapImage( bitmap );
718   DALI_TEST_CHECK( imageTicket );
719   imageTicket->AddObserver( testTicketObserver );
720
721   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
722   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
723   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
724
725   application.SendNotification(); // Flush update queue
726   application.Render(0); // Process message
727   application.SendNotification(); // Send message to tickets
728
729   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
730   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
731   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
732   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
733   END_TEST;
734 }
735
736 int UtcDaliInternalAddBitmapImage02(void)
737 {
738   TestApplication application;
739   tet_infoline("Testing AddBitmap without reserved buffer()");
740   testTicketObserver.Reset();
741   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
742   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS,  ResourcePolicy::OWNED_RETAIN  );
743
744   Internal::ImageTicketPtr imageTicket = resourceClient.AddBitmapImage( bitmap );
745   DALI_TEST_CHECK( imageTicket );
746   imageTicket->AddObserver( testTicketObserver );
747
748   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
749   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 0, TEST_LOCATION );
750   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 0, TEST_LOCATION );
751   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
752
753   application.SendNotification(); // Flush update queue
754   application.Render(0); // Process message
755   application.SendNotification(); // Send message to tickets
756
757   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
758   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 0, TEST_LOCATION );
759   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 0, TEST_LOCATION );
760   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
761   END_TEST;
762 }
763
764
765 int UtcDaliInternalAddBitmapImage03(void)
766 {
767   TestApplication application;
768   tet_infoline("Testing AddBitmap() with invalid bitmap");
769   testTicketObserver.Reset();
770
771   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
772   Internal::ImageTicketPtr imageTicket;
773   bool exceptionRaised=false;
774   try
775   {
776     imageTicket = resourceClient.AddBitmapImage( NULL );
777   }
778   catch( DaliException& e )
779   {
780     exceptionRaised = true;
781   }
782   DALI_TEST_CHECK( exceptionRaised );
783   DALI_TEST_CHECK( ! imageTicket );
784   END_TEST;
785 }
786
787 int UtcDaliInternalAllocateTexture01(void)
788 {
789   TestApplication application;
790   tet_infoline("Testing AllocateTexture()");
791   testTicketObserver.Reset();
792
793   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
794   Internal::ResourceTicketPtr resourceTicket = resourceClient.AllocateTexture(80, 80, Pixel::L8 );
795   resourceTicket->AddObserver( testTicketObserver );
796
797   DALI_TEST_CHECK( resourceTicket );
798   DALI_TEST_EQUALS ( resourceTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
799   DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
800
801   application.SendNotification(); // Flush update queue
802   application.Render(0); // Process message
803   application.SendNotification(); // Send message to tickets
804
805   DALI_TEST_EQUALS ( resourceTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
806   DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
807   END_TEST;
808 }
809
810 int UtcDaliInternalAddNativeImage(void)
811 {
812   TestApplication application;
813   tet_infoline("Testing AddNativeImage()");
814
815   testTicketObserver.Reset();
816   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
817   Internal::ResourceTicketPtr ticket;
818   Internal::ImageTicketPtr imageTicket;
819   { // Test image going out of scope after ticket creation (message to Update thread holds a ref)
820     TestNativeImagePointer nativeImage = TestNativeImage::New( 80, 80 );
821     ticket = resourceClient.AddNativeImage( *nativeImage );
822     imageTicket = dynamic_cast<Internal::ImageTicket*>(ticket.Get());
823     DALI_TEST_CHECK( imageTicket );
824     imageTicket->AddObserver( testTicketObserver );
825   }
826
827   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
828   DALI_TEST_EQUALS ( imageTicket->GetWidth(),  80, TEST_LOCATION );
829   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
830   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
831
832   application.SendNotification(); // Flush update queue
833   application.Render(0); // Process message
834   application.SendNotification(); // Send message to tickets
835
836   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
837   DALI_TEST_EQUALS ( imageTicket->GetWidth(),  80, TEST_LOCATION );
838   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
839   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
840   END_TEST;
841 }
842
843 int UtcDaliInternalAddFrameBufferImage(void)
844 {
845   TestApplication application;
846   tet_infoline("Testing AddFrameBufferImage()");
847
848   testTicketObserver.Reset();
849   Internal::ResourceClient& resourceClient  = Internal::ThreadLocalStorage::Get().GetResourceClient();
850   Internal::ImageTicketPtr imageTicket = resourceClient.AddFrameBufferImage(80, 80, Pixel::A8, RenderBuffer::COLOR );
851   DALI_TEST_CHECK( imageTicket );
852   imageTicket->AddObserver( testTicketObserver );
853
854   DALI_TEST_EQUALS ( imageTicket->GetWidth(),  80, TEST_LOCATION );
855   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
856   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
857   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
858
859   application.SendNotification(); // Flush update queue
860   application.Render(0); // Process message
861   application.SendNotification(); // Send message to tickets
862
863   DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
864   DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
865   DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
866   DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
867   END_TEST;
868 }