Merge lp:~fboucault/ubuntu-ui-toolkit/state_saving_store_type into lp:ubuntu-ui-toolkit/staging

Proposed by Florian Boucault
Status: Merged
Approved by: Cris Dywan
Approved revision: 1167
Merged at revision: 1167
Proposed branch: lp:~fboucault/ubuntu-ui-toolkit/state_saving_store_type
Merge into: lp:ubuntu-ui-toolkit/staging
Diff against target: 146 lines (+79/-3)
4 files modified
modules/Ubuntu/Components/plugin/statesaverbackend_p.cpp (+23/-2)
tests/unit_x11/tst_statesaver/SaveEnum.qml (+23/-0)
tests/unit_x11/tst_statesaver/tst_statesaver.cpp (+31/-0)
tests/unit_x11/tst_statesaver/tst_statesaver.pro (+2/-1)
To merge this branch: bzr merge lp:~fboucault/ubuntu-ui-toolkit/state_saving_store_type
Reviewer Review Type Date Requested Status
Cris Dywan Approve
PS Jenkins bot continuous-integration Approve
Tim Peeters Pending
Review via email: mp+228503@code.launchpad.net

Commit message

StateSaver: also save the type of each property along with its value so that we can convert them back to the right type during state restoration.
This makes some problematic cases such as enumeration to work.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:1163
http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-ci/668/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2582
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/2065
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-amd64-ci/500
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-armhf-ci/500
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-armhf-ci/500/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-i386-ci/500
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2720
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3825
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3825/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10534
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1727
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2318
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2318/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-ci/668/rebuild

review: Approve (continuous-integration)
Revision history for this message
Cris Dywan (kalikiana) wrote :

See comments inline.

Question: can this ultimately be addressed in QSettings and could a bug be filed/ added as a comment? Provided it's not a fundamental design problem.

review: Needs Fixing
Revision history for this message
Florian Boucault (fboucault) wrote :

> See comments inline.
>
> Question: can this ultimately be addressed in QSettings and could a bug be
> filed/ added as a comment? Provided it's not a fundamental design problem.

It does sound like QSettings should do a better job. Not sure how to describe it.

Revision history for this message
Cris Dywan (kalikiana) wrote :

Nice. Thanks a lot!

review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:1164
http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-ci/673/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2599
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/2082
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-amd64-ci/505
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-armhf-ci/505
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-armhf-ci/505/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-i386-ci/505
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2733
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3842
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3842/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10553
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1740
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2335
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2335/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-ci/673/rebuild

review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Autolanding.
More details in the following jenkins job:
http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-autolanding/284/
Executed test runs:
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2614/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/2097
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-amd64-autolanding/228
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-armhf-autolanding/228
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-armhf-autolanding/228/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-i386-autolanding/228
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2746/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3857
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3857/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10567
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1751
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2350
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2350/artifact/work/output/*zip*/output.zip

review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:1166
http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-ci/676/
Executed test runs:
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2617/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/2100
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-amd64-ci/508
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-armhf-ci/508
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-armhf-ci/508/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-i386-ci/508
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2749/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3860
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3860/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10571
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1754
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2353
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2353/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-ci/676/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Cris Dywan (kalikiana) wrote :

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/unity8/process_helpers.py", line 123, in restart_unity_with_testability
    return restart_unity(*args)
  File "/usr/lib/python3/dist-packages/unity8/process_helpers.py", line 155, in restart_unity
    pid = _get_unity_pid()
  File "/usr/lib/python3/dist-packages/unity8/process_helpers.py", line 178, in _get_unity_pid
    return int(status.split()[-1])
ValueError: invalid literal for int() with base 10: 'start/running'

1167. By Florian Boucault

Empty commit

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:1167
http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-ci/677/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2641
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/2111
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-amd64-ci/509
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-armhf-ci/509
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-armhf-ci/509/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-utopic-i386-ci/509
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2769
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3884
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3884/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10602
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1765
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2368
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2368/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-sdk-team-ubuntu-ui-toolkit-staging-ci/677/rebuild

review: Approve (continuous-integration)
Revision history for this message
Cris Dywan (kalikiana) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'modules/Ubuntu/Components/plugin/statesaverbackend_p.cpp'
--- modules/Ubuntu/Components/plugin/statesaverbackend_p.cpp 2014-03-17 11:57:53 +0000
+++ modules/Ubuntu/Components/plugin/statesaverbackend_p.cpp 2014-07-29 09:48:52 +0000
@@ -145,8 +145,20 @@
145 }145 }
146 QQmlProperty qmlProperty(item, propertyName.toLocal8Bit().constData(), qmlContext(item));146 QQmlProperty qmlProperty(item, propertyName.toLocal8Bit().constData(), qmlContext(item));
147 if (qmlProperty.isValid() && qmlProperty.isWritable()) {147 if (qmlProperty.isValid() && qmlProperty.isWritable()) {
148 qmlProperty.write(value);148 QVariant type = m_archive.data()->value(propertyName + "_TYPE");
149 result++;149 value.convert(type.toInt());
150 bool writeSuccess = qmlProperty.write(value);
151 if (writeSuccess) {
152 result++;
153 } else {
154 qmlInfo(item) << UbuntuI18n::instance().tr("property \"%1\" of "
155 "object %2 has type %3 and cannot be set to value \"%4\" of"
156 " type %5").arg(propertyName)
157 .arg(qmlContext(item)->nameForObject(item))
158 .arg(qmlProperty.propertyTypeName())
159 .arg(value.toString())
160 .arg(value.typeName());
161 }
150 } else {162 } else {
151 qmlInfo(item) << UbuntuI18n::instance().tr("property \"%1\" does not exist or is not writable for object %2")163 qmlInfo(item) << UbuntuI18n::instance().tr("property \"%1\" does not exist or is not writable for object %2")
152 .arg(propertyName).arg(qmlContext(item)->nameForObject(item));164 .arg(propertyName).arg(qmlContext(item)->nameForObject(item));
@@ -173,6 +185,15 @@
173 QVariant value = qmlProperty.read();185 QVariant value = qmlProperty.read();
174 if (static_cast<QMetaType::Type>(value.type()) != QMetaType::QObjectStar) {186 if (static_cast<QMetaType::Type>(value.type()) != QMetaType::QObjectStar) {
175 m_archive.data()->setValue(propertyName, value);187 m_archive.data()->setValue(propertyName, value);
188 /* Save the type of the property along with its value.
189 * This is important because QSettings deserializes values as QString.
190 * Setting these strings to QML properties usually works because the
191 * implicit type conversion from string to the type of the QML property
192 * usually works. In some cases cases however (e.g. enum) it fails.
193 *
194 * See Qt Bug: https://bugreports.qt-project.org/browse/QTBUG-40474
195 */
196 m_archive.data()->setValue(propertyName + "_TYPE", QVariant::fromValue((int)value.type()));
176 result++;197 result++;
177 }198 }
178 }199 }
179200
=== added file 'tests/unit_x11/tst_statesaver/SaveEnum.qml'
--- tests/unit_x11/tst_statesaver/SaveEnum.qml 1970-01-01 00:00:00 +0000
+++ tests/unit_x11/tst_statesaver/SaveEnum.qml 2014-07-29 09:48:52 +0000
@@ -0,0 +1,23 @@
1/*
2 * Copyright 2014 Canonical Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17import QtQuick 2.0
18import Ubuntu.Components 1.1
19
20Text {
21 id: testItem
22 StateSaver.properties: "horizontalAlignment"
23}
024
=== modified file 'tests/unit_x11/tst_statesaver/tst_statesaver.cpp'
--- tests/unit_x11/tst_statesaver/tst_statesaver.cpp 2014-04-10 09:36:36 +0000
+++ tests/unit_x11/tst_statesaver/tst_statesaver.cpp 2014-07-29 09:48:52 +0000
@@ -36,8 +36,10 @@
36#include <signal.h>36#include <signal.h>
3737
38#define protected public38#define protected public
39#define private public
39#include "ucstatesaver.h"40#include "ucstatesaver.h"
40#include "statesaverbackend_p.h"41#include "statesaverbackend_p.h"
42#undef private
41#undef protected43#undef protected
4244
43class tst_StateSaverTest : public QObject45class tst_StateSaverTest : public QObject
@@ -59,6 +61,8 @@
59 {61 {
60 Q_EMIT StateSaverBackend::instance().initiateStateSaving();62 Q_EMIT StateSaverBackend::instance().initiateStateSaving();
61 view.reset();63 view.reset();
64 // Make sure that the state is reloaded from file
65 StateSaverBackend::instance().m_archive.data()->sync();
62 view.reset(new UbuntuTestCase(file));66 view.reset(new UbuntuTestCase(file));
63 }67 }
6468
@@ -66,6 +70,8 @@
66 {70 {
67 Q_EMIT StateSaverBackend::instance().initiateStateSaving();71 Q_EMIT StateSaverBackend::instance().initiateStateSaving();
68 view.reset();72 view.reset();
73 // Make sure that the state is reloaded from file
74 StateSaverBackend::instance().m_archive.data()->sync();
69 view.reset(createView(file));75 view.reset(createView(file));
70 }76 }
7177
@@ -171,6 +177,31 @@
171 }177 }
172 }178 }
173179
180 void test_SaveEnum()
181 {
182 /* This test is important because when saving the value of an enum
183 * property to QSettings, it is deserialized as a string. Setting that
184 * string value to an enum property fails and therefore the state
185 * restoration does not work.
186 * In most cases implicit type conversion from string to the appropriate
187 * type works.
188 */
189 QScopedPointer<QQuickView> view(createView("SaveEnum.qml"));
190 QVERIFY(view);
191 QObject *testItem = view->rootObject();
192 QVERIFY(testItem);
193
194 testItem->setProperty("horizontalAlignment", Qt::AlignRight);
195
196 resetView(view, "SaveEnum.qml");
197 QVERIFY(view);
198 testItem = view->rootObject();
199 QVERIFY(testItem);
200
201
202 QVERIFY(testItem->property("horizontalAlignment") == Qt::AlignRight);
203 }
204
174 void test_SavePropertyGroup()205 void test_SavePropertyGroup()
175 {206 {
176 QScopedPointer<QQuickView> view(createView("SavePropertyGroups.qml"));207 QScopedPointer<QQuickView> view(createView("SavePropertyGroups.qml"));
177208
=== modified file 'tests/unit_x11/tst_statesaver/tst_statesaver.pro'
--- tests/unit_x11/tst_statesaver/tst_statesaver.pro 2014-02-06 19:16:34 +0000
+++ tests/unit_x11/tst_statesaver/tst_statesaver.pro 2014-07-29 09:48:52 +0000
@@ -26,4 +26,5 @@
26 RepeaterStates.qml \26 RepeaterStates.qml \
27 ListViewItems.qml \27 ListViewItems.qml \
28 GridViewItems.qml \28 GridViewItems.qml \
29 NormalAppClose.qml29 NormalAppClose.qml \
30 SaveEnum.qml

Subscribers

People subscribed via source and target branches