1 # Do not create provides from emulator .so files because the main package
2 # should anchor any reverse-dependencies
3 %global __provides_exclude_from ^(.*\\.emulator)$
6 %define _dumpdir /opt/etc/dump.d/module.d
7 %define _varlibdir /opt/var/lib
8 %define _meshdir /opt/usr/mesh
11 Summary: Bluetooth framework for BlueZ and Obexd. This package is Bluetooth framework based on BlueZ and Obexd stack.
14 Group: Network & Connectivity/Bluetooth
16 Source0: %{name}-%{version}.tar.gz
17 Source1001: bluetooth-frwk.manifest
19 Requires: bluetooth-tools
21 %define bt_bluez_hal ENABLED
22 %define bt_gatt_client_fd ENABLED
23 %define bt_permanent_log DISABLED
24 %define bt_http_proxy DISABLED
25 %define bt_factory_mode DISABLED
26 %define bt_vendor_operation DISABLED
28 BuildRequires: pkgconfig(aul)
29 %if %{bt_factory_mode} == ENABLED
30 BuildRequires: pkgconfig(bincfg)
32 BuildRequires: pkgconfig(dlog)
33 BuildRequires: pkgconfig(glib-2.0)
34 BuildRequires: pkgconfig(gio-2.0)
35 BuildRequires: pkgconfig(gio-unix-2.0)
36 BuildRequires: pkgconfig(syspopup-caller)
37 BuildRequires: pkgconfig(vconf)
38 BuildRequires: pkgconfig(libxml-2.0)
39 BuildRequires: pkgconfig(capi-network-connection)
40 BuildRequires: pkgconfig(alarm-service)
41 BuildRequires: pkgconfig(capi-content-mime-type)
42 BuildRequires: pkgconfig(eventsystem)
43 %if %{bt_http_proxy} == ENABLED
44 BuildRequires: pkgconfig(libsoup-2.4)
46 BuildRequires: pkgconfig(capi-network-tethering)
48 BuildRequires: pkgconfig(cynara-client)
49 BuildRequires: pkgconfig(cynara-creds-gdbus)
50 BuildRequires: pkgconfig(libtzplatform-config)
51 BuildRequires: pkgconfig(json-c)
52 BuildRequires: pkgconfig(ell)
53 BuildRequires: pkgconfig(storage)
54 BuildRequires: pkgconfig(capi-system-info)
55 BuildRequires: pkgconfig(capi-appfw-app-control)
56 BuildRequires: pkgconfig(gmock)
57 BuildRequires: pkgconfig(libactd)
58 BuildRequires: pkgconfig(libsystemd-daemon)
60 Requires(post): /usr/bin/vconftool
61 Requires(post): /sbin/ldconfig
62 Requires(postun): /sbin/ldconfig
65 Bluetooth framework for BlueZ and Obexd. This package is Bluetooth framework based on BlueZ and Obexd stack.
66 This package contains API set for BT GAP, BT SDP, BT RFCOMM and BLE Mesh.
68 %package profile_common
69 Summary: bluetooth-frwk service and conf files for common profile
70 Requires: %{name} = %{version}-%{release}
71 Conflicts: %{name}-profile_mobile
72 Conflicts: %{name}-profile_wearable
73 Conflicts: %{name}-profile_tv
74 Conflicts: %{name}-profile_ivi
75 %description profile_common
76 Bluetooth framework configuration and service files for Tizen common profile
78 %package profile_mobile
79 Summary: bluetooth-frwk service and conf files for mobile profile
80 Requires: %{name} = %{version}-%{release}
81 Conflicts: %{name}-profile_common
82 Conflicts: %{name}-profile_wearable
83 Conflicts: %{name}-profile_tv
84 Conflicts: %{name}-profile_ivi
85 %description profile_mobile
86 Bluetooth framework configuration and service files for Tizen mobile profile
89 %ifarch %{ix86} || %{arm}
90 %package extension-TM1
91 Summary: bluetooth-frwk service and conf files for mobile TM1
92 Requires: %{name}-profile_mobile = %{version}-%{release}
93 %description extension-TM1
94 Bluetooth framework configuration and service files for Tizen mobile TM1
97 %package profile_wearable
98 Summary: bluetooth-frwk service and conf files for wearable profile
99 Requires: %{name} = %{version}-%{release}
100 Conflicts: %{name}-profile_mobile
101 Conflicts: %{name}-profile_common
102 Conflicts: %{name}-profile_tv
103 Conflicts: %{name}-profile_ivi
104 %description profile_wearable
105 Bluetooth framework configuration and service files for Tizen wearable profile
108 Summary: bluetooth-frwk service and conf files for tv profile
109 Requires: %{name} = %{version}-%{release}
110 Conflicts: %{name}-profile_mobile
111 Conflicts: %{name}-profile_wearable
112 Conflicts: %{name}-profile_common
113 Conflicts: %{name}-profile_ivi
114 %description profile_tv
115 Bluetooth framework configuration and service files for Tizen tv profile
118 Summary: bluetooth-frwk service and conf files for ivi profile
119 Requires: %{name} = %{version}-%{release}
120 Conflicts: %{name}-profile_mobile
121 Conflicts: %{name}-profile_wearable
122 Conflicts: %{name}-profile_tv
123 Conflicts: %{name}-profile_common
124 %description profile_ivi
125 Bluetooth framework configuration and service files for Tizen ivi profile
127 %ifarch %{ix86} x86_64
128 %package extension-emulator
129 Summary: bluetooth-frwk service and conf files for emulator
130 Requires: %{name} = %{version}-%{release}
131 %description extension-emulator
132 bluetooth-frwk service and conf files for emulator
133 %endif // ifarch %{ix86} x86_64
136 Summary: Bluetooth framework for BlueZ and Obexd
137 Group: Development/Libraries
138 Requires: %{name} = %{version}-%{release}
141 This package is development files for Bluetooth framework based on BlueZ and Obexd stack.
142 This package contains API set for BT GAP, BT SDP, and BT RFCOMM.
145 Summary: Bluetooth Service daemon
146 Group: Network & Connectivity/Bluetooth
147 Requires: %{name} = %{version}-%{release}
150 This package is Bluetooth Service daemon to manage BT services.
152 %if %{bt_http_proxy} == ENABLED
154 Summary: Bluetooth HTTP Proxy Service daemon
155 Group: Network & Connectivity/Bluetooth
156 Requires: %{name} = %{version}-%{release}
158 %description httpproxy
159 This package is Bluetooth HTTP Proxy Service daemon
163 Summary: Bluetooth OTP Service daemon
164 Group: Network & Connectivity/Bluetooth
165 Requires: %{name} = %{version}-%{release}
168 This package is Bluetooth OTP Service daemon
171 Summary: Bluetooth Core daemon
172 Group: Network & Connectivity/Bluetooth
173 Requires: %{name} = %{version}-%{release}
176 This package is Bluetooth core daemon to manage activation / deactivation.
179 Summary: Bluetooth test application
180 Group: Network & Connectivity/Bluetooth
181 Requires: %{name} = %{version}-%{release}
184 This package is Bluetooth test application.
187 Summary: Bluetooth OAL
188 Group: Network & Connectivity/Bluetooth
189 Requires: %{name} = %{version}-%{release}
192 This package is BT stack common interface.
194 %package plugin-headed
195 Summary: Bluetooth plugin Headed
196 Group: Network & Connectivity/Bluetooth
197 Requires: %{name} = %{version}-%{release}
199 %description plugin-headed
200 This package is Bluetooth plugin to manage UI and syspopup
202 %package -n bluetooth-haltests
203 Summary: HAL Test package for bluetooth OAL
205 Requires: %{name} = %{version}-%{release}
207 %description -n bluetooth-haltests
208 This package is C-API test application.
216 export CFLAGS="$CFLAGS -DTIZEN_DEBUG_ENABLE"
217 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_BT_OBEX"
218 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_BT_PAN_NAP"
219 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_BT_IPSP"
220 export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE"
221 export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE"
223 %define _servicefile packaging/bluetooth-frwk-common.service
224 %define _servicedir starter.target.wants
226 %if "%{?profile}" == "mobile"
227 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_NETWORK_TETHERING_ENABLE -DTIZEN_FEATURE_FLIGHTMODE_ENABLED -DTIZEN_PROFILE_MOBILE -DTIZEN_FEATURE_TELEPHONY_ENABLED"
228 %if "%{?tizen_target_name}" == "TM1"
229 %define _servicefile packaging/bluetooth-frwk-mobile-sprd.service
231 %define _servicefile packaging/bluetooth-frwk-mobile.service
233 %define _servicedir multi-user.target.wants
236 %if "%{?profile}" == "wearable"
237 export CFLAGS="$CFLAGS -DTIZEN_PROFILE_WEARABLE -DTIZEN_FEATURE_FLIGHTMODE_ENABLED"
238 %define _servicefile packaging/bluetooth-frwk-wearable.service
239 %define _servicedir multi-user.target.wants
242 %if "%{?profile}" == "tv"
243 export CFLAGS="$CFLAGS -DUSB_BLUETOOTH -DTIZEN_TV -DAUTO_ACCEPT"
244 %define _servicefile packaging/bluetooth-frwk-tv.service
245 %define _servicedir multi-user.target.wants
248 %if "%{?profile}" == "ivi"
249 export CFLAGS="$CFLAGS -DTIZEN_PROFILE_IVI"
250 %define _servicefile packaging/bluetooth-frwk-wearable.service
251 %define _servicedir multi-user.target.wants
255 #export CFLAGS="$CFLAGS -Wall -g -fvisibility=hidden -fPIC"
256 export CFLAGS="$CFLAGS -fpie"
257 export CFLAGS+=" -DARCH64"
258 export CXXFLAGS+=" -DARCH64"
259 export FFLAGS+=" -DARCH64"
261 export CFLAGS="$CFLAGS -fpie"
262 export LDFLAGS="$CFLAGS -pie"
265 %if %{bt_bluez_hal} == ENABLED
266 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_BT_RFCOMM_DIRECT -DTIZEN_BT_HAL"
268 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_BT_RFCOMM_DIRECT"
270 export LDFLAGS="$CFLAGS -Wl,--rpath=%{_libdir} -Wl,--as-needed -Wl,--unresolved-symbols=ignore-in-shared-libs"
272 %if %{bt_gatt_client_fd} == DISABLED
273 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_BT_GATT_CLIENT_FD_DISABLE"
276 %if %{bt_permanent_log} == ENABLED
277 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_BT_PERMANENT_LOG"
280 %if %{bt_http_proxy} == ENABLED
281 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_BT_HTTP_PROXY"
284 %if %{bt_factory_mode} == ENABLED
285 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_BT_FACTORY_MODE"
288 %if %{bt_vendor_operation} == ENABLED
289 export CFLAGS="$CFLAGS -DTIZEN_FEATURE_BT_VENDOR_OPERATION"
292 %if %{bt_bluez_hal} == ENABLED
293 export BT_INCLUDE_OAL_BLUEZ=ENABLED
294 export CFLAGS="$CFLAGS -DTIZEN_BT_INCLUDE_OAL_BLUEZ"
296 export BT_INCLUDE_OAL_BLUEZ=DISABLED
299 export CFLAGS_DEFAULT="$CFLAGS"
300 export CXXFLAGS_DEFAULT="$CXXFLAGS"
301 export FFLAGS_DEFAULT="$FFLAGS"
304 %ifarch %{ix86} || %{arm}
306 export CFLAGS="$CFLAGS_DEFAULT -DTIZEN_FEATURE_BT_RFCOMM_DIRECT"
307 export CXXFLAGS="$CXXFLAGS_DEFAULT -DTIZEN_FEATURE_BT_RFCOMM_DIRECT"
308 export FFLAGS="$FFLAGS_DEFAULT -DTIZEN_FEATURE_BT_RFCOMM_DIRECT"
310 cmake . -DCMAKE_INSTALL_PREFIX=/usr \
311 -DCMAKE_LIB_DIR=%{_libdir} \
312 -DTZ_SYS_USER_GROUP=%TZ_SYS_USER_GROUP \
313 -DTZ_SYS_DEFAULT_USER=%TZ_SYS_DEFAULT_USER \
314 -DLIBNOTIFY_SUPPORT=Off \
315 -DLIBNOTIFICATION_SUPPORT=Off
321 cp %{buildroot}%{_bindir}/bt-core tm1/bt-core.tm1
325 %ifarch %{ix86} x86_64
326 export CFLAGS="${CFLAGS} -DTIZEN_FEATURE_BT_RFCOMM_DIRECT"
327 export CXXFLAGS="${CXXFLAGS} -DTIZEN_FEATURE_BT_RFCOMM_DIRECT"
328 export FFLAGS="${FFLAGS} -DTIZEN_FEATURE_BT_RFCOMM_DIRECT"
330 mkdir -p build_emulator
332 cmake . -DCMAKE_INSTALL_PREFIX=/usr \
333 -DCMAKE_LIB_DIR=%{_libdir} \
334 -DTZ_SYS_USER_GROUP=%TZ_SYS_USER_GROUP \
335 -DTZ_SYS_DEFAULT_USER=%TZ_SYS_DEFAULT_USER \
336 -DLIBNOTIFY_SUPPORT=Off \
337 -DLIBNOTIFICATION_SUPPORT=Off
343 cp %{buildroot}%{_libdir}/libbluetooth-api.so* build_emulator/
344 pushd build_emulator/
345 for FILE in libbluetooth-api.so*; do mv "${FILE}" "${FILE}.emulator"; done
349 # non-extension-TM1 / non-extension-emulator
351 export CFLAGS="$CFLAGS_DEFAULT -DTIZEN_FEATURE_BT_RFCOMM_DIRECT"
352 export CXXFLAGS="$CXXFLAGS_DEFAULT -DTIZEN_FEATURE_BT_RFCOMM_DIRECT"
353 export FFLAGS="$FFLAGS_DEFAULT -DTIZEN_FEATURE_BT_RFCOMM_DIRECT"
357 export CFLAGS+=" -DARCH64"
358 export CXXFLAGS+=" -DARCH64"
359 export FFLAGS+=" -DARCH64"
362 cmake . -DCMAKE_INSTALL_PREFIX=/usr \
363 -DCMAKE_LIB_DIR=%{_libdir} \
364 -DTZ_SYS_USER_GROUP=%TZ_SYS_USER_GROUP \
365 -DTZ_SYS_DEFAULT_USER=%TZ_SYS_DEFAULT_USER \
366 -DLIBNOTIFY_SUPPORT=Off \
367 -DLIBNOTIFICATION_SUPPORT=Off
376 mkdir -p %{buildroot}%{_unitdir}/starter.target.wants
377 mkdir -p %{buildroot}%{_unitdir}/delayed.target.wants
378 mkdir -p %{buildroot}%{_unitdir}/multi-user.target.wants
379 mkdir -p %{buildroot}/%{_prefix}/lib/udev/rules.d
380 mkdir -p %{buildroot}%{_meshdir}
382 cp packaging/99-bluetooth-rfkill.rules %{buildroot}/%{_prefix}/lib/udev/rules.d/99-bluetooth-rfkill.rules
385 %ifarch %{ix86} x86_64
386 cp build_emulator/libbluetooth-api.so*.emulator %{buildroot}%{_libdir}/
387 #mv %{buildroot}/%{_bindir}/bt-service-emul %{buildroot}/%{_bindir}/bt-service
390 # Rename the postfix (.mobile, .tv, ..) at post script
392 install -m 0644 packaging/bluetooth-frwk-mobile.service %{buildroot}%{_unitdir}/bluetooth-frwk.service.mobile
395 %ifarch %{ix86} || %{arm}
396 cp tm1/bt-core.tm1 %{buildroot}%{_bindir}/
397 install -m 0644 packaging/bluetooth-frwk-mobile-sprd.service %{buildroot}%{_unitdir}/bluetooth-frwk.service.tm1
401 install -m 0644 packaging/bluetooth-frwk-wearable.service %{buildroot}%{_unitdir}/bluetooth-frwk.service.wearable
402 # On IVI bt-service needs to be run as 'app' even if there is a 'guest' user.
403 cp %{buildroot}%{_datadir}/dbus-1/system-services/org.projectx.bt.service %{buildroot}%{_datadir}/dbus-1/system-services/org.projectx.bt.service.ivi
404 sed -i 's/%TZ_SYS_DEFAULT_USER/app/' %{buildroot}%{_datadir}/dbus-1/system-services/org.projectx.bt.service.ivi
407 install -m 0644 packaging/bluetooth-frwk-tv.service %{buildroot}%{_unitdir}/bluetooth-frwk.service.tv
410 install -m 0644 packaging/bluetooth-frwk-common.service %{buildroot}%{_unitdir}/bluetooth-frwk.service.common
413 install -m 0644 bt-core/bluetooth-frwk-core.service %{buildroot}%{_unitdir}/bluetooth-frwk-core.service
415 ln -s ../bluetooth-frwk.service %{buildroot}%{_unitdir}/multi-user.target.wants/bluetooth-frwk.service
416 ln -s ../bluetooth-frwk.service %{buildroot}%{_unitdir}/starter.target.wants/bluetooth-frwk.service
418 %postun -p /sbin/ldconfig
421 /usr/bin/chsmack -a '_' %{_varlibdir}/bluetooth/auto-pair-blacklist
422 /usr/bin/chown network_fw:network_fw %{_varlibdir}/bluetooth/auto-pair-blacklist
423 /usr/bin/chown network_fw:network_fw %{_meshdir}
426 %manifest %{name}.manifest
428 %defattr(-, root, root)
429 %{_libdir}/libbluetooth-api.so.*
430 %exclude %{_libdir}/libbluetooth-api.so*.emulator
433 %defattr(-, root, root)
434 %{_includedir}/bt-service/bluetooth-api.h
435 %{_includedir}/bt-service/bluetooth-hid-api.h
436 %{_includedir}/bt-service/bluetooth-audio-api.h
437 %{_includedir}/bt-service/bluetooth-telephony-api.h
438 %{_includedir}/bt-service/bluetooth-media-control.h
439 %{_includedir}/bt-service/bluetooth-scmst-api.h
440 %{_includedir}/bt-service/bluetooth-ipsp-api.h
441 %{_includedir}/bt-service/bluetooth-gatt-server-api.h
442 %{_includedir}/bt-service/bluetooth-gatt-client-api.h
443 %{_includedir}/bt-service/bluetooth-mesh-api.h
444 %{_libdir}/pkgconfig/bluetooth-api.pc
445 %{_libdir}/libbluetooth-api.so
448 %ifarch %{ix86} x86_64
449 %post extension-emulator
451 for FILE in libbluetooth-api.so*.emulator; do mv "${FILE}" "${FILE%.emulator}"; done
453 %preun extension-emulator
455 for FILE in libbluetooth-api.so*; do mv "${FILE}" "${FILE}.emulator"; done
457 %files extension-emulator
458 %manifest %{name}.manifest
459 %defattr(-, root, root)
460 %{_libdir}/libbluetooth-api.so.*.emulator
461 %{_libdir}/libbluetooth-api.so.emulator
465 %manifest %{name}.manifest
467 %defattr(-, root, root)
468 %{_bindir}/bt-service
469 %{_sysconfdir}/dbus-1/system.d/bluetooth-frwk-service.conf
470 %{_bindir}/bluetooth-frwk-test
471 %{_varlibdir}/bluetooth
472 %{_prefix}/etc/bluetooth
474 %attr(-,network_fw,network_fw) %{_varlibdir}/bluetooth/auto-pair-blacklist
476 %if %{bt_http_proxy} == ENABLED
478 %manifest %{name}.manifest
480 %defattr(-, root, root)
481 %{_bindir}/bt-httpproxy
482 %{_datadir}/dbus-1/system-services/org.projectx.httpproxy.service
483 %{_sysconfdir}/dbus-1/system.d/bluetooth-frwk-httpproxy.conf
487 %manifest %{name}.manifest
489 %defattr(-, root, root)
491 %{_datadir}/dbus-1/system-services/org.projectx.otp.service
492 %{_sysconfdir}/dbus-1/system.d/bluetooth-frwk-otp.conf
495 %manifest %{name}.manifest
497 %defattr(-, root, root)
498 %{_unitdir}/bluetooth-frwk-core.service
499 %{_datadir}/dbus-1/system-services/org.projectx.bt_core.service
501 %{_sysconfdir}/dbus-1/system.d/bluetooth-frwk-core.conf
502 %{_prefix}/lib/udev/rules.d/99-bluetooth-rfkill.rules
505 %manifest %{name}.manifest
507 %defattr(-, root, root)
508 %{_bindir}/bluetooth-frwk-test
509 #%{_bindir}/bluetooth-gatt-test
510 #%{_bindir}/bluetooth-advertising-test
513 %manifest %{name}.manifest
515 %defattr(-, root, root)
516 %{_libdir}/bt-plugin-headed.so
520 mv bluetooth-frwk.service.common bluetooth-frwk.service
522 %preun profile_common
524 mv bluetooth-frwk.service bluetooth-frwk.service.common
526 %files profile_common
528 %{_unitdir}/multi-user.target.wants/bluetooth-frwk.service
529 %exclude %{_unitdir}/starter.target.wants/bluetooth-frwk.service
530 %{_unitdir}/bluetooth-frwk.service.common
531 %{_datadir}/dbus-1/system-services/org.projectx.bt.service
535 mv bluetooth-frwk.service.mobile bluetooth-frwk.service
537 %preun profile_mobile
539 mv bluetooth-frwk.service bluetooth-frwk.service.mobile
541 %files profile_mobile
543 %{_unitdir}/multi-user.target.wants/bluetooth-frwk.service
544 %{_unitdir}/bluetooth-frwk.service.mobile
545 %{_datadir}/dbus-1/system-services/org.projectx.bt.service
548 %ifarch %{ix86} || %{arm}
551 mv bluetooth-frwk.service.tm1 bluetooth-frwk.service
554 mv bt-core.tm1 bt-core
558 mv bluetooth-frwk.service bluetooth-frwk.service.tm1
561 mv bt-core bt-core.tm1
564 %{_unitdir}/bluetooth-frwk.service.tm1
566 %defattr(-, root, root)
567 %{_bindir}/bt-core.tm1
570 %post profile_wearable
572 mv bluetooth-frwk.service.wearable bluetooth-frwk.service
574 %preun profile_wearable
576 mv bluetooth-frwk.service bluetooth-frwk.service.wearable
578 %files profile_wearable
580 %{_unitdir}/multi-user.target.wants/bluetooth-frwk.service
581 %{_unitdir}/bluetooth-frwk.service.wearable
582 %{_datadir}/dbus-1/system-services/org.projectx.bt.service
586 mv bluetooth-frwk.service.tv bluetooth-frwk.service
590 mv bluetooth-frwk.service bluetooth-frwk.service.tv
594 %{_unitdir}/multi-user.target.wants/bluetooth-frwk.service
595 %{_unitdir}/bluetooth-frwk.service.tv
596 %{_datadir}/dbus-1/system-services/org.projectx.bt.service
598 # Note: ivi reuses bluetooth-frwk.service.wearable
601 mv bluetooth-frwk.service.wearable bluetooth-frwk.service
603 pushd %{_datadir}/dbus-1/system-services
604 mv org.projectx.bt.service.ivi org.projectx.bt.service
608 mv bluetooth-frwk.service bluetooth-frwk.service.wearable
610 pushd %{_datadir}/dbus-1/system-services
611 mv org.projectx.bt.service org.projectx.bt.service.ivi
615 %{_unitdir}/multi-user.target.wants/bluetooth-frwk.service
616 %{_unitdir}/bluetooth-frwk.service.wearable
617 %{_datadir}/dbus-1/system-services/org.projectx.bt.service.ivi
620 %manifest %{name}.manifest
621 %defattr(-, root, root)
622 %{_libdir}/libbt-oal.so*
623 %{_sysconfdir}/dbus-1/system.d/bluetooth-frwk-gap-agent.conf
625 %if %{bt_bluez_hal} == ENABLED
626 %{_libdir}/libbluetooth.default.so*
629 %files -n bluetooth-haltests
630 %manifest %{name}.manifest
631 %{_bindir}/bluetooth-haltests