Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "VolumeServiceTest.h"
7 #include "base/message_loop.h"
8 #include "nsCOMPtr.h"
9 #include "nsIObserver.h"
10 #include "nsIObserverService.h"
11 #include "nsServiceManagerUtils.h"
12 #include "nsThreadUtils.h"
13 #include "nsIVolume.h"
14 #include "nsIVolumeService.h"
15 #include "nsIVolumeStat.h"
16 #include "nsXULAppAPI.h"
18 #include "mozilla/Services.h"
20 #define VOLUME_MANAGER_LOG_TAG "VolumeServiceTest"
21 #include "VolumeManagerLog.h"
23 using namespace mozilla::services;
25 namespace mozilla {
26 namespace system {
28 #define TEST_NSVOLUME_OBSERVER 0
30 #if TEST_NSVOLUME_OBSERVER
32 /***************************************************************************
33 * A test class to verify that the Observer stuff is working properly.
34 */
35 class VolumeTestObserver : public nsIObserver
36 {
37 public:
38 NS_DECL_ISUPPORTS
39 NS_DECL_NSIOBSERVER
41 VolumeTestObserver()
42 {
43 nsCOMPtr<nsIObserverService> obs = GetObserverService();
44 if (!obs) {
45 return;
46 }
47 obs->AddObserver(this, NS_VOLUME_STATE_CHANGED, false);
48 }
49 ~VolumeTestObserver()
50 {
51 nsCOMPtr<nsIObserverService> obs = GetObserverService();
52 if (!obs) {
53 return;
54 }
55 obs->RemoveObserver(this, NS_VOLUME_STATE_CHANGED);
56 }
58 void LogVolume(nsIVolume* vol)
59 {
60 nsString volName;
61 nsString mountPoint;
62 int32_t volState;
64 vol->GetName(volName);
65 vol->GetMountPoint(mountPoint);
66 vol->GetState(&volState);
68 LOG(" Volume: %s MountPoint: %s State: %s",
69 NS_LossyConvertUTF16toASCII(volName).get(),
70 NS_LossyConvertUTF16toASCII(mountPoint).get(),
71 NS_VolumeStateStr(volState));
73 nsCOMPtr<nsIVolumeStat> stat;
74 nsresult rv = vol->GetStats(getter_AddRefs(stat));
75 if (NS_SUCCEEDED(rv)) {
76 int64_t totalBytes;
77 int64_t freeBytes;
79 stat->GetTotalBytes(&totalBytes);
80 stat->GetFreeBytes(&freeBytes);
82 LOG(" Total Space: %llu Mb Free Bytes: %llu Mb",
83 totalBytes / (1024LL * 1024LL), freeBytes / (1024LL * 1024LL));
84 }
85 else {
86 LOG(" Unable to retrieve stats");
87 }
88 }
89 };
90 static nsCOMPtr<VolumeTestObserver> sTestObserver;
92 NS_IMPL_ISUPPORTS(VolumeTestObserver, nsIObserver)
94 NS_IMETHODIMP
95 VolumeTestObserver::Observe(nsISupports* aSubject,
96 const char* aTopic,
97 const char16_t* aData)
98 {
99 LOG("TestObserver: topic: %s", aTopic);
101 if (strcmp(aTopic, NS_VOLUME_STATE_CHANGED) != 0) {
102 return NS_OK;
103 }
104 nsCOMPtr<nsIVolume> vol = do_QueryInterface(aSubject);
105 if (vol) {
106 LogVolume(vol);
107 }
109 // Since this observe method was called then we know that the service
110 // has been initialized so we can do the VolumeService tests.
112 nsCOMPtr<nsIVolumeService> vs = do_GetService(NS_VOLUMESERVICE_CONTRACTID);
113 if (!vs) {
114 ERR("do_GetService('%s') failed", NS_VOLUMESERVICE_CONTRACTID);
115 return NS_ERROR_FAILURE;
116 }
118 nsresult rv = vs->GetVolumeByName(NS_LITERAL_STRING("sdcard"), getter_AddRefs(vol));
119 if (NS_SUCCEEDED(rv)) {
120 LOG("GetVolumeByName( 'sdcard' ) succeeded (expected)");
121 LogVolume(vol);
122 } else {
123 ERR("GetVolumeByName( 'sdcard' ) failed (unexpected)");
124 }
126 rv = vs->GetVolumeByName(NS_LITERAL_STRING("foo"), getter_AddRefs(vol));
127 if (NS_SUCCEEDED(rv)) {
128 ERR("GetVolumeByName( 'foo' ) succeeded (unexpected)");
129 } else {
130 LOG("GetVolumeByName( 'foo' ) failed (expected)");
131 }
133 rv = vs->GetVolumeByPath(NS_LITERAL_STRING("/mnt/sdcard"), getter_AddRefs(vol));
134 if (NS_SUCCEEDED(rv)) {
135 LOG("GetVolumeByPath( '/mnt/sdcard' ) succeeded (expected)");
136 LogVolume(vol);
137 } else {
138 ERR("GetVolumeByPath( '/mnt/sdcard' ) failed (unexpected");
139 }
141 rv = vs->GetVolumeByPath(NS_LITERAL_STRING("/mnt/sdcard/foo"), getter_AddRefs(vol));
142 if (NS_SUCCEEDED(rv)) {
143 LOG("GetVolumeByPath( '/mnt/sdcard/foo' ) succeeded (expected)");
144 LogVolume(vol);
145 } else {
146 LOG("GetVolumeByPath( '/mnt/sdcard/foo' ) failed (unexpected)");
147 }
149 rv = vs->GetVolumeByPath(NS_LITERAL_STRING("/mnt/sdcardfoo"), getter_AddRefs(vol));
150 if (NS_SUCCEEDED(rv)) {
151 ERR("GetVolumeByPath( '/mnt/sdcardfoo' ) succeeded (unexpected)");
152 } else {
153 LOG("GetVolumeByPath( '/mnt/sdcardfoo' ) failed (expected)");
154 }
156 return NS_OK;
157 }
159 class InitVolumeServiceTestIO : public nsRunnable
160 {
161 public:
162 NS_IMETHOD Run()
163 {
164 MOZ_ASSERT(NS_IsMainThread());
166 DBG("InitVolumeServiceTest called");
167 nsCOMPtr<nsIVolumeService> vs = do_GetService(NS_VOLUMESERVICE_CONTRACTID);
168 if (!vs) {
169 ERR("do_GetService('%s') failed", NS_VOLUMESERVICE_CONTRACTID);
170 return NS_ERROR_FAILURE;
171 }
172 sTestObserver = new VolumeTestObserver();
174 return NS_OK;
175 }
176 };
177 #endif // TEST_NSVOLUME_OBSERVER
179 void
180 InitVolumeServiceTestIOThread()
181 {
182 MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop());
184 #if TEST_NSVOLUME_OBSERVER
185 // Now that the volume manager is initialized we can go
186 // ahead and do our test (on main thread).
187 NS_DispatchToMainThread(new InitVolumeServiceTestIO());
188 #endif
189 }
191 void
192 ShutdownVolumeServiceTest()
193 {
194 #if TEST_NSVOLUME_OBSERVER
195 DBG("ShutdownVolumeServiceTestIOThread called");
196 sTestObserver = nullptr;
197 #endif
198 }
200 } // system
201 } // mozilla