1fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov/*
2fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov * Copyright (C) 2016 The Android Open Source Project
3fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov *
4fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov * Licensed under the Apache License, Version 2.0 (the "License");
5fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov * you may not use this file except in compliance with the License.
6fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov * You may obtain a copy of the License at
7fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov *
8fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov *      http://www.apache.org/licenses/LICENSE-2.0
9fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov *
10fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov * Unless required by applicable law or agreed to in writing, software
11fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov * distributed under the License is distributed on an "AS IS" BASIS,
12fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov * See the License for the specific language governing permissions and
14fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov * limitations under the License
15fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov */
16fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
17fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovpackage com.android.server.pm;
18fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
19fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovimport android.content.pm.PackageParser;
20fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovimport android.support.test.runner.AndroidJUnit4;
21fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovimport android.util.Log;
22fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
23fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovimport junit.framework.Assert;
24fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
25fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovimport org.junit.Before;
26fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovimport org.junit.Test;
27fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovimport org.junit.runner.RunWith;
28fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
29fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovimport java.io.File;
30fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovimport java.util.HashSet;
31fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovimport java.util.Set;
32fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
33fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov/**
34fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov * Tests for {@link ParallelPackageParser}
35fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov */
36fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov@RunWith(AndroidJUnit4.class)
37fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolovpublic class ParallelPackageParserTest {
38fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov    private static final String TAG = ParallelPackageParserTest.class.getSimpleName();
39fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
40fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov    private ParallelPackageParser mParser;
41fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
42fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov    @Before
43fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov    public void setUp() {
44fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        mParser = new TestParallelPackageParser();
45fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov    }
46fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
47fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov    @Test(timeout = 1000)
48fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov    public void test() {
49fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        Set<File> submittedFiles = new HashSet<>();
50fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        int fileCount = 15;
51fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        for (int i = 0; i < fileCount; i++) {
52fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            File file = new File("f" + i);
53fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            mParser.submit(file, 0);
54fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            submittedFiles.add(file);
55fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            Log.d(TAG, "submitting " + file);
56fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        }
57fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        for (int i = 0; i < fileCount; i++) {
58fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            ParallelPackageParser.ParseResult result = mParser.take();
59fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            Assert.assertNotNull(result);
60fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            File parsedFile = result.scanFile;
61fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            Log.d(TAG, "took " + parsedFile);
62fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            Assert.assertNotNull(parsedFile);
63fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            boolean removeSuccessful = submittedFiles.remove(parsedFile);
64fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            Assert.assertTrue("Unexpected file " + parsedFile + ". Expected submitted files: "
65fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov                    + submittedFiles, removeSuccessful);
66fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        }
67fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov    }
68fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
69fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov    class TestParallelPackageParser extends ParallelPackageParser {
70fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
71fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        TestParallelPackageParser() {
72cd154e95353e7af11314d2339500d6c7f85e181aDianne Hackborn            super(null, false, null, null, null);
73fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        }
74fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov
75fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        @Override
76fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        protected PackageParser.Package parsePackage(PackageParser packageParser, File scanFile,
77fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov                int parseFlags) throws PackageParser.PackageParserException {
78fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            // Do not actually parse the package for testing
79fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov            return null;
80fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov        }
81fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov    }
82fd6f4fb264d56726cd0e2fed731ad60bbe4aa06fFyodor Kupolov}
83