Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  main_test.go   Sprache: unbekannt

 
Spracherkennung für: .go vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

// Copyright 2020 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package main

import (
 "bytes"
 "fmt"
 "reflect"
 "testing"

 "google.golang.org/protobuf/encoding/prototext"

 bp "android/soong/cmd/extract_apks/bundle_proto"
 "android/soong/third_party/zip"
)

type testConfigDesc struct {
 name         string
 targetConfig TargetConfig
 expected     SelectionResult
}

type testDesc struct {
 protoText string
 configs   []testConfigDesc
}

func TestSelectApks_ApkSet(t *testing.T) {
 testCases := []testDesc{
  {
   protoText: `
variant {
  targeting {
    sdk_version_targeting {
      value { min { value: 29 } } } }
  apk_set {
    module_metadata {
      name: "base" targeting {} delivery_type: INSTALL_TIME }
    apk_description {
      targeting {
        screen_density_targeting {
          value { density_alias: LDPI } }
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "splits/base-ldpi.apk"
      split_apk_metadata { split_id: "config.ldpi" } }
    apk_description {
      targeting {
        screen_density_targeting {
          value { density_alias: MDPI } }
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "splits/base-mdpi.apk"
      split_apk_metadata { split_id: "config.mdpi" } }
    apk_description {
      targeting {
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "splits/base-master.apk"
      split_apk_metadata { is_master_split: true } }
    apk_description {
      targeting {
        abi_targeting {
          value { alias: ARMEABI_V7A }
          alternatives { alias: ARM64_V8A }
          alternatives { alias: X86 }
          alternatives { alias: X86_64 } }
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "splits/base-armeabi_v7a.apk"
      split_apk_metadata { split_id: "config.armeabi_v7a" } }
    apk_description {
      targeting {
        abi_targeting {
          value { alias: ARM64_V8A }
          alternatives { alias: ARMEABI_V7A }
          alternatives { alias: X86 }
          alternatives { alias: X86_64 } }
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "splits/base-arm64_v8a.apk"
      split_apk_metadata { split_id: "config.arm64_v8a" } }
    apk_description {
      targeting {
        abi_targeting {
          value { alias: X86 }
          alternatives { alias: ARMEABI_V7A }
          alternatives { alias: ARM64_V8A }
          alternatives { alias: X86_64 } }
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "splits/base-x86.apk"
      split_apk_metadata { split_id: "config.x86" } }
    apk_description {
      targeting {
        abi_targeting {
          value { alias: X86_64 }
          alternatives { alias: ARMEABI_V7A }
          alternatives { alias: ARM64_V8A }
          alternatives { alias: X86 } }
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "splits/base-x86_64.apk"
      split_apk_metadata { split_id: "config.x86_64" } } }
}
bundletool {
  version: "0.10.3" }

`,
   configs: []testConfigDesc{
    {
     name: "one",
     targetConfig: TargetConfig{
      sdkVersion: 29,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_ARMEABI_V7A: 0,
       bp.Abi_ARM64_V8A:   1,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "splits/base-ldpi.apk",
       "splits/base-mdpi.apk",
       "splits/base-master.apk",
       "splits/base-armeabi_v7a.apk",
      },
     },
    },
    {
     name: "two",
     targetConfig: TargetConfig{
      sdkVersion: 29,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_LDPI: true,
      },
      abis: map[bp.Abi_AbiAlias]int{},
     },
     expected: SelectionResult{
      "base",
      []string{
       "splits/base-ldpi.apk",
       "splits/base-master.apk",
      },
     },
    },
    {
     name: "three",
     targetConfig: TargetConfig{
      sdkVersion: 20,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_LDPI: true,
      },
      abis: map[bp.Abi_AbiAlias]int{},
     },
     expected: SelectionResult{
      "",
      nil,
     },
    },
    {
     name: "four",
     targetConfig: TargetConfig{
      sdkVersion: 29,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_MDPI: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_ARM64_V8A:   0,
       bp.Abi_ARMEABI_V7A: 1,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "splits/base-mdpi.apk",
       "splits/base-master.apk",
       "splits/base-arm64_v8a.apk",
      },
     },
    },
   },
  },
  {
   protoText: `
variant {
  targeting {
    sdk_version_targeting {
      value { min { value: 10000 } } } }
  apk_set {
    module_metadata {
      name: "base" targeting {} delivery_type: INSTALL_TIME }
    apk_description {
      targeting {
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "splits/base-master.apk"
      split_apk_metadata { is_master_split: true } } } }`,
   configs: []testConfigDesc{
    {
     name: "Prerelease",
     targetConfig: TargetConfig{
      sdkVersion:       30,
      screenDpi:        map[bp.ScreenDensity_DensityAlias]bool{},
      abis:             map[bp.Abi_AbiAlias]int{},
      allowPrereleased: true,
     },
     expected: SelectionResult{
      "base",
      []string{"splits/base-master.apk"},
     },
    },
   },
  },
  {
   protoText: `
variant {
  targeting {
    sdk_version_targeting {
      value { min { value: 29 } } } }
  apk_set {
    module_metadata {
      name: "base" targeting {} delivery_type: INSTALL_TIME }
    apk_description {
      targeting {}
      path: "universal.apk"
      standalone_apk_metadata { fused_module_name: "base" } } } }`,
   configs: []testConfigDesc{
    {
     name:         "Universal",
     targetConfig: TargetConfig{sdkVersion: 30},
     expected: SelectionResult{
      "base",
      []string{"universal.apk"},
     },
    },
   },
  },
 }
 for _, testCase := range testCases {
  var toc bp.BuildApksResult
  if err := prototext.Unmarshal([]byte(testCase.protoText), &toc); err != nil {
   t.Fatal(err)
  }
  for _, config := range testCase.configs {
   actual := selectApks(&toc, config.targetConfig)
   if !reflect.DeepEqual(config.expected, actual) {
    t.Errorf("%s: expected %v, got %v", config.name, config.expected, actual)
   }
  }
 }
}

func TestSelectApks_ApexSet(t *testing.T) {
 testCases := []testDesc{
  {
   protoText: `
variant {
  targeting {
    sdk_version_targeting {
      value { min { value: 29 } } } }
  apk_set {
    module_metadata {
      name: "base" targeting {} delivery_type: INSTALL_TIME }
    apk_description {
      targeting {
        multi_abi_targeting {
          value { abi { alias: ARMEABI_V7A } }
          alternatives { abi { alias: ARM64_V8A } }
          alternatives { abi { alias: X86 } }
          alternatives { abi { alias: X86_64 } } }
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "standalones/standalone-armeabi_v7a.apex"
      apex_apk_metadata { } }
    apk_description {
      targeting {
        multi_abi_targeting {
          value { abi { alias: ARM64_V8A } }
          alternatives { abi { alias: ARMEABI_V7A } }
          alternatives { abi { alias: X86 } }
          alternatives { abi { alias: X86_64 } } }
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "standalones/standalone-arm64_v8a.apex"
      apex_apk_metadata { } }
    apk_description {
      targeting {
        multi_abi_targeting {
          value { abi { alias: X86 } }
          alternatives { abi { alias: ARMEABI_V7A } }
          alternatives { abi { alias: ARM64_V8A } }
          alternatives { abi { alias: X86_64 } } }
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "standalones/standalone-x86.apex"
      apex_apk_metadata { } }
    apk_description {
      targeting {
        multi_abi_targeting {
          value { abi { alias: X86_64 } }
          alternatives { abi { alias: ARMEABI_V7A } }
          alternatives { abi { alias: ARM64_V8A } }
          alternatives { abi { alias: X86 } } }
        sdk_version_targeting {
          value { min { value: 21 } } } }
      path: "standalones/standalone-x86_64.apex"
      apex_apk_metadata { } } }
}
bundletool {
  version: "0.10.3" }

`,
   configs: []testConfigDesc{
    {
     name: "order matches priorities",
     targetConfig: TargetConfig{
      sdkVersion: 29,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_ARM64_V8A:   0,
       bp.Abi_ARMEABI_V7A: 1,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-arm64_v8a.apex",
      },
     },
    },
    {
     name: "order doesn't match priorities",
     targetConfig: TargetConfig{
      sdkVersion: 29,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_ARMEABI_V7A: 0,
       bp.Abi_ARM64_V8A:   1,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-arm64_v8a.apex",
      },
     },
    },
    {
     name: "single choice",
     targetConfig: TargetConfig{
      sdkVersion: 29,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_ARMEABI_V7A: 0,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-armeabi_v7a.apex",
      },
     },
    },
    {
     name: "cross platform",
     targetConfig: TargetConfig{
      sdkVersion: 29,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_ARM64_V8A: 0,
       bp.Abi_MIPS64:    1,
       bp.Abi_X86:       2,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-x86.apex",
      },
     },
    },
   },
  },
 }
 for _, testCase := range testCases {
  var toc bp.BuildApksResult
  if err := prototext.Unmarshal([]byte(testCase.protoText), &toc); err != nil {
   t.Fatal(err)
  }
  for _, config := range testCase.configs {
   actual := selectApks(&toc, config.targetConfig)
   if !reflect.DeepEqual(config.expected, actual) {
    t.Errorf("%s: expected %v, got %v", config.name, config.expected, actual)
   }
  }
 }
}

func TestSelectApks_ApexSet_Variants(t *testing.T) {
 testCases := []testDesc{
  {
   protoText: `
variant {
 targeting {
  sdk_version_targeting {value {min {value: 29}}}
  multi_abi_targeting {
   value {abi {alias: ARMEABI_V7A}}
   alternatives {
    abi {alias: ARMEABI_V7A}
    abi {alias: ARM64_V8A}
   }
   alternatives {abi {alias: ARM64_V8A}}
   alternatives {abi {alias: X86}}
   alternatives {
    abi {alias: X86}
    abi {alias: X86_64}
   }
  }
 }
 apk_set {
  module_metadata {
   name: "base"
   delivery_type: INSTALL_TIME
  }
  apk_description {
   targeting {
    multi_abi_targeting {
     value {abi {alias: ARMEABI_V7A}}
     alternatives {
      abi {alias: ARMEABI_V7A}
      abi {alias: ARM64_V8A}
     }
     alternatives {abi {alias: ARM64_V8A}}
     alternatives {abi {alias: X86}}
     alternatives {
      abi {alias: X86}
      abi {alias: X86_64}
     }
    }
   }
   path: "standalones/standalone-armeabi_v7a.apex"
  }
 }
 variant_number: 0
}
variant {
 targeting {
  sdk_version_targeting {value {min {value: 29}}}
  multi_abi_targeting {
   value {abi {alias: ARM64_V8A}}
   alternatives {abi {alias: ARMEABI_V7A}}
   alternatives {
    abi {alias: ARMEABI_V7A}
    abi {alias: ARM64_V8A}
   }
   alternatives {abi {alias: X86}}
   alternatives {
    abi {alias: X86}
    abi {alias: X86_64}
   }
  }
 }
 apk_set {
  module_metadata {
   name: "base"
   delivery_type: INSTALL_TIME
  }
  apk_description {
   targeting {
    multi_abi_targeting {
     value {abi {alias: ARM64_V8A}}
     alternatives {abi {alias: ARMEABI_V7A}}
     alternatives {
      abi {alias: ARMEABI_V7A}
      abi {alias: ARM64_V8A}
     }
     alternatives {abi {alias: X86}}
     alternatives {
      abi {alias: X86}
      abi {alias: X86_64}
     }
    }
   }
   path: "standalones/standalone-arm64_v8a.apex"
  }
 }
 variant_number: 1
}
variant {
 targeting {
  sdk_version_targeting {value {min {value: 29}}}
  multi_abi_targeting {
   value {
    abi {alias: ARMEABI_V7A}
    abi {alias: ARM64_V8A}
   }
   alternatives {abi {alias: ARMEABI_V7A}}
   alternatives {abi {alias: ARM64_V8A}}
   alternatives {abi {alias: X86}}
   alternatives {
    abi {alias: X86}
    abi {alias: X86_64}
   }
  }
 }
 apk_set {
  module_metadata {
   name: "base"
   delivery_type: INSTALL_TIME
  }
  apk_description {
   targeting {
    multi_abi_targeting {
     value {
      abi {alias: ARMEABI_V7A}
      abi {alias: ARM64_V8A}
     }
     alternatives {abi {alias: ARMEABI_V7A}}
     alternatives {abi {alias: ARM64_V8A}}
     alternatives {abi {alias: X86}}
     alternatives {
      abi {alias: X86}
      abi {alias: X86_64}
     }
    }
   }
   path: "standalones/standalone-armeabi_v7a.arm64_v8a.apex"
  }
 }
 variant_number: 2
}
variant {
 targeting {
  sdk_version_targeting {value {min {value: 29}}}
  multi_abi_targeting {
   value {abi {alias: X86}}
   alternatives {abi {alias: ARMEABI_V7A}}
   alternatives {
    abi {alias: ARMEABI_V7A}
    abi {alias: ARM64_V8A}
   }
   alternatives {abi {alias: ARM64_V8A}}
   alternatives {
    abi {alias: X86}
    abi {alias: X86_64}
   }
  }
 }
 apk_set {
  module_metadata {
   name: "base"
   delivery_type: INSTALL_TIME
  }
  apk_description {
   targeting {
    multi_abi_targeting {
     value {abi {alias: X86}}
     alternatives {abi {alias: ARMEABI_V7A}}
     alternatives {
      abi {alias: ARMEABI_V7A}
      abi {alias: ARM64_V8A}
     }
     alternatives {abi {alias: ARM64_V8A}}
     alternatives {
      abi {alias: X86}
      abi {alias: X86_64}
     }
    }
   }
   path: "standalones/standalone-x86.apex"
  }
 }
 variant_number: 3
}
variant {
 targeting {
  sdk_version_targeting {value {min {value: 29}}}
  multi_abi_targeting {
   value {
    abi {alias: X86}
    abi {alias: X86_64}
   }
   alternatives {abi {alias: ARMEABI_V7A}}
   alternatives {
    abi {alias: ARMEABI_V7A}
    abi {alias: ARM64_V8A}
   }
   alternatives {abi {alias: ARM64_V8A}}
   alternatives {abi {alias: X86}}
  }
 }
 apk_set {
  module_metadata {
   name: "base"
   delivery_type: INSTALL_TIME
  }
  apk_description {
   targeting {
    multi_abi_targeting {
     value {
      abi {alias: X86}
      abi {alias: X86_64}
     }
     alternatives {abi {alias: ARMEABI_V7A}}
     alternatives {
      abi {alias: ARMEABI_V7A}
      abi {alias: ARM64_V8A}
     }
     alternatives {abi {alias: ARM64_V8A}}
     alternatives {abi {alias: X86}}
    }
   }
   path: "standalones/standalone-x86.x86_64.apex"
  }
  }
  variant_number: 4
}
`,
   configs: []testConfigDesc{
    {
     name: "multi-variant multi-target ARM",
     targetConfig: TargetConfig{
      sdkVersion: 33,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_ARM64_V8A:   0,
       bp.Abi_ARMEABI_V7A: 1,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-armeabi_v7a.arm64_v8a.apex",
      },
     },
    },
    {
     name: "multi-variant single-target arm",
     targetConfig: TargetConfig{
      sdkVersion: 33,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_ARMEABI_V7A: 0,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-armeabi_v7a.apex",
      },
     },
    },
    {
     name: "multi-variant single-target arm64",
     targetConfig: TargetConfig{
      sdkVersion: 33,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_ARM64_V8A: 0,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-arm64_v8a.apex",
      },
     },
    },
    {
     name: "multi-variant multi-target x86",
     targetConfig: TargetConfig{
      sdkVersion: 33,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_X86:    0,
       bp.Abi_X86_64: 1,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-x86.x86_64.apex",
      },
     },
    },
    {
     name: "multi-variant single-target x86",
     targetConfig: TargetConfig{
      sdkVersion: 33,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_X86: 0,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-x86.apex",
      },
     },
    },
    {
     name: "multi-variant single-target x86_64",
     targetConfig: TargetConfig{
      sdkVersion: 33,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_X86_64: 0,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-x86.x86_64.apex",
      }},
    },
    {
     name: "multi-variant multi-target cross-target",
     targetConfig: TargetConfig{
      sdkVersion: 33,
      screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
       bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
      },
      abis: map[bp.Abi_AbiAlias]int{
       bp.Abi_ARM64_V8A: 0,
       bp.Abi_X86_64:    1,
      },
     },
     expected: SelectionResult{
      "base",
      []string{
       "standalones/standalone-arm64_v8a.apex",
      },
     },
    },
   },
  },
 }
 for _, testCase := range testCases {
  var toc bp.BuildApksResult
  if err := prototext.Unmarshal([]byte(testCase.protoText), &toc); err != nil {
   t.Fatal(err)
  }
  for _, config := range testCase.configs {
   t.Run(config.name, func(t *testing.T) {
    actual := selectApks(&toc, config.targetConfig)
    if !reflect.DeepEqual(config.expected, actual) {
     t.Errorf("expected %v, got %v", config.expected, actual)
    }
   })
  }
 }
}

type testZip2ZipWriter struct {
 entries map[string]string
}

func (w testZip2ZipWriter) CopyFrom(file *zip.File, out string) error {
 if x, ok := w.entries[out]; ok {
  return fmt.Errorf("%s and %s both write to %s", x, file.Name, out)
 }
 w.entries[out] = file.Name
 return nil
}

type testCaseWriteApks struct {
 name       string
 moduleName string
 stem       string
 partition  string
 // what we write from what
 zipEntries       map[string]string
 expectedApkcerts []string
}

func TestWriteApks(t *testing.T) {
 testCases := []testCaseWriteApks{
  {
   name:       "splits",
   moduleName: "mybase",
   stem:       "Foo",
   partition:  "system",
   zipEntries: map[string]string{
    "Foo.apk":       "splits/mybase-master.apk",
    "Foo-xhdpi.apk": "splits/mybase-xhdpi.apk",
   },
   expectedApkcerts: []string{
    `name="Foo-xhdpi.apk" certificate="PRESIGNED" private_key="" partition="system"`,
    `name="Foo.apk" certificate="PRESIGNED" private_key="" partition="system"`,
   },
  },
  {
   name:       "universal",
   moduleName: "base",
   stem:       "Bar",
   partition:  "product",
   zipEntries: map[string]string{
    "Bar.apk": "universal.apk",
   },
   expectedApkcerts: []string{
    `name="Bar.apk" certificate="PRESIGNED" private_key="" partition="product"`,
   },
  },
 }
 for _, testCase := range testCases {
  t.Run(testCase.name, func(t *testing.T) {
   testZipBuf := &bytes.Buffer{}
   testZip := zip.NewWriter(testZipBuf)
   for _, in := range testCase.zipEntries {
    f, _ := testZip.Create(in)
    f.Write([]byte(in))
   }
   testZip.Close()

   zipReader, _ := zip.NewReader(bytes.NewReader(testZipBuf.Bytes()), int64(testZipBuf.Len()))

   apkSet := ApkSet{entries: make(map[string]*zip.File)}
   sel := SelectionResult{moduleName: testCase.moduleName}
   for _, f := range zipReader.File {
    apkSet.entries[f.Name] = f
    sel.entries = append(sel.entries, f.Name)
   }

   zipWriter := testZip2ZipWriter{make(map[string]string)}
   outWriter := &bytes.Buffer{}
   config := TargetConfig{stem: testCase.stem}
   apkcerts, err := apkSet.writeApks(sel, config, outWriter, zipWriter, testCase.partition)
   if err != nil {
    t.Error(err)
   }
   expectedZipEntries := make(map[string]string)
   for k, v := range testCase.zipEntries {
    if k != testCase.stem+".apk" {
     expectedZipEntries[k] = v
    }
   }
   if !reflect.DeepEqual(expectedZipEntries, zipWriter.entries) {
    t.Errorf("expected zip entries %v, got %v", testCase.zipEntries, zipWriter.entries)
   }
   if !reflect.DeepEqual(testCase.expectedApkcerts, apkcerts) {
    t.Errorf("expected apkcerts %v, got %v", testCase.expectedApkcerts, apkcerts)
   }
   if g, w := outWriter.String(), testCase.zipEntries[testCase.stem+".apk"]; !reflect.DeepEqual(g, w) {
    t.Errorf("expected output file contents %q, got %q", testCase.stem+".apk", outWriter.String())
   }
  })
 }
}

[Diese Firma untersucht Systeme, entwickelt Software und berät Organisationen zu Themen der Informationstechnolgie. Dabei wird Wert auf anerkannte Normen und Standards gelegt. Die Qualität eigener und fremder Produkte ist Leitlinie und Ziel zugleich. Unter bestimmten Bedingungen finden Sie hier weiterführende Anregungen.0.32Die F&E-Firma in NorddeutschlandÜbersetzung europäischer Sprachen durch Browser2026-06-28]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Statistik
#Sources=277311
#Domains=752002